如何使用 Firebase 统一创建 Facebook 登录?

Posted

技术标签:

【中文标题】如何使用 Firebase 统一创建 Facebook 登录?【英文标题】:How do I create a Facebook login in unity using Firebase? 【发布时间】:2018-12-26 17:25:21 【问题描述】:

所以我尝试使用 Firebase 进行统一并为我的项目创建 Facebook 登录。

我已遵循 firebase 文档和 Facebook 开发人员中的所有说明,包括将 SDK 导入我的项目并在 Facebook 登录中添加 appID keyhashes 单独工作正常,但一旦我尝试将其发送到 Firebase 以保留登录信息,我就会不断收到例外。

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Facebook.Unity;

public class facebookLogin : MonoBehaviour 

// Use this for initialization
void Awake()
        
        if (!FB.IsInitialized)
            
                // Initialize the Facebook SDK
                FB.Init(InitCallback, OnHideUnity);
            
            else
            
                // Already initialized, signal an app activation App Event
                FB.ActivateApp();
            
        
        private void InitCallback()
        
            if (FB.IsInitialized)
            
                // Signal an app activation App Event
                FB.ActivateApp();
                // Continue with Facebook SDK
                // ...
            
            else
            
                Debug.Log("Failed to Initialize the Facebook SDK");
            
        

        private void OnHideUnity(bool isGameShown)
        
            if (!isGameShown)
            
                // Pause the game - we will need to hide
                Time.timeScale = 0;
            
            else
            
                // Resume the game - we're getting focus again
                Time.timeScale = 1;
            
        
        public void FBlogin()
        
            List<string> permissions = new List<string>();
            permissions.Add("public_profile");
            permissions.Add("email");
            permissions.Add("user_friends");
            FB.LogInWithReadPermissions(permissions, AuthCallback);
        
        private void AuthCallback(ILoginResult result)
        
            if (FB.IsLoggedIn)
            
                Firebase.Auth.FirebaseAuth auth = 
Firebase.Auth.FirebaseAuth.DefaultInstance;
                List<string> permissions = new List<string>();

                // AccessToken class will have session details
                var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
                // Print current access token's User ID
                Debug.Log(aToken.TokenString);
                Debug.Log(aToken.UserId);


                Firebase.Auth.Credential credential =

Firebase.Auth.FacebookAuthProvider.GetCredential(aToken.TokenString);
                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);
                );
                // Print current access token's granted permissions
                //foreach(string perms in aToken.Permissions)
                //
                // Debug.Log(perms);
                //
            
            else
            
                Debug.Log("User cancelled login");
            
        
    

这里是我的例外:

SignInWithCredentialAsync encountered an error: System.AggregateException: Exception of type 'System.AggregateException' was thrown.
-----------------
Firebase.FirebaseException: An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address.

UnityEngine.Debug:LogError(Object)
facebookLogin:<AuthCallback>m__0(Task`1) (at Assets/Script/facebookLogin.cs:82)
System.Threading.Tasks.TaskCompletionSource`1:SetException(AggregateException)
Firebase.Internal.TaskCompletionSourceCompat`1:SetExceptionInternal(TaskCompletionSource`1, AggregateException)
Firebase.Internal.TaskCompletionSourceCompat`1:SetException(TaskCompletionSource`1, AggregateException)
Firebase.Auth.FirebaseAuth:CompleteFirebaseUserTask(Task`1, TaskCompletionSource`1)
Firebase.Auth.<SignInWithCredentialAsync>c__AnonStorey4:<>m__0(Task`1)
System.Threading.Tasks.TaskCompletionSource`1:SetException(Exception)
Firebase.Auth.<GetTask>c__AnonStorey0:<>m__0()
Firebase.Auth.Future_User:SWIG_CompletionDispatcher(Int32)
Firebase.AppUtilPINVOKE:PollCallbacks()
Firebase.AppUtil:PollCallbacks()
Firebase.Platform.FirebaseAppUtils:PollCallbacks()
Firebase.Platform.FirebaseHandler:Update()
Firebase.Platform.FirebaseMonoBehaviour:Update()

我不知道出了什么问题。 SignInWithCredentialAsync 似乎有问题,但我不知道如何解决。

【问题讨论】:

【参考方案1】:

我认为您的代码没有任何问题。正如错误所说,似乎有另一个帐户已经注册了您尝试登录的 Facebook 帐户的电子邮件。您的应用是否允许其他登录方式?

来自 Firebase 帮助:

您可以配置用户是否可以创建多个使用 相同的电子邮件地址,但链接到不同的登录方法。 例如,如果您不允许多个帐户使用同一电子邮件 地址,用户无法创建使用 电子邮件地址为 ex@gmail.com 的 Google 帐户(如果已有) 使用电子邮件地址 ex@gmail.com 和 密码。

链接:https://support.google.com/firebase/answer/6400716?hl=en

您可以在 Firebase 控制台中解决此问题。在Authentication &gt; Sign-in Method,向下滚动,您将看到“每个电子邮件地址多个帐户”部分。允许它,错误应该被修复。

【讨论】:

以上是关于如何使用 Firebase 统一创建 Facebook 登录?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 和 Unity?

使用 Google 登录通过 Firebase 签名后如何访问课堂 API

Firebase SDK 与 Facebook SDK 冲突

Firebase Facebook 登录即使在卸载应用程序后清除缓存和注销

统一的 Firebase 远程配置仅获取默认值而不是真实值

如何使用 firebase.com 创建 api 模拟器?