クイック スタート: モバイル アプリケーションでユーザーのサインインと Microsoft Graph API の呼び出しを行う

このクイックスタートでは、Android アプリケーションでユーザーをサインインし、アクセス トークンを取得して Microsoft Graph API を呼び出す方法を示すコード サンプルをダウンロードして実行します。

図については、「このサンプルのしくみ」を参照してください。

アプリケーションは、Microsoft ID プラットフォームがアプリケーションにトークンを提供できるように、Azure Active Directory 内のアプリ オブジェクトによって表現される必要があります。

前提条件

手順 1:サンプル アプリを入手する

コードをダウンロードします

手順 2:サンプル アプリを実行する

Android Studio の [available devices](使用可能なデバイス) ドロップダウンからエミュレーターまたは物理デバイスを選択し、アプリを実行します。

このサンプル アプリは、単一アカウント モード画面で開始します。 既定のスコープである user.read は既定で指定されます。これは、Microsoft Graph API 呼び出し時にご自分のプロファイル データを読み取るときに使用します。 Microsoft Graph API 呼び出しの URL は、既定で指定されます。 このどちらも必要に応じて変更できます。

MSAL sample app showing single and multiple account usage

単一と複数アカウント モードを切り替えるには、アプリのメニューを使用します。

単一アカウント モードで、職場またはホーム アカウントを使用してサインインします。

  1. [Get graph data interactively](グラフ データを対話形式で取得する) を選択して、ユーザーに資格情報の入力を求めます。 Microsoft Graph API の呼び出しからの出力が画面の下部に表示されます。
  2. サインインしたら、 [Get graph data silently](グラフ データをサイレントで取得する) を選択して、ユーザーに資格情報の入力を再度求めることなく、Microsoft Graph API を呼び出します。 Microsoft Graph API の呼び出しからの出力が画面の下部に表示されます。

複数アカウント モードでは、同じ手順を繰り返すことができます。 さらに、サインインしているアカウントを削除することもできます。その場合、そのアカウントのキャッシュされたトークンも削除されます。

このサンプルのしくみ

Screenshot of the sample app

コードは、単一および複数アカウントの MSAL アプリを記述する方法を示すフラグメントに分かれています。 コード ファイルは、次のように整理されています。

ファイル 対象
MainActivity UI を管理します
MSGraphRequestWrapper MSAL から提供されたトークンを使用して Microsoft Graph API を呼び出します
MultipleAccountModeFragment 複数アカウント アプリケーションを初期化し、ユーザー アカウントを読み込み、Microsoft Graph API を呼び出すためのトークンを取得します
SingleAccountModeFragment 単一アカウント アプリケーションを初期化し、ユーザー アカウントを読み込み、Microsoft Graph API を呼び出すためのトークンを取得します
res/auth_config_multiple_account.json 複数アカウントの構成ファイル
res/auth_config_single_account.json 単一アカウントの構成ファイル
Gradle Scripts/build.grade (Module:app) MSAL ライブラリの依存関係はここに追加します

この後、これらのファイルについて詳しく説明し、それぞれの MSAL 固有のコードを紹介します。

アプリへの MSAL の追加

MSAL (com.microsoft.identity.client) はユーザーをサインインし、Microsoft ID プラットフォームによって保護されている API へのアクセス用のトークンを要求するために使用するライブラリです。 Gradle 3.0 以降では、Gradle Scripts>build.gradle (Module: app)Dependencies に以下を追加すると、ライブラリがインストールされます。

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

これにより、Gradle に maven central から MSAL をダウンロードしてビルドするよう指示します。

さらに、次のように maven への参照を build.gradle (Module: app)allprojects>repositories 部分に追加する必要があります。

allprojects {
    repositories {
        mavenCentral()
        google()
        mavenLocal()
        maven {
            url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
        }
        maven {
            name "vsts-maven-adal-android"
            url "https://identitydivision.pkgs.visualstudio.com/_packaging/AndroidADAL/maven/v1"
            credentials {
                username System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") : project.findProperty("vstsUsername")
                password System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") : project.findProperty("vstsMavenAccessToken")
            }
        }
        jcenter()
    }
}

