Google 致力于为黑人社区推动种族平等。查看具体举措

使用 Apple 和 Unity 进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

通过使用 Firebase SDK 执行端到端 OAuth 2.0 登录流程,您可以让用户使用其 Apple ID 向 Firebase 进行身份验证。

在你开始之前

要使用 Apple 登录用户,请首先在 Apple 的开发者网站上配置 Sign In with Apple,然后将 Apple 启用为您的 Firebase 项目的登录提供商。

加入 Apple 开发者计划

Sign In with Apple 只能由Apple Developer Program的成员配置。

配置使用 Apple 登录

必须在 Firebase 项目中启用并正确配置 Apple 登录。 Apple Developer 配置因 Android 和 Apple 平台而异。在继续之前,请按照iOS+和/或Android指南的“使用 Apple 配置登录”部分进行操作。

启用 Apple 作为登录提供商

  1. Firebase 控制台中,打开Auth部分。在登录方法选项卡上,启用Apple提供程序。
  2. 配置 Apple 登录提供程序设置:
    1. 如果您仅在 Apple 平台上部署您的应用程序,您可以将服务 ID、Apple 团队 ID、私钥和密钥 ID 字段留空。
    2. 对于 Android 设备的支持:
      1. 将 Firebase 添加到您的 Android 项目中。在 Firebase 控制台中设置应用时,请务必注册应用的 SHA-1 签名。
      2. Firebase 控制台中,打开Auth部分。在登录方法选项卡上,启用Apple提供程序。指定您在上一节中创建的服务 ID。此外,在 OAuth 代码流配置部分中,指定您的 Apple Team ID 以及您在上一部分中创建的私钥和密钥 ID。

遵守 Apple 匿名数据要求

Sign In with Apple 为用户提供了在登录时匿名其数据(包括电子邮件地址)的选项。选择此选项的用户拥有域为privaterelay.appleid.com的电子邮件地址。当您在您的应用程序中使用 Sign In with Apple 时,您必须遵守 Apple 有关这些匿名 Apple ID 的任何适用开发者政策或条款。

这包括在您将任何直接识别个人信息与匿名 Apple ID 相关联之前获得任何必要的用户同意。使用 Firebase 身份验证时,这可能包括以下操作:

  • 将电子邮件地址链接到匿名 Apple ID,反之亦然。
  • 将电话号码链接到匿名 Apple ID,反之亦然
  • 将非匿名社交凭证(Facebook、Google 等)链接到匿名 Apple ID,反之亦然。

上面的列表并不详尽。请参阅开发者帐户成员部分中的 Apple 开发者计划许可协议,以确保您的应用程序符合 Apple 的要求。

访问Firebase.Auth.FirebaseAuth

FirebaseAuth类是所有 API 调用的网关。它可以通过FirebaseAuth.DefaultInstance访问。
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

使用 Firebase SDK 处理登录流程

使用 Apple 登录的流程因 Apple 和 Android 平台而异。

在 Apple 平台上

  1. 安装第三方插件来处理 Apple 登录 nonce 和令牌生成,例如Unity 的 Sign In With Apple Asset Storage Package 。您可能需要更改代码以在其原始字符串状态下检测生成的随机随机数字符串以用于 Firebase 操作(即,在创建随机数的 SHA256 摘要形式之前存储它的副本)。

  2. 使用生成的令牌字符串和原始随机数构建 Firebase 凭据并登录 Firebase。

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

  3. 相同的模式可用于ReauthenticateAsync ,可用于检索需要最近登录的敏感操作的新凭据。有关详细信息,请参阅管理用户

  4. 在 Apple 平台上与 Apple Sign In 关联时,您可能会遇到现有 Firebase 帐户已与 Apple 帐户关联的错误。发生这种情况时,将抛出Firebase.Auth.FirebaseAccountLinkException而不是标准的Firebase.FirebsaeException 。该异常包括UserInfo.UpdatedCredential属性,如果有效,可用于通过FirebaseAuth.SignInWithCredential登录 Apple 链接用户。更新后的凭证无需为登录操作生成新的 Apple 登录令牌和随机数。

    请注意, LinkWithCredentialAsync将继续在链接失败时抛出标准Firebase.FirebaseException ,因此无法返回更新的凭据。

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

在安卓上

在 Android 上,通过使用 Firebase SDK 将基于 Web 的通用 OAuth 登录集成到您的应用程序中,使用 Firebase 对您的用户进行身份验证,以执行端到端的登录流程。

要使用 Firebase SDK 处理登录流程,请按以下步骤操作:

  1. 构造一个FederatedOAuthProviderData实例,该实例配置了适用于 Apple 的提供程序 ID。

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. 可选:指定您希望从身份验证提供程序请求的默认值之外的其他 OAuth 2.0 范围。

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. 可选:如果要以英语以外的语言显示 Apple 的登录屏幕,请设置locale参数。有关支持的语言环境,请参阅Sign In with Apple 文档

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. 配置提供程序数据后,使用它来创建 FederatedOAuthProvider。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. 使用 Auth 提供程序对象向 Firebase 进行身份验证。请注意,与其他 FirebaseAuth 操作不同,这将通过弹出一个用户可以在其中输入其凭据的 Web 视图来控制您的 UI。

    要启动登录流程,请调用signInWithProvider

    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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. ReauthenticateWithProvider可以使用相同的模式,它可用于检索需要最近登录的敏感操作的新凭据。

    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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. 而且,您可以使用linkWithCredential()将不同的身份提供者链接到现有帐户。

    请注意,Apple 要求您在将用户的 Apple 帐户链接到其他数据之前获得用户的明确同意。

    例如,要将 Facebook 帐户链接到当前 Firebase 帐户,请使用从用户登录 Facebook 时获得的访问令牌:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

使用 Apple Notes 登录

与 Firebase Auth 支持的其他提供商不同,Apple 不提供照片 URL。

此外,当用户选择不与应用程序共享电子邮件时,Apple 会为该用户提供一个唯一的电子邮件地址(格式xyz@privaterelay.appleid.com ),并与您的应用程序共享。如果您配置了私人电子邮件中继服务,Apple 会将发送到匿名地址的电子邮件转发到用户的真实电子邮件地址。

Apple 仅在用户首次登录时与应用共享用户信息,例如显示名称。通常,Firebase 会在用户首次使用 Apple 登录时存储显示名称,您可以通过getCurrentUser().getDisplayName()获取。但是,如果您之前使用 Apple 将用户登录到应用程序而不使用 Firebase,Apple 将不会向 Firebase 提供用户的显示名称。

下一步

用户首次登录后,会创建一个新用户帐户并将其链接到凭据(即用户名和密码、电话号码或身份验证提供商信息),即用户登录时使用的凭据。这个新帐户作为 Firebase 项目的一部分存储,可用于在项目中的每个应用中识别用户,无论用户如何登录。

在您的应用程序中,您可以从 firebase::auth::user 对象获取用户的基本个人资料信息。请参阅管理用户

在您的 Firebase 实时数据库和云存储安全规则中,您可以从 auth 变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。