【问题标题】:Unity/Firebase How to authenticate using Google?Unity/Firebase 如何使用 Google 进行身份验证?
【发布时间】:2017-05-02 05:54:43
【问题描述】:

我正在尝试在我的 Unity 游戏项目中实现 Firebase 身份验证系统。一切都在网站的控制台面板上正确设置。我已阅读文档,但找不到使用 Unity 内 Firebase 中的任何 api 登录 Google 的方法。所以我为 Unity 购买了 Prime31 的 Play GameServices 插件。

这是我的问题:

  1. 如何在 Firebase 中使用 Google 进行身份验证?我需要自己管理 Google 登录吗?

  2. 在我找到的 Firebase 文档中:

“用户成功登录后,将访问令牌交换为 Firebase 凭据,并使用 Firebase 凭据向 Firebase 进行身份验证:”

Firebase.Auth.Credential credential = Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken); auth.SignInWithCredentialAsync(credential).ContinueWith(task => { //......// });

如何获取上面作为参数传递的 googleIdToken、googleAccessToken?

请帮助(使用代码)。我真的很喜欢 Firebase,并希望在没有任何第三方插件(如 PRIME31)的情况下使其工作。

【问题讨论】:

标签: c# android firebase unity3d firebase-authentication


【解决方案1】:

这是我的全部 Google 登录代码,带有 Firebase 身份验证和 GoogleSignIn 库:

private void SignInWithGoogle(bool linkWithCurrentAnonUser)
   {
      GoogleSignIn.Configuration = new GoogleSignInConfiguration
      {
         RequestIdToken = true,
         // Copy this value from the google-service.json file.
         // oauth_client with type == 3
         WebClientId = "[YOUR API CLIENT ID HERE].apps.googleusercontent.com"
      };

      Task<GoogleSignInUser> signIn = GoogleSignIn.DefaultInstance.SignIn();

      TaskCompletionSource<FirebaseUser> signInCompleted = new TaskCompletionSource<FirebaseUser>();
      signIn.ContinueWith(task =>
      {
         if (task.IsCanceled)
         {
            signInCompleted.SetCanceled();
         }
         else if (task.IsFaulted)
         {
            signInCompleted.SetException(task.Exception);
         }
         else
         {
            Credential credential = Firebase.Auth.GoogleAuthProvider.GetCredential(((Task<GoogleSignInUser>)task).Result.IdToken, null);
            if (linkWithCurrentAnonUser)
            {
               mAuth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(HandleLoginResult);
            }
            else
            {
               SignInWithCredential(credential);
            }
         }
      });
   }

该参数用于登录,目的是将新的 google 帐户与当前登录的匿名用户关联起来。如果需要,您可以忽略该方法的这些部分。另请注意,所有这些都是在正确初始化 Firebase 身份验证库后调用的。

我为 GoogleSignIn 使用了以下库:https://github.com/googlesamples/google-signin-unity

该链接中的自述文件页面将引导您逐步了解如何为您的环境进行此设置。在遵循这些并使用上面的代码之后,我可以在 android 和 iOS 上使用它。

这是上面代码中使用的SignInWithCredential方法:

private void SignInWithCredential(Credential credential)
   {
      if (mAuth != null)
      {
         mAuth.SignInWithCredentialAsync(credential).ContinueWith(HandleLoginResult);
      }
   }

mAuth 是对 FirebaseAuth 的引用:

mAuth = Firebase.Auth.FirebaseAuth.DefaultInstance;

【讨论】:

  • 嗨 Matthew,您的代码缺少“HandleLoginResult”参考。请问您应该发布整个代码吗?
  • 嘿@Matthew,现在已经一年多了,我很好奇这是否仍然适合你。我正在尝试做同样的事情,但无法让 Android 或 iOS 在我的编辑器上运行。这是否仅适用于构建而不是通过 Unity 编辑器? Android 错误为Exception: Field currentActivity or type signature not found,而iOS 错误为EntryPointNotFoundException: GoogleSignIn_Create
  • 我无法在上面编辑我的评论,所以我为其他好奇的人添加此评论。这仅适用于构建(AFAIK),不适用于 Unity 编辑器。我只能让它在实际设备上运行。
【解决方案2】:

简单的答案是,Unity 的 Firebase SDK 插件无法在 Unity 应用中完成 Google 的全部身份验证。我建议按照电子邮件/密码登录的说明开始。 https://firebase.google.com/docs/auth/unity/start

如果您真的希望 Google 登录(您可能会为发货标题这样做),这个示例应该会引导您完成它:https://github.com/googlesamples/google-signin-unity

关键是从 Google 获取 id 令牌(这是 Firebase 插件的一个单独步骤),然后将其传入。

我希望这会有所帮助(即使它不及时)!

【讨论】:

    【解决方案3】:

    首先,您需要使用 Google Sign in Unity 插件登录 Google,然后在登录后获取令牌并继续使用 Firebase 身份验证。你也可以试试这个资产http://u3d.as/JR6

    【讨论】:

      【解决方案4】:

      这是完成身份验证后从 firebase 获取访问令牌的代码

       FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
                  mUser.getToken(true)
                          .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                              @Override
                              public void onComplete(@NonNull Task<GetTokenResult> task) {
                                  if (dialog != null) {
                                      dialog.dismiss();
                                  }
                                  if (task.isSuccessful()) {
                                      String idToken = task.getResult().getToken();
                                      Log.i(getClass().getName(), "got access token :" + idToken);
                                  } else {
                                    // show logs
                                  }
                              }
                          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-11
        • 2018-10-19
        • 2018-07-03
        • 2021-02-08
        • 1970-01-01
        • 2022-01-12
        • 2021-04-14
        • 1970-01-01
        相关资源
        最近更新 更多