MSAL のインポート

MSAL ライブラリに関連するインポートは com.microsoft.identity.client.* です。 たとえば、実際のパブリック クライアント アプリケーションを表す PublicClientApplication クラスの名前空間である import com.microsoft.identity.client.PublicClientApplication; があります。

SingleAccountModeFragment.java

このファイルは、単一アカウントの MSAL アプリを作成し、Microsoft Graph API を呼び出す方法を示しています。

単一アカウント アプリは、1 人のユーザーのみが使用します。 たとえば、お使いのマッピング アプリへのサインインに使用するアカウントは 1 つだけです。

単一アカウントの MSAL の初期化

auth_config_single_account.jsononCreateView() では、auth_config_single_account.json ファイルに格納されている構成情報を使用して、単一アカウントの PublicClientApplication を作成します。 このようにして、単一アカウントの MSAL アプリで使用する MSAL ライブラリを初期化します。

...
// Creates a PublicClientApplication object with res/raw/auth_config_single_account.json
PublicClientApplication.createSingleAccountPublicClientApplication(getContext(),
        R.raw.auth_config_single_account,
        new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
            @Override
            public void onCreated(ISingleAccountPublicClientApplication application) {
                /**
                 * This test app assumes that the app is only going to support one account.
                 * This requires "account_mode" : "SINGLE" in the config json file.
                 **/
                mSingleAccountApp = application;
                loadAccount();
            }

            @Override
            public void onError(MsalException exception) {
                displayError(exception);
            }
        });

ユーザーのサインイン

SingleAccountModeFragment.java では、ユーザーをサインインさせるコードは、initializeUI() 内の signInButton クリック ハンドラーにあります。

トークンの取得を試行する前に signIn() を呼び出します。 signIn() は、acquireToken() が呼び出された場合と同様に動作し、ユーザーにサインインを求める対話形式のプロンプトを表示します。

ユーザーのサインインは非同期操作です。 ユーザーがサインインすると、コールバックが渡され、Microsoft Graph API が呼び出され、UI が更新されます。

mSingleAccountApp.signIn(getActivity(), null, getScopes(), getAuthInteractiveCallback());

ユーザーのサインアウト

SingleAccountModeFragment.java では、ユーザーをサインアウトさせるコードは、initializeUI() 内の signOutButton クリック ハンドラーにあります。 ユーザーのサインアウトは非同期操作です。 ユーザーがサインアウトすると、そのアカウントのトークン キャッシュもクリアされます。 ユーザー アカウントからサインアウトすると、コールバックが作成され、UI が更新されます。

mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback() {
    @Override
    public void onSignOut() {
        updateUI(null);
        performOperationOnSignOut();
    }

    @Override
    public void onError(@NonNull MsalException exception) {
        displayError(exception);
    }
});

トークンの対話形式またはサイレントでの取得

ユーザーに表示するプロンプトの数を最小限に抑えるには、通常、トークンをサイレントで取得します。 そのときにエラーが発生した場合は、対話形式でトークンの取得を試行します。 アプリが初めて signIn() を呼び出すと、実質的には acquireToken() の呼び出しとして機能し、ユーザーに資格情報の入力を求めます。

ユーザーは、自分のアカウントの選択、自分の資格情報の入力、またはアプリから要求されたアクセス許可への同意を要求される場合があります。

  • ユーザーが初めてアプリケーションにサインインする場合
  • ユーザーが自分のパスワードをリセットした場合、ユーザーは自分の資格情報を入力する必要がある
  • 同意が取り消された場合
  • アプリが明示的に同意を要求する場合
  • アプリケーションがリソースへのアクセスを初めて要求している場合
  • MFA またはその他の条件付きアクセス ポリシーが必要な場合

UI をユーザーに表示して、トークンを対話形式で取得するコードは、SingleAccountModeFragment.java 内の initializeUI()callGraphApiInteractiveButton クリック ハンドラーにあります。

