次の方法で共有


チュートリアル: Android アプリケーションに共有デバイス モードのサポートを追加する

このチュートリアルでは、Android 用 Microsoft Authentication Library (MSAL) を使用して Android アプリケーションに共有デバイス モードのサポートを追加する方法について、Android 開発者向けに説明します。

このチュートリアルの内容:

  • 既存の Android アプリケーション プロジェクトを作成または変更します。
  • 共有デバイス モードを有効にして検出する
  • アカウント モードが単一か複数かを検出する
  • ユーザー スイッチを検出する
  • グローバル サインインとサインアウトを有効にする

既存の Android アプリケーションを作成または変更する

このチュートリアルの残りの部分を完了するには、新しい Android アプリケーションを作成するか、既存の Android アプリケーションを変更する必要があります。 まだ行っていない場合は、MSAL を自分の Android アプリに統合する方法、ユーザーをサインインさせる方法、Microsoft Graph を呼び出す方法、ユーザーをサインアウトさせる方法について、「Android 向けの MSAL チュートリアル」を参照してください。 完成したコード サンプルを学習およびテスト用に使用したい場合は、GitHub から サンプル アプリケーション を複製してください。 このサンプルは、単一または複数アカウント モード で動作できます。

ローカルの Maven リポジトリに MSAL SDK を追加する

サンプル アプリを使用していない場合は、次のように MSAL ライブラリを依存関係として自分の build.gradle ファイルに追加します:

dependencies{
  implementation 'com.microsoft.identity.client.msal:4.9.+'
}

単一アカウント モードのサポートを追加する

Microsoft Authentication Library (MSAL) SDK を使用して記述されたアプリケーションは、単一のアカウントまたは複数のアカウントを管理できます。 詳細については、「単一アカウント モードまたは複数アカウント モード」を参照してください。

お使いのアプリで使用できる Microsoft ID プラットフォーム機能は、アプリケーションが単一アカウント モードと複数アカウント モードのどちらで実行されているかによって異なります。

共有デバイス モード アプリは、単一アカウント モードでのみ動作します

重要

複数アカウント モードのみをサポートするアプリケーションは、共有デバイス上で実行できません。 従業員が、単一アカウント モードをサポートしていないアプリを読み込んだ場合、そのアプリは共有デバイス上で実行されません。

MSAL SDK がリリースされる前に記述されたアプリは複数アカウント モードで実行されるため、共有モード デバイス上で実行するには、単一アカウント モードをサポートするように更新しておく必要があります。 単一アカウントと複数アカウントの両方のサポート

アプリは、個人デバイスと共有デバイスの両方での実行をサポートするように構築できます。 現在、アプリが複数のアカウントをサポートしており、共有デバイス モードをサポートするようにしたい場合は、単一アカウント モードのサポートを追加してください。

アプリで実行されているデバイスの種類に応じて、アプリがその動作を変更するようにもできます。 いつ単一アカウント モードで実行するかを決定するには、ISingleAccountPublicClientApplication.isSharedDevice() を使用します。

アプリケーションが動作しているデバイスの種類を表す 2 つの異なるインターフェイスが存在します。 MSAL のアプリケーション ファクトリにアプリケーション インスタンスを要求すると、適切なアプリケーション オブジェクトが自動的に提供されます。

次のオブジェクト モデルは、受信する可能性のあるオブジェクトの型と、それが共有デバイスのコンテキストで何を示すかを示しています。

パブリック クライアント アプリケーションの継承モデルの図。

PublicClientApplication オブジェクトを取得したら、型のチェックを行い、適切なインターフェイスにキャストする必要があります。 次のコードは、複数アカウント モードまたは単一アカウント モードをチェックし、アプリケーション オブジェクトを適切にキャストします:

