在 Android 上使用 Microsoft 進行身份驗證

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

在你開始之前

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

  1. 將 Firebase 添加到您的 Android 項目中。

  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. 單擊保存
  6. 如果您尚未指定應用的 SHA-1 指紋,請從 Firebase 控制台的“設置”頁面執行此操作。有關如何獲取應用程序的 SHA-1 指紋的詳細信息,請參閱驗證您的客戶端

使用 Firebase SDK 處理登錄流程

如果您正在構建 Android 應用程序,使用他們的 Microsoft 帳戶通過 Firebase 對用戶進行身份驗證的最簡單方法是使用 Firebase Android SDK 處理整個登錄流程。

要使用 Firebase Android SDK 處理登錄流程,請執行以下步驟:

  1. 使用提供者 ID microsoft.comBuilder構造OAuthProvider的實例。

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
    
  2. 可選:指定要隨 OAuth 請求一起發送的其他自定義 OAuth 參數。

    // Force re-consent.
    provider.addCustomParameter("prompt", "consent");
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");
    

    有關 Microsoft 支持的參數,請參閱Microsoft OAuth 文檔。請注意,您不能使用setCustomParameters()傳遞 Firebase 所需的參數。這些參數是client_idresponse_typeredirect_uristatescoperesponse_mode

    若要僅允許來自特定 Azure AD 租戶的用戶登錄應用程序,可以使用 Azure AD 租戶的友好域名或租戶的 GUID 標識符。這可以通過在自定義參數對像中指定“租戶”字段來完成。

    // 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.addCustomParameter("tenant", "TENANT_ID");
    
  3. 可選:指定您希望從身份驗證提供程序請求的基本配置文件之外的其他 OAuth 2.0 範圍。

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("mail.read");
            add("calendars.read");
          }
        };
    provider.setScopes(scopes);
    

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

  4. 使用 OAuth 提供程序對象向 Firebase 進行身份驗證。請注意,與其他 FirebaseAuth 操作不同,這將通過彈出Custom Chrome Tab來控制您的 UI。因此,不要在您附加的OnSuccessListenerOnFailureListener中引用您的 Activity,因為它們會在操作啟動 UI 時立即分離。

    您應該首先檢查您是否已經收到回复。通過此方法登錄會將您的 Activity 置於後台,這意味著它可以在登錄流程中被系統回收。為了確保在發生這種情況時不會讓用戶重試,您應該檢查結果是否已經存在。

    要檢查是否有待處理的結果,請調用getPendingAuthResult

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
      // There's something already here! Finish the sign-in for your user.
      pendingResultTask
          .addOnSuccessListener(
              new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                  // User is signed in.
                  // IdP data available in
                  // authResult.getAdditionalUserInfo().getProfile().
                  // The OAuth access token can also be retrieved:
                  // authResult.getCredential().getAccessToken().
                  // The OAuth ID token can also be retrieved:
                  // authResult.getCredential().getIdToken().
                }
              })
          .addOnFailureListener(
              new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                  // Handle failure.
                }
              });
    } else {
      // There's no pending result so you need to start the sign-in flow.
      // See below.
    }
    

    要啟動登錄流程,請調用startActivityForSignInWithProvider

    firebaseAuth
        .startActivityForSignInWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
                // The OAuth ID token can also be retrieved:
                // authResult.getCredential().getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

    成功完成後,可以從返回的OAuthCredential對像中檢索與提供者關聯的 OAuth 訪問令牌。

    使用 OAuth 訪問令牌,您可以調用Microsoft Graph API

    與 Firebase Auth 支持的其他提供商不同,Microsoft 不提供照片 URL,而是必須通過Microsoft Graph API請求個人資料照片的二進制數據。

    除了 OAuth 訪問令牌之外,還可以從OAuthCredential對像中檢索用戶的 OAuth ID 令牌。 ID 令牌中的sub聲明是特定於應用程序的,與 Firebase Auth 使用的聯合用戶標識符不匹配,可通過user.getProviderData().get(0).getUid() 。應使用oid聲明字段。使用 Azure AD 租戶登錄時, oid聲明將完全匹配。然而,對於非租戶情況, oid字段被填充。對於聯合 ID 4b2eabcdefghijkloid的格式為00000000-0000-0000-4b2e-abcdefghijkl

  5. 雖然上述示例側重於登錄流程,但您還可以使用startActivityForLinkWithProvider將 Microsoft 提供程序鏈接到現有用戶。例如,您可以將多個提供商鏈接到同一個用戶,允許他們使用其中任何一個登錄。

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // Microsoft credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
                // The OAuth ID token can also be retrieved:
                // authResult.getCredential().getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
    
  6. startActivityForReauthenticateWithProvider可以使用相同的模式,它可用於檢索需要最近登錄的敏感操作的新憑據。

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is re-authenticated with fresh tokens and
                // should be able to perform sensitive operations
                // like account deletion and email or password
                // update.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

下一步

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

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

  • 在您的 Firebase 實時數據庫和雲存儲安全規則中,您可以從auth變量中獲取登錄用戶的唯一用戶 ID,並使用它來控制用戶可以訪問哪些數據。

您可以通過將身份驗證提供程序憑據鏈接到現有用戶帳戶來允許用戶使用多個身份驗證提供程序登錄您的應用程序。

要註銷用戶,請調用signOut

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()