使用 Yahoo 和 Unity 進行身份驗證

您可以使用 Firebase SDK 將基於 Web 的通用 OAuth 登入整合到您的應用程式中,以執行端對端登入流程,讓您的使用者可以使用 Yahoo 等 OAuth 提供者透過 Firebase 進行驗證。由於此流程需要使用基於手機的 Firebase SDK,因此僅在 Android 和 Apple 平台上支援。

在你開始之前

在使用Firebase 驗證之前,您需要:

  • 註冊您的 Unity 專案並將其配置為使用 Firebase。

    • 如果您的 Unity 專案已使用 Firebase,則它已針對 Firebase 進行註冊和設定。

    • 如果您沒有 Unity 項目,可以下載範例應用程式

  • Firebase Unity SDK (具體來說, FirebaseAuth.unitypackage )加入您的 Unity 專案。

請注意,將 Firebase 新增至 Unity 專案涉及Firebase 控制台和開啟的 Unity 專案中的任務(例如,從控制台下載 Firebase 設定文件,然後將它們移至 Unity 專案中)。

存取Firebase.Auth.FirebaseAuth

FirebaseAuth類別是所有 API 呼叫的網關。它可以透過FirebaseAuth.DefaultInstance存取。
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

使用 Firebase SDK 處理登入流程

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

  1. 建構一個FederatedOAuthProviderData實例,並配置適合 Yahoo 的提供者 ID。

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    providerData.ProviderId = Firebase.Auth.YahooAuthProvider.ProviderId;
    
  2. 可選:指定要與 OAuth 請求一起傳送的其他自訂 OAuth 參數。

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Prompt user to re-authenticate to Yahoo.
    providerData.CustomParameters.Add("prompt", "login");
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    

    有關 Yahoo 支援的參數,請參閱Yahoo OAuth 文件。請注意,您無法使用custom_parameters()傳遞 Firebase 所需的參數。這些參數是client_idredirect_uriresponse_typescopestate

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

    providerData.Scopes = new List<string>();
    
    // Request access to Yahoo Mail API.
    providerData.Scopes.Add("mail-r");
    // This must be preconfigured in the app's API permissions.
    providerData.Scopes.Add("sdct-w");
    

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

  4. 配置提供者資料後,使用它來建立 FederatedOAuthProvider。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
        new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. 使用身份驗證提供者物件透過 Firebase 進行身份驗證。請注意,與其他 FirebaseAuth 操作不同,這將透過彈出一個 Web 視圖(使用者可以在其中輸入其憑證)來控制您的 UI。

    若要啟動登入流程,請呼叫SignInAndRetrieveDataWithCredentialAsync

<<../_includes/_sign_in_with_provider_unity.md>>>

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

    user.LinkWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("LinkWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("LinkWithProviderAsync encountered an error: "
              + task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User linked successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  2. 相同的模式可以與ReauthenticateWithProviderAsync一起使用,它可用於檢索需要最近登入的敏感操作的新憑證。

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    

下一步

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

  • 在您的應用程式中,您可以從Firebase.Auth.FirebaseUser物件取得使用者的基本個人資料資訊:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // The user's Id, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server, if you
      // have one; use User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • 在 Firebase 即時資料庫和雲端儲存安全性規則中,您可以從auth變數取得登入使用者的唯一使用者 ID,並使用它來控制使用者可以存取哪些資料。

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

若要登出用戶,請呼叫SignOut()

auth.SignOut();