private IPublicClientApplication mApplication;

        // Running in personal-device mode?
        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        // Running in shared-device mode?
        } else if (mApplication instanceOf ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

アプリが共有デバイスまたは個人デバイスのどちらで実行されているかに応じて、次の違いが適用されます:

共有モード デバイス 個人デバイス
アカウント 単一のアカウント 複数のアカウント
サインイン グローバル グローバル
サインアウト グローバル 各アプリケーションは、サインアウトがアプリに対してローカルかどうかを制御できます。
サポートされているアカウントの種類 業務用アカウントのみ サポートされている個人アカウントと業務用アカウント

共有デバイス モードを使用するようアプリを構成する

構成ファイルの設定の詳細については、「構成に関するドキュメント」を参照してください。

ご自分の MSAL 構成ファイルで "shared_device_mode_supported"true に設定します。

複数アカウント モードのサポートを計画していない場合もあります。 共有デバイスを使用しておらず、ユーザーが同時に複数のアカウントを使用してアプリにサインインできる場合がこれに該当します。 その場合は、"account_mode""SINGLE" に設定します。 これにより、アプリが常に ISingleAccountPublicClientApplication を取得するようになり、MSAL の統合が大幅に簡素化されます。 "account_mode" の既定値は "MULTIPLE" であるため、"single account" モードを使用する場合は、構成ファイルでこの値を変更することが重要です。

サンプル アプリの app>main>res>raw ディレクトリに含まれている auth_config.json ファイルの例を次に示します。

{
  "client_id": "Client ID after app registration at https://aka.ms/MobileAppReg",
  "authorization_user_agent": "DEFAULT",
  "redirect_uri": "Redirect URI after app registration at https://aka.ms/MobileAppReg",
  "account_mode": "SINGLE",
  "broker_redirect_uri_registered": true,
  "shared_device_mode_supported": true,
  "authorities": [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

共有デバイス モードを検出する

共有デバイス モードを使用すると、複数の従業員で共有できるように Android デバイスを構成しながら、Microsoft ID に基づくデバイス管理を実現できます。 従業員は自分のデバイスにサインインし、顧客情報にすばやくアクセスできます。 シフトやタスクが終了した従業員は共有デバイスのすべてのアプリからシングルクリックでサインアウトでき、そのデバイスは次の従業員がすぐに使用できるようになります。

isSharedDevice() を使用すると、アプリが共有デバイス モードのデバイスで実行されているかどうかを特定できます。 お客様のアプリでは、このフラグを使用して、適宜 UX を変更する必要があるかどうかを特定できます。

次のコード スニペットは isSharedDevice() の使用方法を示しています。 これは、サンプル アプリの SingleAccountModeFragment クラスに含まれています:

deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");

PublicClientApplication オブジェクトを初期化する

MSAL 構成ファイルで "account_mode":"SINGLE" を設定した場合、返されるアプリケーション オブジェクトを ISingleAccountPublicCLientApplication として安全にキャストできます。

private ISingleAccountPublicClientApplication mSingleAccountApp;

/*Configure your sample app and save state for this activity*/
PublicClientApplication.create(this.getApplicationCOntext(),
  R.raw.auth_config,
  new PublicClientApplication.ApplicationCreatedListener(){
  @Override
  public void onCreated(IPublicClientApplication application){
  mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
  loadAccount();
  }
  @Override
  public void onError(MsalException exception){
  /*Fail to initialize PublicClientApplication */
  }
});

アカウント モードが単一か複数かを検出する

共有デバイス上でフロントライン ワーカーのみが使用するアプリを作成している場合は、単一アカウント モードのみをサポートするようにアプリを作成することをお勧めします。 これには、診療記録アプリ、請求書アプリ、大部分の基幹業務アプリなどの、タスクに重点を置いたほとんどのアプリケーションが含まれます。 これにより、SDK の多くの機能に対応する必要がなくなるため、開発が簡単になります。

アプリで複数アカウントと共有デバイス モードがサポートされている場合は、次に示すように、種類のチェックを実行して適切なインターフェイスにキャストする必要があります。

private IPublicClientApplication mApplication;

        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        } else if (mApplication instanceOf    ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

サインインしているユーザーを取得し、デバイスでユーザーが変更されたかどうかを特定する

loadAccount メソッドでは、サインインしているユーザーのアカウントを取得します。 onAccountChanged メソッドでは、サインインしているユーザーが変更されたかどうかを特定し、その場合はクリーンアップします:

private void loadAccount()
{
  mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
  {
    @Override
    public void onAccountLoaded(@Nullable IAccount activeAccount)
    {
      if (activeAccount != null)
      {
        signedInUser = activeAccount;
        mSingleAccountApp.acquireTokenSilentAsync(SCOPES,"http://login.microsoftonline.com/common",getAuthSilentCallback());
      }
    }
    @Override
    public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
    {
      if (currentAccount == null)
      {
        //Perform a cleanup task as the signed-in account changed.
        updateSingedOutUI();
      }
    }
    @Override
    public void onError(@NonNull Exception exception)
    {
    }
  }
}

ユーザーをグローバルにサインインさせる

Authenticator アプリを使用し、デバイス全体でユーザーを MSAL が使用される別のアプリにサインインさせるには、次のようにします:

private void onSignInClicked()
{
  mSingleAccountApp.signIn(getActivity(), SCOPES, null, getAuthInteractiveCallback());
}

ユーザーをグローバルにサインアウトさせる

サインインしているアカウントを削除し、キャッシュされているトークンをアプリだけでなく共有デバイス モードのデバイスからもクリアするには、次のようにします:

private void onSignOutClicked()
{
  mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback()
  {
    @Override
    public void onSignOut()
    {
      updateSignedOutUI();
    }
    @Override
    public void onError(@NonNull MsalException exception)
    {
      /*failed to remove account with an exception*/
    }
  });
}

ブロードキャストを受信して、他のアプリケーションから開始されたグローバル サインアウトを検出する

アカウント変更ブロードキャストを受信するには、ブロードキャスト レシーバーを登録する必要があります。 コンテキスト登録されたレシーバー を介してブロードキャスト レシーバーを登録することをお勧めします。

アカウント変更ブロードキャストを受信したら、すぐにサインインしているユーザーを取得し、デバイスでユーザーが変更されたかどうかを判断します。 変更が検出された場合は、前にサインインしていたアカウントのデータのクリーンアップを開始します。 すべての操作を適切に停止し、データのクリーンアップを行うことをお勧めします。

次のコード スニペットは、ブロードキャスト レシーバーを登録する方法を示しています。

private static final String CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER = "com.microsoft.identity.client.sharedmode.CURRENT_ACCOUNT_CHANGED";
private BroadcastReceiver mAccountChangedBroadcastReceiver;
private void registerAccountChangeBroadcastReceiver(){
    mAccountChangedBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //INVOKE YOUR PRIOR ACCOUNT CLEAN UP LOGIC HERE
        }
    };
    IntentFilter filter = new

    IntentFilter(CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER);
    this.registerReceiver(mAccountChangedBroadcastReceiver, filter);
}

