適用対象: 従業員テナント
外部テナント (詳細情報)
このチュートリアルでは、ネイティブ認証ではユーザー フローを完了するのに十分ではない場合にブラウザーからトークンを取得する方法について説明します。
このチュートリアルでは、次の操作を行います。
- BrowserRequired エラーを確認します。
- BrowserRequired エラーを処理します。
前提条件
- iOS を使用している場合は、「 サンプルのネイティブ iOS モバイル アプリケーションでユーザーにサインインする」の手順に従ってください。
- macOS を使用している場合は、「ネイティブ認証を使用してサンプル macOS (Swift) アプリでユーザーをサインインする」の手順に従ってください。
ブラウザーが必須
BrowserRequired
は、ネイティブ認証ではユーザー フローを完了するのに十分ではない、さまざまなシナリオをサポートするフォールバック メカニズムです。
アプリケーションの安定性を確保し、認証フローの中断を回避するには、SDK の acquireToken()
メソッドを使用してブラウザーでフローを続行することを強くお勧めします。
SDK を初期化するときは、アプリケーションがサポートできるチャレンジ タイプを指定する必要があります。 SDK が受け入れるチャレンジの種類の一覧を次に示します。
- OOB (アウトオブバンド): iOS/macOS アプリケーションがワンタイム パスコード (この場合は電子メール コード) を処理できる場合は、このチャレンジ タイプを追加します。
- パスワード: アプリケーションがパスワード ベースの認証を処理できる場合に、このチャレンジの種類を追加します。
クライアントが提供できない機能を Microsoft Entra が必要とする場合に BrowserRequired
エラーが返されます。 たとえば、チャレンジの種類に OOB のみを指定してSDK インスタンスを初期化するものの、Microsoft Entra 管理センターでは、アプリケーションは メールアドレスとパスワード のユーザー フローで構成されているといったケースです。 SDK インスタンスから signUp(username) メソッドを呼び出すと、BrowserRequired
エラーが返されます。これは、Microsoft Entra が SDK で構成されているチャレンジの種類 (この場合はパスワード) と異なるチャレンジの種類を要求するためです。
チャレンジの種類が不十分というケースは、BrowserRequired
が発生する可能性がある 1 つの例にすぎません。 BrowserRequired
は、さまざまなシナリオで発生する可能性がある一般的なフォールバック メカニズムです。
サンプル フロー
次のコード スニペットでは、SDK インスタンスの初期化中にチャレンジの種類を指定する方法を確認できます。
nativeAuth = try MSALNativeAuthPublicClientApplication(
clientId: "<client id>",
tenantSubdomain: "<tenant subdomain>",
challengeTypes: [.OOB]
)
この場合では、チャレンジの種類 OOB のみを指定しています。 Microsoft Entra 管理センターでは、アプリケーションは電子メールとパスワードのユーザー フローで構成されているとします。
let parameters = MSALNativeAuthSignUpParameters(username: email)
nativeAuth.signUp(parameters: parameters, delegate: self)
func onSignUpStartError(error: MSAL.SignUpStartError) {
if error.isBrowserRequired {
// handle browser required error
}
}
SDK インスタンスから signUp(parameters:delegate)
メソッドを呼び出すと、BrowserRequired
エラーが返されます。これは、Microsoft Entra が SDK で構成されているチャレンジの種類 (この場合はパスワード) と異なるチャレンジの種類を要求するためです。
BrowserRequired エラーの処理
この種類のエラーを処理するには、ブラウザーを起動して、そこでユーザーが認証フローを行う必要があります。 これは acquireToken()
メソッドを使用すると実行できます。 このメソッドを使用するには、いくつかの追加構成を行う必要があります。
トークンとアカウントを対話形式で取得できるようになりました。 これを行う方法の例を次に示します。
func onSignUpStartError(error: MSAL.SignUpStartError) {
if error.isBrowserRequired {
let webviewParams = MSALWebviewParameters(authPresentationViewController: self)
let parameters = MSALInteractiveTokenParameters(scopes: ["User.Read"], webviewParameters: webviewParams)
nativeAuth.acquireToken(with: parameters) { (result: MSALResult?, error: Error?) in
// result will contain account and tokens retrieved in the browser
}
}
}
返されるトークンとアカウントは、ネイティブ認証フローを通じて取得されるものと同じです。