教程:支援 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
        }
    }
}

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