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

您可以使用 Firebase SDK 將網頁型一般 OAuth 登入整合至您的應用程式,讓使用者透過 OAuth 供應商 (例如 Microsoft Azure Active Directory) 驗證 Firebase,以執行端對端登入流程。

事前準備

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

  1. 將 Firebase 新增至 Apple 專案
  2. Firebase 控制台開啟「驗證」專區。
  3. 在「Sign in method」分頁中,啟用「Microsoft」供應商。
  4. 從供應商的 Play 管理中心,新增「用戶端 ID」和「用戶端密鑰」到供應商設定:
    1. 如要註冊 Microsoft OAuth 用戶端,請按照 快速入門導覽課程:使用 Azure Active Directory v2.0 端點註冊應用程式。請注意,這個端點支援使用 Microsoft 個人帳戶和 Azure Active Directory 帳戶登入。 進一步瞭解 Azure Active Directory 2.0 版。
    2. 向這些供應商註冊應用程式時,請務必為專案的 *.firebaseapp.com 網域註冊應用程式的重新導向網域。
  5. 點選「Save」

使用 Firebase SDK 處理登入流程

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

  1. 在 Xcode 專案中新增自訂網址配置:

    1. 開啟專案設定:在左側樹狀檢視中,按兩下專案名稱。從「TARGETS」(目標) 部分選取您的應用程式,選取「Info」(資訊) 分頁標籤,然後展開「URL Types」(網址類型) 部分。
    2. 按一下「+」按鈕,然後新增您的編碼應用程式 ID 做為網址配置。前往 Firebase 控制台的「一般設定」頁面,即可在 iOS 應用程式專區中找到經過編碼的應用程式 ID。請將其他欄位留白。

      設定完成後,設定看起來應類似下列內容 (但會使用您的應用程式專屬值):

      Xcode 自訂網址配置設定介面的螢幕擷取畫面
  2. 使用提供者 ID microsoft.com 建立 OAuthProvider 的執行個體。

    Swift

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

    Objective-C

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

    Swift

        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 ID。方法是在自訂參數物件中指定「用戶群」欄位。

    Swift

        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 範圍。

    Swift

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

    Objective-C

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

    詳情請參閱 Microsoft 權限和同意聲明說明文件

  5. 選用:如果您想自訂向使用者顯示 reCAPTCHA 時的應用程式顯示 SFSafariViewControllerUIWebView 方式,請建立符合 AuthUIDelegate 通訊協定的自訂類別,並傳遞至 credentialWithUIDelegate

  6. 使用 OAuth 提供者物件向 Firebase 進行驗證。

    Swift

        // 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 驗證支援的其他供應商,Microsoft 不提供相片網址,而是必須透過 Microsoft Graph API 要求個人資料相片的二進位資料。

    除了 OAuth 存取權杖之外,您也可以透過 OAuthCredential 物件擷取使用者的 OAuth ID 權杖。ID 權杖中的 sub 憑證附加資訊僅適用於應用程式,與 Firebase 驗證使用且可透過 user.providerData[0].uid 存取的聯合使用者 ID 不相符。應改用 oid 憑證附加資訊欄位。 使用 Azure AD 用戶群登入時,oid 憑證附加資訊會完全相符。但如果是非用戶群的情況,系統會填補 oid 欄位。如果是聯合 ID 4b2eabcdefghijkloid 會採用形式 00000000-0000-0000-4b2e-abcdefghijkl

  7. 雖然上述範例著重於登入流程,但您也可以使用 linkWithCredential 將 Microsoft 提供者連結至現有使用者。例如,您可以將多個提供者連結至同一位使用者,讓對方透過任一提供者登入。

    Swift

        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 搭配使用,可用來針對需要近期登入的敏感作業擷取最新憑證。

    Swift

        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 即時資料庫和 Cloud Storage 安全性規則中,您可以透過 auth 變數取得登入使用者的專屬 ID,並使用該 ID 控管使用者可存取哪些資料。

您可以將驗證供應商憑證連結至現有的使用者帳戶,讓使用者透過多個驗證服務提供者登入您的應用程式。

如要登出使用者,請呼叫 signOut:

Swift

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;
}

您可能也想要針對各種驗證錯誤加入錯誤處理程式碼。請參閱處理錯誤