共用方式為


教程:支援 Web 後備措施

適用於:白色圓圈內有灰色 X 符號 。 企業租戶 綠色圓圈內有白色核對符號。 外部租戶(了解詳情

本教學課程示範如何透過瀏覽器取得令牌,其中的原生驗證不足以完成使用者流程。

在本教學課程中,您將瞭解如何:

  • 檢查所需瀏覽器錯誤。
  • 處理 BrowserRequired 錯誤。

先決條件

需要瀏覽器

BrowserRequired 是一種在各種情境下,當原生驗證無法充分完成使用者流程時的備援機制。

為了確保應用程式的穩定性,並避免驗證流程中斷,強烈建議使用SDK的 acquireToken() 方法來繼續瀏覽器中的流程。

當我們初始化 SDK 時,我們需要指定應用程式可支援的挑戰類型。 以下是 SDK 接受的挑戰類型清單:

  • OOB (頻外):當您的 iOS/macOS 應用程式可以處理一次性密碼時,請新增此挑戰類型,在此案例中為電子郵件代碼。
  • 密碼:當您的應用程式能夠處理密碼型驗證時,請新增此挑戰類型。

當 Microsoft Entra 需要客戶端無法提供的功能時,將回傳 BrowserRequired 錯誤。 例如,假設我們只指定挑戰類型 OOB 來初始化 SDK 實例,但在 Microsoft Entra 系統管理中心,應用程式已設定為使用具有密碼 使用者流程的 電子郵件。 當我們從 SDK 實例呼叫 signUp(username) 方法時,我們會收到 BrowserRequired 錯誤,因為 Microsoft Entra 需要不同於 SDK 中所設定的挑戰類型(在此案例中為密碼)。

BrowserRequired 發生時,挑戰類型不足只是其中的一個範例。 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
        }
    }
}

傳回的令牌和帳戶與透過原生驗證流程擷取的令牌和帳戶相同。