使用 Microsoft 和 Unity 進行驗證

您可以使用 Firebase SDK 將網頁式一般 OAuth 登入整合至您的應用程式,讓使用者透過 OAuth 供應商 (例如 Microsoft Azure Active Directory) 驗證 Firebase,以執行端對端登入流程。由於這個流程需要使用手機式 Firebase SDK,因此只有 Android 和 Apple 平台支援這個 SDK。

事前準備

使用 Firebase 驗證前,您必須先完成以下事項:

  • 註冊 Unity 專案,並將其設定為使用 Firebase。

    • 如果您的 Unity 專案已使用 Firebase,表示該專案已完成註冊並設定 Firebase。

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

  • 在 Unity 專案中新增 Firebase Unity SDK (尤其是 FirebaseAuth.unitypackage)。

請注意,將 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. 使用適合 Microsoft 的提供者 ID 設定的 FederatedOAuthProviderData 執行個體。

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

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Prompt user to re-authenticate to Microsoft.
    providerData.CustomParameters.Add("prompt", "login");
    
    // Target specific email with login hint.
    providerData.CustomParameters.Add("login_hint",
        "user@firstadd.onmicrosoft.com");
    

    如要瞭解 Microsoft 支援的參數,請參閱 Microsoft OAuth 說明文件。請注意,您無法透過 setCustomParameters() 傳遞 Firebase 所需的參數。這些參數包括 client_idresponse_typeredirect_uristatescoperesponse_mode

    如果只想允許特定 Azure AD 用戶群的使用者登入應用程式,可以使用 Azure AD 用戶群的易記網域名稱或用戶群的 GUID ID。方法是在自訂參數物件中指定「用戶群」欄位。

    // 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".
    providerData.CustomParameters.Add("tenant", "TENANT_ID");
    
  3. 選用:指定您要求驗證供應商的基本設定檔以外的其他 OAuth 2.0 範圍。

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("mail.read");
    providerData.Scopes.Add("calendars.read");
    

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

  4. 設定提供者資料後,請使用該資料建立 FederatedOAuthProvider。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider = new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. 使用驗證提供者物件進行 Firebase 驗證。請注意,與其他 FirebaseAuth 作業不同,這會彈出網路檢視畫面,讓使用者輸入憑證來控制 UI。

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

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

    使用 OAuth 存取權杖,您可以呼叫 Microsoft Graph API

    不同於 Firebase 驗證支援的其他供應商,Microsoft 不提供相片網址,而是必須透過 Microsoft Graph API 要求個人資料相片的二進位資料。

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

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

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

如要登出使用者,請呼叫 SignOut()

auth.SignOut();