Unity/Firebase如何使用Google进行身份验证?

prdp8dxp  于 2022-12-19  发布在  Go
关注(0)|答案(5)|浏览(231)

我正在尝试在我的Unity游戏项目中实现Firebase认证系统。网站上的控制台面板上的一切都设置正确。我已经阅读了文档,但无法找到在Unity中使用Firebase中的任何API登录谷歌的方法。所以我购买了Prime31的Play GameServices插件。
以下是我的问题:
1.如何在Firebase中使用Google进行身份验证?我需要自己管理Google登录吗?
1.在Firebase文档中,我发现:
用户成功登录后,将访问令牌交换为Firebase凭据,并使用Firebase凭据向Firebase进行身份验证:
第一个月
如何获取作为上述参数传递的googleIdToken、googleAccessToken?
请帮助(与代码)。我真的很喜欢Firebase,并希望使它的工作没有任何第三方插件一样,PRIME31。

x6yk4ghg

x6yk4ghg1#

以下是我的Google登录代码w/ 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 Auth库之后调用的。
我在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;
eivnm1vs

eivnm1vs2#

答案很简单,因为Unity的Firebase SDK插件无法在Unity应用程序中完成Google的全部身份验证。我建议按照电子邮件/密码登录的说明开始。https://firebase.google.com/docs/auth/unity/start
如果你真的想登录Google(你可能会登录一个发布标题),这个例子应该会带你完成它:https://github.com/googlesamples/google-signin-unity
关键是从Google获取id令牌(这是与Firebase插件分开的一个步骤),然后将其传递进来。
我希望这能有所帮助(即使它不是及时的)!

beq87vna

beq87vna3#

对于从@Mathew Coats请求HandleLoginResult的用户,下面是用于处理after的函数。

private void HandleLoginResult(Task<FirebaseUser> task)
        {
            if (task.IsCanceled)
            {
                UnityEngine.Debug.LogError("SignInWithCredentialAsync was canceled.");
                return;
            }
            if (task.IsFaulted)
            {
                UnityEngine.Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception.InnerException.Message);
                return;
            }
            else
            {

                FirebaseUser newUser = task.Result;
                UnityEngine.Debug.Log($"User signed in successfully: {newUser.DisplayName} ({newUser.UserId})");
            }
        }
u5rb5r59

u5rb5r594#

首先,您需要使用Google Sign in Unity插件登录Google,然后,当您登录时,获取令牌并继续使用Firebase Auth。此外,您可以尝试此资产http://u3d.as/JR6

idv4meu8

idv4meu85#

下面是完成身份验证后从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
                            }
                        }
                    });

相关问题