在 Apple 平台上使用 Microsoft 進行身份驗證

您可以使用 Firebase SDK 將基於 Web 的通用 OAuth 登入整合到您的應用程式中,以執行端對端登入流程,讓您的使用者可以使用 Microsoft Azure Active Directory 等 OAuth 提供者透過 Firebase 進行驗證。

在你開始之前

若要使用 Microsoft 帳戶(Azure Active Directory 和個人 Microsoft 帳戶)登入用戶,您必須先啟用 Microsoft 作為 Firebase 專案的登入提供者:

  1. 將 Firebase 新增到您的 Apple 專案
  2. Firebase 控制台中,開啟「驗證」部分。
  3. 「登入方法」標籤上,啟用Microsoft提供者。
  4. 客戶端 ID客戶端金鑰從該提供者的開發人員控制台新增至提供者設定:
    1. 若要註冊 Microsoft OAuth 用戶端,請依照快速入門:向 Azure Active Directory v2.0 終端點註冊應用程式中的說明進行操作。請注意,此終結點支援使用 Microsoft 個人帳戶以及 Azure Active Directory 帳號登入。了解更多有關 Azure Active Directory v2.0 的資訊
    2. 向這些提供者註冊應用程式時,請務必將專案的*.firebaseapp.com網域註冊為應用程式的重新導向網域。
  5. 按一下「儲存」

使用 Firebase SDK 處理登入流程

若要使用 Firebase Apple 平台 SDK 處理登入流程,請依照下列步驟操作:

  1. 將自訂 URL 方案新增至您的 Xcode 專案:

    1. 開啟專案配置:雙擊左側樹視圖中的專案名稱。從“目標”部分選擇您的應用程序,然後選擇“資訊”選項卡,並展開“URL 類型”部分。
    2. 點擊+按鈕,並將您的編碼應用程式 ID 新增為 URL 方案。您可以在 Firebase 控制台的「常規設定」頁面上的 iOS 應用程式部分中找到您的編碼應用程式 ID。將其他欄位留空。

      完成後,您的配置應類似於以下內容(但具有特定於應用程式的值):

      Xcode的自訂URL方案設定介面截圖
  2. 使用提供者 ID microsoft.com建立OAuthProvider的實例。

    迅速

        var provider = OAuthProvider(providerID: "microsoft.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
        
  3. 可選:指定要與 OAuth 請求一起傳送的其他自訂 OAuth 參數。

    迅速

        provider.customParameters = [
          "prompt": "consent",
          "login_hint": "user@firstadd.onmicrosoft.com"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
        

    有關 Microsoft 支援的參數,請參閱Microsoft OAuth 文件。請注意,您無法使用setCustomParameters傳遞 Firebase 所需的參數。這些參數是client_idresponse_typeredirect_uristatescoperesponse_mode

    若要僅允許特定 Azure AD 租用戶的使用者登入應用程序,可以使用 Azure AD 租用戶的友善網域名稱或租用戶的 GUID 識別碼。這可以透過在自訂參數物件中指定“租戶”欄位來完成。

    迅速

        provider.customParameters = [
          // Optional "tenant" parameter in case you are using an Azure AD
          // tenant. eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or
          // 'contoso.onmicrosoft.com' or "common" for tenant-independent
          // tokens. The default value is "common".
          "tenant": "TENANT_ID"
        ]
        

    Objective-C

        // Optional "tenant" parameter in case you are using an Azure AD tenant.
        // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or
        // 'contoso.onmicrosoft.com' or "common" for tenant-independent tokens.
        // The default value is "common".
        provider.customParameters = @{@"tenant": @"TENANT_ID"};
        
  4. 選用:指定您想要從身分驗證提供者要求的基本設定檔以外的其他 OAuth 2.0 範圍。

    迅速

        provider.scopes = ["mail.read", "calendars.read"]
        

    Objective-C

        [provider setScopes:@[@"mail.read", @"calendars.read"]];
        

    要了解更多信息,請參閱Microsoft 權限和同意文件

  5. 可選:如果要自訂應用程式在向使用者顯示 reCAPTCHA 時呈現SFSafariViewControllerUIWebView的方式,請建立符合AuthUIDelegate協定的自訂類,並將其傳遞給credentialWithUIDelegate

  6. 使用 OAuth 提供者物件透過 Firebase 進行身份驗證。

    迅速

        // Replace nil with the custom class that conforms to AuthUIDelegate
        // you created in last step to use a customized web view.
        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signIn(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // OAuth access token can also be retrieved:
              // (authResult.credential as? OAuthCredential)?.accessToken
              // OAuth ID token can also be retrieved:
              // (authResult.credential as? OAuthCredential)?.idToken
            }
          }
        }
        

    Objective-C

        [provider getCredentialWithUIDelegate:nil
                                   completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) {
          if (error) {
           // Handle error.
          }
          if (credential) {
            [[FIRAuth auth] signInWithCredential:credential
                                      completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
              if (error) {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // OAuth access token can also be retrieved:
              // ((FIROAuthCredential *)authResult.credential).accessToken
              // OAuth ID token can also be retrieved:
              // ((FIROAuthCredential *)authResult.credential).idToken
            }];
          }
        }];
        

    使用 OAuth 存取令牌,您可以呼叫Microsoft Graph API

    例如,要取得基本設定檔訊息,您可以呼叫 REST API,在Authorization標頭中傳遞存取權杖:

    https://graph.microsoft.com/v1.0/me
    

    與 Firebase Auth 支援的其他提供者不同,Microsoft 不提供照片 URL,而是必須透過Microsoft Graph API請求個人資料照片的二進位資料。

    除了 OAuth 存取權杖之外,還可以從OAuthCredential物件中擷取使用者的 OAuth ID 令牌。 ID 令牌中的sub宣告是特定於應用程式的,與 Firebase Auth 使用的聯合使用者識別碼不匹配,可透過user.providerData[0].uid存取。應改用oid聲明字段。使用 Azure AD 租用戶登入時, oid宣告將完全符合。然而,對於非租戶情況, oid欄位被填入。對於聯合 ID 4b2eabcdefghijkloid的格式為00000000-0000-0000-4b2e-abcdefghijkl

  7. 雖然上述範例重點介紹登入流程,但您也可以使用linkWithCredential將 Microsoft 提供者連結到現有使用者。例如,您可以將多個提供者連結到同一用戶,允許他們使用其中任一提供者登入。

    迅速

        Auth().currentUser.link(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // Microsoft credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // Microsoft credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        
  8. 相同的模式可以與reauthenticateWithCredential一起使用,它可用於檢索需要最近登入的敏感操作的新憑證。

    迅速

        Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        

使用者首次登入後,系統會建立新的使用者帳戶,並將其連結到使用者登入時所使用的憑證(即使用者名稱和密碼、電話號碼或驗證提供者資訊)。此新帳戶將作為 Firebase 專案的一部分存儲,並且可用於識別專案中每個應用程式中的用戶,無論用戶如何登入。

  • 在您的應用程式中,您可以從User物件取得使用者的基本個人資料資訊。請參閱管理用戶

  • 在 Firebase 即時資料庫和雲端儲存安全性規則中,您可以從auth變數取得登入使用者的唯一使用者 ID,並使用它來控制使用者可以存取哪些資料。

您可以透過將身分驗證提供者憑證連結到現有使用者帳戶,允許使用者使用多個驗證提供者登入您的應用程式。

若要登出用戶,請呼叫signOut:

迅速

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

您可能還需要為所有身份驗證錯誤新增錯誤處理代碼。請參閱處理錯誤