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

您可以通過使用 Firebase SDK 將基於 Web 的通用 OAuth 登錄集成到您的應用中來執行端到端登錄流程,從而讓您的用戶使用 Yahoo 等 OAuth 提供程序向 Firebase 進行身份驗證。

在你開始之前

要使用 Yahoo 帳戶登錄用戶,您必須首先啟用 Yahoo 作為 Firebase 項目的登錄提供程序:

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

  2. Firebase 控制台中,打開Auth部分。
  3. 登錄方法選項卡上,啟用Yahoo提供程序。
  4. 將該提供者的開發者控制台中的客戶端 ID客戶端密碼添加到提供者配置中:
    1. 要註冊 Yahoo OAuth 客戶端,請遵循 Yahoo 開發人員文檔中關於向 Yahoo註冊 Web 應用程序的操作。

      請務必選擇兩個 OpenID Connect API 權限: profileemail

    2. 向這些提供商註冊應用程序時,請務必將項目的*.firebaseapp.com域註冊為應用程序的重定向域。
  5. 單擊保存
  6. 如果您尚未指定應用的 SHA-1 指紋,請從 Firebase 控制台的“設置”頁面執行此操作。有關如何獲取應用程序的 SHA-1 指紋的詳細信息,請參閱驗證您的客戶端

使用 Firebase SDK 處理登錄流程

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

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

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

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

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login");
    
    // Localize to French.
    provider.addCustomParameter("language", "fr");
    

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

  3. 可選:指定要從身份驗證提供程序請求的profileemail之外的其他 OAuth 2.0 範圍。如果您的應用程序需要從 Yahoo API 訪問私有用戶數據,您需要在 Yahoo 開發者控制台的API Permissions下請求對 Yahoo API 的權限。請求的 OAuth 範圍必須與應用 API 權限中預配置的範圍完全匹配。例如,如果向用戶聯繫人請求讀/寫訪問權限並在應用程序的 API 權限中預配置,則必須傳遞sdct-w而不是只讀 OAuth 範圍sdct-r 。否則,流程將失敗,並向最終用戶顯示錯誤。

    List<String> scopes =
        new ArrayList<String>() {
          {
            // Request access to Yahoo Mail API.
            add("mail-r");
            // This must be preconfigured in the app's API permissions.
            add("sdct-w");
          }
        };
    provider.setScopes(scopes);
    

    要了解更多信息,請參閱Yahoo 範圍文檔

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

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

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

    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    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 be retrieved:
                  // authResult.getCredential().getAccessToken().
                  // Yahoo OAuth ID token can 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 be retrieved:
                // authResult.getCredential().getAccessToken().
                // Yahoo 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 訪問令牌,您可以調用Yahoo API

    其中YAHOO_USER_UID是 Yahoo 用戶的 ID,可以從firebaseAuth.getCurrentUser().getProviderData().get(0).getUid()字段或authResult.getAdditionalUserInfo().getProfile()

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

    // 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) {
                // Yahoo credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can be retrieved:
                // authResult.getCredential().getAccessToken().
                // Yahoo 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()