Share via


チュートリアル:Android アプリケーションで共有デバイス モードを使用する

このチュートリアルでは、Android アプリの共有デバイス モードを有効にするうえで必要なコード、Authenticator アプリ、テナント設定について、Android 開発者および Microsoft Entra テナント管理者を対象に説明します。

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

  • コード サンプルをダウンロードする
  • 共有デバイス モードを有効にして検出する
  • アカウント モードが単一か複数かを検出する
  • ユーザーの切り替えを検出し、グローバル サインインとグローバル サインアウトを有効にする
  • テナントを設定してアプリケーションを登録する
  • 共有デバイス モードで Android デバイスを設定する
  • サンプル アプリを実行する

前提条件

開発者ガイド

このチュートリアル セクションでは、Microsoft Authentication Library (MSAL) を使用して Android アプリケーションに共有デバイス モードを実装するための開発者向けガイダンスを提供します。 MSAL を自分の Android アプリに統合する方法、ユーザーをサインインさせる方法、Microsoft Graph を呼び出す方法、ユーザーをサインアウトさせる方法については、Android 向けの MSAL チュートリアルをご覧ください。

サンプルのダウンロード

GitHub からサンプル アプリケーションを複製します。 このサンプルは、単一または複数アカウント モードで動作できます。

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

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

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

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

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

ご自分の 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 ファイルに貼り付けます。

Configure your Android app page

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

Configure your project page

テナントを設定する

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

共有モードで Android デバイスを設定する

Authenticator アプリをダウンロードする

Google Play ストアから Microsoft Authenticator アプリをダウンロードします。 アプリを既にダウンロードしている場合は、それが最新のバージョンであることを確認します。

Authenticator アプリの設定とクラウドでのデバイスの登録

Authenticator アプリを起動し、メイン アカウント ページに移動します。 [アカウントの追加] ページが表示されたら、デバイスを共有する準備は整いました。

Authenticator add account screen

右側のメニュー バーを使用して、 [設定] ペインに移動します。 [職場または学校アカウント] の下にある [デバイスの登録] を選択します。

Authenticator settings screen

このボタンをクリックすると、デバイスの連絡先へのアクセスを承認するよう求められます。 これは、デバイスで Android のアカウントが統合されているためです。 [許可] を選択します。

Authenticator allow access confirmation screen

クラウド デバイス管理者は、 [または共有デバイスとして登録] の下で、組織のメール アドレスを入力する必要があります。 次に、 [共有デバイスとして登録] ボタンをクリックし、資格情報を入力します。

Device registration screen in app

App screenshot showing Microsoft sign-in page

これでデバイスが共有モードになりました。

App screen showing shared device mode enabled

デバイスでのサインインとサインアウトは、すべてグローバルになります。つまり、デバイス上の MSAL および Microsoft Authenticator と統合されているすべてのアプリにサインインとサインアウトが適用されます。 これで、共有デバイス モード機能が使用されるデバイスにアプリケーションをデプロイできるようになりました。

共有デバイスを表示する

共有モードにしたデバイスは組織によって把握されるようになり、組織のテナントで追跡されます。 共有デバイスを表示するには、[結合の種類] を参照します。

Screenshot that shows the all devices pane

サンプル アプリを実行する

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

Application configuration info screen

次のステップ

Microsoft Authentication Library と Android デバイスの共有デバイス モードの詳しい使用方法をご覧ください。