アプリケーションを登録してテスト用にテナントを設定する

アプリケーションを設定してデバイスを共有デバイス モードにする前に、組織のテナント内にアプリケーションを登録する必要があります。 次に、アプリケーションが正しく動作するように、auth_config.json に以下の値を指定します。

これを行う方法の詳細については、「アプリケーションの登録」を参照してください。

ノート

アプリを登録する際は、左側にあるクイックスタート ガイドを使用して、 [Android] を選択してください。 それにより、ページが表示され、自分のアプリの [パッケージ名][署名ハッシュ] を入力するよう求められます。 アプリ構成を確実に機能させるためには、これらが非常に重要です。 次に、自分のアプリに使用できる構成オブジェクトを受け取ります。これは切り取って、自分の auth_config.json ファイルに貼り付けます。

[Android アプリの構成] ページ

[自分のためにこの変更を行う] を選択し、クイックスタートで要求される値を指定する必要があります。 完了すると、Microsoft Entra ID によって必要なすべての構成ファイルが生成されます。

テストを目的として、自分のテナントで次のロール、つまり、少なくとも 2 人の従業員と 1 人のクラウド デバイス管理者を設定します。 クラウド デバイス管理者を設定するには、組織のロールを変更する必要があります。 Microsoft Entra 管理センターから、[ID]>、[ロールと管理者]>、[ロールと管理者]>、[すべてのロール] を選択して組織の役割に移動し、[クラウド デバイス管理者] を選択します。 デバイスを共有モードにすることができるユーザーを追加します。

サンプル アプリの実行

このサンプル アプリケーションは、お客様の組織の Graph API を呼び出す単純なアプリです。 最初の実行では、お客様の従業員アカウントでこのアプリケーションを使用するのが初めてであるため、同意を求めるメッセージが表示されます。

アプリケーション構成情報画面

次のステップ

Android デバイスを設定して、共有デバイス モードでアプリを実行し、アプリをテストします。