この記事では、単一アカウントのパブリック クライアント アプリと複数のアカウントのパブリック クライアント アプリで使用される種類について、単一アカウントのパブリック クライアント アプリに焦点を当てて理解するのに役立ちます。
Azure Active Directory認証ライブラリ (ADAL) は、サーバーをモデル化します。 代わりに、Microsoft Authentication Library (MSAL) によってクライアント アプリケーションがモデル化されます。 Android アプリの大部分は、パブリック クライアントと見なされます。 パブリック クライアントは、シークレットを安全に保持できないアプリです。
MSAL は、一度に 1 つのアカウントのみを使用できるアプリの開発エクスペリエンスを簡略化し、明確にするために、 PublicClientApplication の API サーフェスを専門としています。
PublicClientApplication は、 SingleAccountPublicClientApplication と MultipleAccountPublicClientApplicationによってサブクラス化されます。 次の図は、これらのクラス間の関係を示しています。
単一アカウントのパブリック クライアント アプリケーション
SingleAccountPublicClientApplication クラスを使用すると、一度に 1 つのアカウントのみをサインインできるようにする MSAL ベースのアプリを作成できます。
SingleAccountPublicClientApplication は、次の点で PublicClientApplication とは異なります。
- MSAL は、現在サインインしているアカウントを追跡します。
- アプリがブローカー (Microsoft Entra アプリ登録時の既定値) を使用していて、ブローカーが存在するデバイスにインストールされている場合、MSAL はアカウントがデバイスで引き続き使用できるかどうかを確認します。
-
signInでは、スコープの要求とは別に、アカウントを明示的にサインインすることができます。 -
acquireTokenSilentでは、アカウント パラメーターは必要ありません。 アカウントを指定し、指定したアカウントが MSAL によって追跡されている現在のアカウントと一致しない場合は、MsalClientExceptionがスローされます。 -
acquireTokenでは、ユーザーがアカウントを切り替えることはできません。 ユーザーが別のアカウントに切り替えようとすると、例外がスローされます。 -
getCurrentAccountは、次を提供する結果オブジェクトを返します。- アカウントが変更されたかどうかを示すブール値。 たとえば、デバイスから削除された結果、アカウントが変更される場合があります。
- 前のアカウント。 これは、アカウントがデバイスから削除されたとき、または新しいアカウントがサインインしたときに、ローカル データのクリーンアップを行う必要がある場合に便利です。
- 現在のアカウント。
-
signOutは、クライアントに関連付けられているトークンをデバイスから削除します。
Microsoft Authenticator、Windowsへのリンク (LTW)、Intune ポータル サイトなどの Android 認証ブローカーがデバイスにインストールされていて、ブローカーを使用するようにアプリが構成されている場合、signOutはデバイスからアカウントを削除しません。
単一アカウントのシナリオ
次の擬似コードは、 SingleAccountPublicClientApplicationの使用を示しています。
// Construct Single Account Public Client Application
ISingleAccountPublicClientApplication app = PublicClientApplication.createSingleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);
String[] scopes = {"User.Read"};
IAccount mAccount = null;
// Acquire a token interactively
// The user will get a UI prompt before getting the token.
SignInParameters signInParameters = SignInParameters.builder()
.withActivity(getActivity()) // Pass the current activity
.withScopes(scopes) // Specify the scopes
.withCallback(new AuthenticationCallback() {
@Override
public void onSuccess(IAuthenticationResult authenticationResult){
mAccount = authenticationResult.getAccount();
}
@Override
public void onError(MsalException exception){
}
@Override
public void onCancel(){
}
})
.build();
app.signIn(signInParameters);
// Load Account Specific Data
getDataForAccount(account);
// Get Current Account
ICurrentAccountResult currentAccountResult = app.getCurrentAccount();
if (currentAccountResult.didAccountChange()){
// Account Changed Clear existing account data
clearDataForAccount(currentAccountResult.getPriorAccount());
mAccount = currentAccountResult.getCurrentAccount();
if (account != null){
//load data for new account
getDataForAccount(account);
}
}
// Sign out
if (app.signOut()) {
clearDataForAccount(mAccount);
mAccount = null;
}
複数アカウントのパブリック クライアント アプリケーション
MultipleAccountPublicClientApplication クラスは、複数のアカウントを同時にサインインできるようにする MSAL ベースのアプリを作成するために使用されます。 これにより、次のようにアカウントを取得、追加、削除できます。
[アカウントの追加]
アプリケーションで 1 つ以上のアカウントを使用するには、 acquireToken 1 回以上呼び出します。
アカウントを取得する
-
getAccountを呼び出して、特定のアカウントを取得します。 -
getAccounts呼び出して、アプリに現在認識されているアカウントの一覧を取得します。
アプリは、ブローカー アプリに認識されているデバイス上のすべてのMicrosoft ID プラットフォーム アカウントを列挙することはできません。 アプリで使用されているアカウントのみを列挙できます。 デバイスから削除されたアカウントは、これらの関数によって返されません。
アカウントを削除する
アカウント識別子を使用して removeAccount を呼び出して、アカウントを削除します。
アプリがブローカーを使用するように構成されていて、ブローカーがデバイスにインストールされている場合、 removeAccountを呼び出しても、アカウントはブローカーから削除されません。 クライアントに関連付けられているトークンのみが削除されます。
複数アカウントのシナリオ
次の擬似コードは、複数のアカウント アプリを作成し、デバイス上のアカウントを一覧表示し、トークンを取得する方法を示しています。
// Construct Multiple Account Public Client Application
IMultipleAccountPublicClientApplication app = PublicClientApplication.createMultipleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);
String[] scopes = {"User.Read"};
IAccount mAccount = null;
// Acquire a token interactively
// The user will be required to interact with a UI to obtain a token
AcquireTokenParameters acquireTokenParameters = new AcquireTokenParameters.Builder()
.startAuthorizationFromActivity(getActivity())
.withScopes(scopes)
.withCallback(new AuthenticationCallback(){
@Override
public void onSuccess(IAuthenticationResult authenticationResult) {
mAccount = authenticationResult.getAccount();
}
@Override
public void onError(MsalException exception){
}
@Override
public void onCancel(){
}
})
.build();
app.acquireToken(acquireTokenParameters);
...
// Get the default authority
String authority = app.getConfiguration().getDefaultAuthority().getAuthorityURL().toString();
// Get a list of accounts on the device
List<IAccount> accounts = app.getAccounts();
// Pick an account to obtain a token from without prompting the user to sign in
IAccount selectedAccount = accounts.get(0);
// Get a token without prompting the user
AcquireTokenSilentParameters acquireTokenSilentParameters = new AcquireTokenSilentParameters.Builder()
.withScopes(scopes)
.forAccount(selectedAccount)
.fromAuthority(authority)
.withCallback(new SilentAuthenticationCallback() {
@Override
public void onSuccess(IAuthenticationResult authenticationResult) {
mAccount = authenticationResult.getAccount();
}
@Override
public void onError(MsalException exception){
}
})
.build();
app.acquireTokenSilentAsync(acquireTokenSilentParameters);