/**
 * If acquireTokenSilent() returns an error that requires an interaction (MsalUiRequiredException),
 * invoke acquireToken() to have the user resolve the interrupt interactively.
 *
 * Some example scenarios are
 *  - password change
 *  - the resource you're acquiring a token for has a stricter set of requirement than your Single Sign-On refresh token.
 *  - you're introducing a new scope which the user has never consented for.
 **/
mSingleAccountApp.acquireToken(getActivity(), getScopes(), getAuthInteractiveCallback());

ユーザーが既にサインインしている場合は、initializeUI()callGraphApiSilentButton クリック ハンドラーに示すように、acquireTokenSilentAsync() を使用することで、アプリはトークンをサイレントで要求できます。

/**
 * Once you've signed the user in,
 * you can perform acquireTokenSilent to obtain resources without interrupting the user.
 **/
  mSingleAccountApp.acquireTokenSilentAsync(getScopes(), AUTHORITY, getAuthSilentCallback());

アカウントの読み込み

アカウントを読み込むコードは SingleAccountModeFragment.javaloadAccount() にあります。 ユーザーのアカウントの読み込みは非同期操作です。そのため、アカウントの読み込み、変更、またはエラーが発生した場合を処理するコールバックが MSAL に渡されます。 また、次のコードでは onAccountChanged() も処理します。これは、アカウントが削除された場合や、ユーザーが別のアカウントに変更した場合などに発生します。

private void loadAccount() {
    ...

    mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback() {
        @Override
        public void onAccountLoaded(@Nullable IAccount activeAccount) {
            // You can use the account data to update your UI or your app database.
            updateUI(activeAccount);
        }

        @Override
        public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable IAccount currentAccount) {
            if (currentAccount == null) {
                // Perform a cleanup task as the signed-in account changed.
                performOperationOnSignOut();
            }
        }

        @Override
        public void onError(@NonNull MsalException exception) {
            displayError(exception);
        }
    });

Microsoft Graph の呼び出し

ユーザーがサインインすると、SingleAccountModeFragment.java で定義されている callGraphAPI() によって Microsoft Graph の呼び出しが HTTP 要求を介して行われます。 この関数は、authenticationResult からのアクセス トークンの取得、MSGraphRequestWrapper への呼び出しのパッケージ化、呼び出しの結果の表示など、いくつかのタスクを実行することでサンプルを簡素化するラッパーです。

private void callGraphAPI(final IAuthenticationResult authenticationResult) {
    MSGraphRequestWrapper.callGraphAPIUsingVolley(
            getContext(),
            graphResourceTextView.getText().toString(),
            authenticationResult.getAccessToken(),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    /* Successfully called graph, process data and send to UI */
                    ...
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    ...
                }
            });
}

auth_config_single_account.json

これは、単一のアカウントを使用する MSAL アプリの構成ファイルです。

これらのフィールドの説明については、Android の MSAL 構成ファイルについてのページを参照してください。

"account_mode" : "SINGLE" が存在する点に注意してください。これにより、単一のアカウントを使用するようこのアプリを構成しています。

"client_id" は、Microsoft が管理するアプリ オブジェクト登録を使用するように事前に構成されています。 "redirect_uri" は、コード サンプルで提供される署名キーを使用するように事前に構成されています。

