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

通過使用 Firebase SDK 將基於 Web 的通用 OAuth 登錄集成到您的應用程序中,您可以讓您的用戶使用 OAuth 提供程序(如 Microsoft Azure Active Directory)向 Firebase 進行身份驗證,以執行端到端的登錄流程。

在你開始之前

要使用 Microsoft 帳戶(Azure Active Directory 和個人 Microsoft 帳戶)登錄用戶,您必須首先啟用 Microsoft 作為 Firebase 項目的登錄提供程序:

  1. 將 Firebase 添加到您的 Apple 項目中。
  2. Firebase 控制台中,打開Auth部分。
  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. 打開您的項目配置:雙擊左側樹視圖中的項目名稱。從TARGETS部分中選擇您的應用程序,然後選擇Info選項卡,然後展開URL Types部分。
    2. 單擊+按鈕,並為您的反向客戶端 ID 添加 URL 方案。要查找此值,請打開GoogleService-Info.plist配置文件,然後查找REVERSED_CLIENT_ID鍵。複製該鍵的值,並將其粘貼到配置頁面上的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的方式,請創建一個符合FIRAuthUIDelegate協議的自定義類,並將其傳遞給getCredentialWithUIDelegate:completion:

  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.accessToken
              // OAuth ID token can also be retrieved:
              // authResult.credential.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:
              // authResult.credential.accessToken
              // OAuth ID token can also be retrieved:
              // 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.accessToken
          // OAuth ID token can also be retrieved:
          // authResult.credential.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:
          // authResult.credential.accessToken
          // OAuth ID token can also be retrieved:
          // 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.accessToken
          // OAuth ID token can also be retrieved:
          // authResult.credential.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:
          // authResult.credential.accessToken
          // OAuth ID token can also be retrieved:
          // authResult.credential.idToken
        }];
        

用戶首次登錄後,會創建一個新用戶帳戶並將其鏈接到憑據(即用戶名和密碼、電話號碼或身份驗證提供商信息),即用戶登錄時使用的憑據。這個新帳戶作為 Firebase 項目的一部分存儲,可用於在項目中的每個應用中識別用戶,無論用戶如何登錄。

  • 在您的應用程序中,您可以從FIRUser對象獲取用戶的基本個人資料信息。請參閱管理用戶

  • 在您的 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;
}

您可能還想為所有身份驗證錯誤添加錯誤處理代碼。請參閱處理錯誤