{
  "client_id" : "0984a7b6-bc13-4141-8b0d-8f767e136bb7",
  "authorization_user_agent" : "DEFAULT",
  "redirect_uri" : "msauth://com.azuresamples.msalandroidapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D",
  "account_mode" : "SINGLE",
  "broker_redirect_uri_registered": true,
  "authorities" : [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

MultipleAccountModeFragment.java

このファイルは、複数アカウントの MSAL アプリを作成し、Microsoft Graph API を呼び出す方法を示しています。

複数アカウント アプリの例としては、職場アカウントや個人用アカウントなど、複数のユーザー アカウントを使用できるメール アプリがあります。

複数アカウントの MSAL の初期化

MultipleAccountModeFragment.java ファイルの onCreateView() では、auth_config_multiple_account.json file に格納されている構成情報を使用して、複数アカウントのアプリ オブジェクト (IMultipleAccountPublicClientApplication) を作成します。

// Creates a PublicClientApplication object with res/raw/auth_config_multiple_account.json
PublicClientApplication.createMultipleAccountPublicClientApplication(getContext(),
        R.raw.auth_config_multiple_account,
        new IPublicClientApplication.IMultipleAccountApplicationCreatedListener() {
            @Override
            public void onCreated(IMultipleAccountPublicClientApplication application) {
                mMultipleAccountApp = application;
                loadAccounts();
            }

            @Override
            public void onError(MsalException exception) {
                ...
            }
        });

作成された MultipleAccountPublicClientApplication オブジェクトはクラス メンバー変数に格納されます。これは、MSAL ライブラリを操作して、トークンを取得したり、ユーザー アカウントを読み込んだり、削除したりする場合に使用できます。

アカウントの読み込み

通常、複数アカウント アプリでは、MSAL 操作に使用するアカウントを選択する getAccounts() を呼び出します。 アカウントを読み込むコードは MultipleAccountModeFragment.java ファイルの loadAccounts() にあります。 ユーザーのアカウントの読み込みは非同期操作です。 そのため、コールバックでは、アカウントの読み込み、変更、またはエラーが発生した場合を処理します。

/**
 * Load currently signed-in accounts, if there's any.
 **/
private void loadAccounts() {
    if (mMultipleAccountApp == null) {
        return;
    }

    mMultipleAccountApp.getAccounts(new IPublicClientApplication.LoadAccountsCallback() {
        @Override
        public void onTaskCompleted(final List<IAccount> result) {
            // You can use the account data to update your UI or your app database.
            accountList = result;
            updateUI(accountList);
        }

        @Override
        public void onError(MsalException exception) {
            displayError(exception);
        }
    });
}

トークンの対話形式またはサイレントでの取得

ユーザーは、自分のアカウントの選択、自分の資格情報の入力、またはアプリから要求されたアクセス許可への同意を要求される場合があります。

  • ユーザーが初めてアプリケーションにサインインした場合
  • ユーザーが自分のパスワードをリセットした場合、ユーザーは自分の資格情報を入力する必要がある
  • 同意が取り消された場合
  • アプリが明示的に同意を要求する場合
  • アプリケーションがリソースへのアクセスを初めて要求している場合
  • MFA またはその他の条件付きアクセス ポリシーが必要な場合

通常、複数アカウント アプリでは、acquireToken() を呼び出して、ユーザーに UI を表示し、トークンを対話形式で取得する必要があります。 トークンを対話形式で取得するコードは、MultipleAccountModeFragment.java ファイルの initializeUI()callGraphApiInteractiveButton クリック ハンドラーにあります。

/**
 * Acquire token interactively. It will also create an account object for the silent call as a result (to be obtained by getAccount()).
 *
 * If acquireTokenSilent() returns an error that requires an interaction,
 * invoke acquireToken() to have the user resolve the interrupt interactively.
 *
 * Some example scenarios are
 *  - password change
 *  - the resource you're acquiring a token for has a stricter set of requirement than your SSO refresh token.
 *  - you're introducing a new scope which the user has never consented for.
 **/
mMultipleAccountApp.acquireToken(getActivity(), getScopes(), getAuthInteractiveCallback());

アプリは、トークンを要求するたびに、ユーザーにサインインを要求するべきではありません。 ユーザーが既にサインインしている場合は、MultipleAccountModeFragment.java ファイルの initializeUI()callGraphApiSilentButton クリック ハンドラーに示すように、acquireTokenSilentAsync() を使用することで、アプリはユーザーに入力を求めることなくトークンを自動的に要求できます。

/**
 * Performs acquireToken without interrupting the user.
 *
 * This requires an account object of the account you're obtaining a token for.
 * (can be obtained via getAccount()).
 */
mMultipleAccountApp.acquireTokenSilentAsync(getScopes(),
    accountList.get(accountListSpinner.getSelectedItemPosition()),
    AUTHORITY,
    getAuthSilentCallback());

アカウントの削除

アカウントとそのアカウントのキャッシュされたすべてのトークンを削除するコードは、MultipleAccountModeFragment.java ファイル内の initializeUI() のアカウント削除ボタンのハンドラーにあります。 アカウントを削除する前に、アカウント オブジェクトが必要です。これは、getAccounts()acquireToken() などの MSAL メソッドから取得します。 アカウントの削除は非同期操作であるため、onRemoved コールバックを指定して、UI を更新します。

/**
 * Removes the selected account and cached tokens from this app (or device, if the device is in shared mode).
 **/
mMultipleAccountApp.removeAccount(accountList.get(accountListSpinner.getSelectedItemPosition()),
        new IMultipleAccountPublicClientApplication.RemoveAccountCallback() {
            @Override
            public void onRemoved() {
                ...
                /* Reload account asynchronously to get the up-to-date list. */
                loadAccounts();
            }

            @Override
            public void onError(@NonNull MsalException exception) {
                displayError(exception);
            }
        });

auth_config_multiple_account.json

これは、複数のアカウントを使用する MSAL アプリの構成ファイルです。

さまざまなフィールドの説明については、Android の MSAL 構成ファイルについてのページを参照してください。

これは複数アカウント アプリであるため、auth_config_single_account.json 構成ファイルとは異なり、この構成ファイルには "account_mode" : "SINGLE" の代わりに "account_mode" : "MULTIPLE" が含まれています。

"client_id" は、Microsoft が管理するアプリ オブジェクト登録を使用するように事前に構成されています。 "redirect_uri" は、コード サンプルで提供される署名キーを使用するように事前に構成されています。

{
  "client_id" : "0984a7b6-bc13-4141-8b0d-8f767e136bb7",
  "authorization_user_agent" : "DEFAULT",
  "redirect_uri" : "msauth://com.azuresamples.msalandroidapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D",
  "account_mode" : "MULTIPLE",
  "broker_redirect_uri_registered": true,
  "authorities" : [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

ヘルプとサポート

サポートが必要な場合、問題をレポートする場合、またはサポート オプションについて知りたい場合は、開発者向けのヘルプとサポートに関するページを参照してください。

次のステップ

Microsoft ID プラットフォームからアクセス トークンを取得し、これを使用して Microsoft Graph API を呼び出す Android アプリを作成する Android チュートリアルに進みます。

このクイックスタートでは、ネイティブの iOS または macOS アプリケーションでユーザーをサインインし、アクセス トークンを取得して Microsoft Graph API を呼び出す方法を示すコード サンプルをダウンロードして実行します。

このクイックスタートは、iOS アプリと macOS アプリの両方に適用されます。 一部の手順は iOS アプリにのみ必要であり、そのように示されます。

前提条件

このサンプルのしくみ

Shows how the sample app generated by this quickstart works

クイック スタート アプリを登録してダウンロードする

クイック スタート アプリケーションを開始する方法としては、次の 2 つの選択肢があります。

オプション 1: アプリを登録して自動構成を行った後、コード サンプルをダウンロードする

手順 1:アプリケーションの登録

アプリを登録するには、

  1. Azure portal のアプリの登録クイックスタート エクスペリエンスに移動します。
  2. アプリケーションの名前を入力し、 [登録] を選択します。
  3. 画面の指示に従ってダウンロードし、1 回クリックするだけで、新しいアプリケーションが自動的に構成されます。

オプション 2:アプリケーションを登録し、アプリケーションとコード サンプルを手動で構成する

手順 1:アプリケーションの登録

アプリケーションを登録し、その登録情報をソリューションに手動で追加するには、次の手順を実行します。

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合は、トップ メニューの [ディレクトリとサブスクリプション] フィルター を使用して、アプリケーションを登録するテナントに切り替えます。
  3. Azure Active Directory を検索して選択します。
  4. [管理][アプリの登録]>[新規登録] の順に選択します。
  5. アプリケーションの [名前] を入力します。 この名前は、アプリのユーザーに表示される場合があります。また、後で変更することができます。
  6. [登録] を選択します。
  7. [管理] で、 [認証]>[プラットフォームの追加]>[iOS] の順に選択します。
  8. アプリケーションのバンドル ID を入力します。 バンドル識別子は、アプリケーションを一意に識別する一意の文字列です (例: com.<yourname>.identitysample.MSALMacOS)。 使用する値を書き留めておきます。 iOS の構成は macOS アプリケーションにも適用できることに注意してください。
  9. [構成] を選択し、このクイックスタートでの後の手順のために MSAL 構成の詳細を保存しておきます。
  10. [完了] を選択します。

手順 2:サンプル プロジェクトのダウンロード

手順 3:依存関係のインストール

  1. zip ファイルを解凍します。
  2. ターミナル ウィンドウで、ダウンロードしたコード サンプルが含まれるフォルダーに移動し、pod install を実行して、最新の MSAL ライブラリをインストールします。

手順 4:プロジェクトを構成する

上のオプション 1 を選択した場合は、以下の手順を省略できます。

  1. XCode でプロジェクトを開きます。

  2. ViewController.swift を編集し、'let kClientID' で始まる行を次のコード スニペットに置き換えます。 kClientID の値を、このクイック スタートの前の手順でポータルにアプリを登録したときに保存したクライアント ID に必ず更新してください。

    let kClientID = "Enter_the_Application_Id_Here"
    
  3. Azure AD 国内クラウド向けのアプリを作成している場合は、"let kGraphEndpoint" および "let kAuthority" で始まる行を適切なエンドポイントに置き換えます。 グローバル アクセスの場合は、既定値を使用してください。

    let kGraphEndpoint = "https://graph.microsoft.com/"
    let kAuthority = "https://login.microsoftonline.com/common"
    
  4. その他のエンドポイントは、こちらに記載されています。 たとえば、このクイックスタートを Azure AD Germany で実行するには、次のコードを使用します。

    let kGraphEndpoint = "https://graph.microsoft.de/"
    let kAuthority = "https://login.microsoftonline.de/common"
    
  5. プロジェクトの設定を開きます。 [ID] セクションに、ポータルに入力したバンドル ID を入力します。

  6. Info.plist を右クリックし、 [形式を指定して開く]>[ソース コード] を選択します。

  7. dict ルート ノードの下の Enter_the_bundle_Id_Here を、ポータルで使用した Bundle Id に置き換えます。 文字列の msauth. プレフィックスに注目します。

    <key>CFBundleURLTypes</key>
    <array>
       <dict>
          <key>CFBundleURLSchemes</key>
          <array>
             <string>msauth.Enter_the_Bundle_Id_Here</string>
          </array>
       </dict>
    </array>
    
  8. アプリをビルドして実行します。

詳細情報

このクイック スタートの詳細については、以下のセクションをお読みください。

MSAL の取得

MSAL (MSAL.framework) はユーザーをサインインし、Microsoft ID プラットフォームによって保護されている API にアクセスするトークンを要求するために使用するライブラリです。 MSAL は、次のプロセスを使用してアプリケーションに追加できます。

$ vi Podfile

次の内容を (プロジェクトのターゲットと共に) この podfile に追加します。

use_frameworks!

target 'MSALiOS' do
   pod 'MSAL'
end

CocoaPods インストール コマンドを実行します。

pod install

MSAL の初期化

MSAL への参照を追加するには、次のコードを追加します。

import MSAL

続いて、次のコードを使用して MSAL を初期化します。

let authority = try MSALAADAuthority(url: URL(string: kAuthority)!)

let msalConfiguration = MSALPublicClientApplicationConfig(clientId: kClientID, redirectUri: nil, authority: authority)
self.applicationContext = try MSALPublicClientApplication(configuration: msalConfiguration)
各値の説明: 説明
clientId portal.azure.com に登録されているアプリケーションの Application ID
authority Microsoft ID プラットフォーム。 ほとんどの場合、これは https://login.microsoftonline.com/common になります
redirectUri アプリケーションのリダイレクト URI。 'nil' を渡すと、既定値またはカスタムのリダイレクト URI を使用できます。

iOS のみ: アプリの追加要件

アプリでは、AppDelegate 内に次の内容も必要です。 これにより、認証を実行するときに MSAL SDK による Auth ブローカー アプリからのトークン応答の処理が可能になります。

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

    return MSALPublicClientApplication.handleMSALResponse(url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String)
}

注意

iOS 13 以降では、UIApplicationDelegate ではなく UISceneDelegate を採用する場合は、代わりに scene:openURLContexts: のコールバックにこのコードを配置します (Apple のドキュメントを参照してください)。 以前の iOS との互換性を保持するために UISceneDelegate と UIApplicationDelegate の両方をサポートしている場合は、MSAL コールバックを両方の場所に配置する必要があります。

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

   guard let urlContext = URLContexts.first else {
      return
   }

   let url = urlContext.url
   let sourceApp = urlContext.options.sourceApplication

   MSALPublicClientApplication.handleMSALResponse(url, sourceApplication: sourceApp)
}

最後に、アプリでは、LSApplicationQueriesSchemes エントリが Info.plistCFBundleURLTypes と並んで存在している必要があります。 サンプルにはこれが含まれています。

<key>LSApplicationQueriesSchemes</key>
<array>
   <string>msauthv2</string>
   <string>msauthv3</string>
</array>

ユーザーのサインイン & トークンの要求

MSAL には、トークンの取得に使用する 2 つのメソッド acquireTokenacquireTokenSilent があります。

acquireToken: 対話形式でのユーザー トークンの取得

状況によっては、ユーザーが Microsoft ID プラットフォームと対話する必要があります。 このような場合、エンド ユーザーは自分のアカウントを選択する、自分の資格情報を入力する、またはアプリのアクセス許可に同意することを要求される可能性があります。 たとえば、次のように入力します。

  • ユーザーが初めてアプリケーションにサインインした場合
  • ユーザーが自分のパスワードをリセットした場合、ユーザーは自分の資格情報を入力する必要がある
  • アプリケーションがリソースへのアクセスを初めて要求している場合
  • MFA またはその他の条件付きアクセス ポリシーが必要な場合
let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParamaters!)
self.applicationContext!.acquireToken(with: parameters) { (result, error) in /* Add your handling logic */}
各値の説明: 説明
scopes 要求するスコープを含む (つまり、Microsoft Graph 用の [ "user.read" ] またはカスタム Web API 用の [ "<Application ID URL>/scope" ]) (api://<Application ID>/access_as_user)

acquireTokenSilent: アクセス トークンを自動的に取得する

アプリは、トークンを要求するたびに、ユーザーにサインインを要求するべきではありません。 ユーザーが既にサインインしている場合は、この方法により、アプリはトークンを暗黙的に要求できます。

self.applicationContext!.getCurrentAccount(with: nil) { (currentAccount, previousAccount, error) in

   guard let account = currentAccount else {
      return
   }

   let silentParams = MSALSilentTokenParameters(scopes: self.kScopes, account: account)
   self.applicationContext!.acquireTokenSilent(with: silentParams) { (result, error) in /* Add your handling logic */}
}
各値の説明: 説明
scopes 要求するスコープを含む (つまり、Microsoft Graph 用の [ "user.read" ] またはカスタム Web API 用の [ "<Application ID URL>/scope" ]) (api://<Application ID>/access_as_user)
account トークンが要求されているアカウント。 このクイックスタートでは、単一アカウントのアプリケーションを取り扱います。 複数アカウントのアプリを構築する場合は、accountsFromDeviceForParameters:completionBlock: を使用し、正しい accountIdentifier を渡して、どのアカウントをトークン要求に使用するかを識別するためのロジックを定義する必要があります

ヘルプとサポート

サポートが必要な場合、問題をレポートする場合、またはサポート オプションについて知りたい場合は、開発者向けのヘルプとサポートに関するページを参照してください。

次のステップ

Microsoft ID プラットフォームからアクセス トークンを取得し、これを使用して Microsoft Graph API を呼び出す iOS または macOS アプリを作成するステップバイステップのチュートリアルに進みます。