简体   繁体   English

unity Firebase Facebook auth on Android

[英]Unity Firebase Facebook auth on Android

Integrating facebook as an auth provider within firebase (already have a working gmail implementation).将 facebook 集成为 firebase 中的身份验证提供程序(已经有一个有效的 gmail 实现)。 The below code works fine in Unity, the FB SDK prompts for token, enter it manually, token is passed to firebase, login can be seen in the console, the required scene is then loaded.下面的代码在Unity中运行正常,FB SDK提示输入token,手动输入,token传递给firebase,在console中可以看到login,然后加载需要的场景。

When this is built onto an android device the full behavior doesnt happen, the correct Facebook token is received either from fresh login or existing login, we enter the SignInWithFacebookOnFirebase function to log this account into firebase and nothing else happens, sits on the debug of ("your token is " + aToken);当它构建在 android 设备上时,完整的行为不会发生,从新登录或现有登录接收到正确的 Facebook 令牌,我们输入 SignInWithFacebookOnFirebase function 以将此帐户登录到 firebase 并且没有其他任何事情发生,位于 ( “你的代币是” + aToken);

Im pretty sure it has something to do with the async behaviour and maybe not awaiting the task but im not sure what, any suggestions would be great !我很确定它与异步行为有关并且可能不等待任务但我不确定是什么,任何建议都会很棒!

using System.Collections.Generic;
using UnityEngine;
using Facebook.Unity;
using TMPro;
using UnityEngine.SceneManagement;
using Firebase.Auth;
using Firebase;
    
    public class FacebookAuth : MonoBehaviour
    {
        private FirebaseAuth auth;
        public TMP_Text debug; 
       void Awake ()
    {
      if (FB.IsInitialized) {
        FB.ActivateApp();
      } else {
        //Handle FB.Init
        FB.Init( () => {
          FB.ActivateApp();
        });
      }
      
      CheckFirebaseDependencies();
    }
    
       private void CheckFirebaseDependencies()
        {
            FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
            {
                if (task.IsCompleted)
                {
                    if (task.Result == DependencyStatus.Available)
                        auth = FirebaseAuth.DefaultInstance;
                    else
                        debug.text =("Could not resolve all Firebase dependencies: " + task.Result.ToString());
                }
                else
                {
                    debug.text =("Dependency check was not completed. Error : " + task.Exception.Message);
                }
            });
        }
    
    void OnApplicationPause (bool pauseStatus)
    {
      // Check the pauseStatus to see if we are in the foreground
      // or background
      if (!pauseStatus) {
        //app resume
        if (FB.IsInitialized) {
          FB.ActivateApp();
        } else {
          //Handle FB.Init
          FB.Init( () => {
            FB.ActivateApp();
          });
        }
      }
    }
        private void InitCallBack()
        {
            if(!FB.IsInitialized)
            {
                FB.ActivateApp();
            }
            else
            {
              //  debug.text=("Failed to initialize");
            }
        }
        private void OnHideUnity(bool isgameshown)
        {
            if(!isgameshown)
            {
                Time.timeScale = 0;
            }
            else
            {
                Time.timeScale = 1;
            }
        }    
    
        public void Facebook_Login()
        {
            var permission = new List<string>() { "public_profile", "email" };
            if (!FB.IsLoggedIn)
            {
            FB.LogInWithReadPermissions(permission, AuthCallBack);
            }
            else
            {
              var aToken = AccessToken.CurrentAccessToken.TokenString;
              debug.text=("already logged in - starting game" + aToken);  
              //THIS IS THE PROBLEM ON ANDROID - ITS NOT HAPPENING/async issue? 
              SignInWithFacebookOnFirebase(aToken); 
              
              SceneManager.LoadScene(1);
            }
        }
    
        public void LogOut()
        {
          FB.LogOut(); 
           debug.text=("Logged out of facebook");
        }
    
    
    
            private void SignInWithFacebookOnFirebase(string idToken)
        {
          
            Firebase.Auth.Credential credential = Firebase.Auth.FacebookAuthProvider.GetCredential(idToken);
            auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
              if (task.IsCanceled) {
                  Debug.LogError("SignInWithCredentialAsync was canceled.");
                  return;
              }
              if (task.Exception != null) {
                  Debug.LogWarning("SignInWithCredentialAsync encountered an error: " + task.Exception);
              
                FirebaseException firebaseEx = task.Exception.GetBaseException() as FirebaseException;
                AuthError errorCode = (AuthError)firebaseEx.ErrorCode;
                  string message = "Login Failed!";
                switch (errorCode)
                {
                    case AuthError.AccountExistsWithDifferentCredentials:
                        message = "Your account is already linked to an email address";
                        break;
                      //we can add other conditions here if required to catch exceptions 
                }
                debug.text=(message); 
              }
               else{
                            
    
              Firebase.Auth.FirebaseUser newUser = task.Result;
            
              Debug.LogFormat("User signed in successfully: {0} ({1})",
                  newUser.DisplayName, newUser.UserId);
                  debug.text=("Logged into facebook");  
                  
                
              }
               });
            
        }

    
        private void AuthCallBack(ILoginResult result)
        {
            if(FB.IsLoggedIn)
            {
                var aToken = result.AccessToken.TokenString;
                
                debug.text=("your token is " + aToken); 
                  //THIS IS THE PROBLEM ON ANDROID - ITS NOT HAPPENING/async issue? 
                SignInWithFacebookOnFirebase(aToken); 
                debug.text=("weve signed into firebase");
              
                SceneManager.LoadScene(1);
                
            }
            else
            {
                debug.text=("User Cancelled login");
            }
        }
    
    
    }

EDIT - So the problem is nothing to do with async, its the fact that the firebase credential is being persisted on the mobile device.编辑 - 所以问题与异步无关,事实是 firebase 凭证被保留在移动设备上。 I uncommented all of my already working google auth code below and we log into firebase with our facebook creds fine!我在下面取消注释我所有已经工作的谷歌授权代码,我们用我们的 facebook 登录到 firebase 很好! So i need some method of clearing our this token when A) the user logs out and B) the user closes the app (Cleanly or uncleanly) Any help would be great !所以我需要一些方法来清除我们的这个令牌,当 A)用户注销和 B)用户关闭应用程序(干净或不干净)任何帮助都会很棒!

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Firebase;
    using Firebase.Auth;
    using Google;
    using TMPro;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class GoogleAuth : MonoBehaviour
    {  /*
        public TMP_Text infoText;
        public string webClientId = "<your client id here>";
    
        private FirebaseAuth auth;
        private GoogleSignInConfiguration configuration;
    
        private void Awake()
        {
            configuration = new GoogleSignInConfiguration { WebClientId = webClientId, RequestEmail = true, RequestIdToken = true };
            CheckFirebaseDependencies();
        }
    
        private void CheckFirebaseDependencies()
        {
            FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
            {
                if (task.IsCompleted)
                {
                    if (task.Result == DependencyStatus.Available)
                        auth = FirebaseAuth.DefaultInstance;
                    else
                        AddToInformation("Could not resolve all Firebase dependencies: " + task.Result.ToString());
                }
                else
                {
                    AddToInformation("Dependency check was not completed. Error : " + task.Exception.Message);
                }
            });
        }
    
        public void SignInWithGoogle() { OnSignIn(); }
        public void SignOutFromGoogle() { OnSignOut(); }
    
        private void OnSignIn()
        {
            GoogleSignIn.Configuration = configuration;
            GoogleSignIn.Configuration.UseGameSignIn = false;
            GoogleSignIn.Configuration.RequestIdToken = true;
            AddToInformation("Calling SignIn");
    
            GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnAuthenticationFinished);
            
        }
    
        private void OnSignOut()
        {
            AddToInformation("Calling SignOut");
            GoogleSignIn.DefaultInstance.SignOut();
            
        }
    
        public void OnDisconnect()
        {
            
            GoogleSignIn.DefaultInstance.Disconnect();
            infoText.text=("signed out");
        }
    
        internal void OnAuthenticationFinished(Task<GoogleSignInUser> task)
        {
            if (task.IsFaulted)
            {
                using (IEnumerator<Exception> enumerator = task.Exception.InnerExceptions.GetEnumerator())
                {
                    if (enumerator.MoveNext())
                    {
                        GoogleSignIn.SignInException error = (GoogleSignIn.SignInException)enumerator.Current;
                        AddToInformation("Got Error: " + error.Status + " " + error.Message);
                    }
                    else
                    {
                        AddToInformation("Got Unexpected Exception?!?" + task.Exception);
                    }
                }
            }
            else if (task.IsCanceled)
            {
                AddToInformation("Cancelled");
            }
            else
            {
                AddToInformation("Welcome: " + task.Result.DisplayName + "!");
                AddToInformation("Email = " + task.Result.Email);
                //AddToInformation("Google ID Token = " + task.Result.IdToken);
                AddToInformation("Email = " + task.Result.Email);
                SignInWithGoogleOnFirebase(task.Result.IdToken);
                
            }
        }
    
        private void SignInWithGoogleOnFirebase(string idToken)
        {
            Credential credential = GoogleAuthProvider.GetCredential(idToken, null);
    
            auth.SignInWithCredentialAsync(credential).ContinueWith(task =>
            {
                AggregateException ex = task.Exception;
                if (ex != null)
                {
                    if (ex.InnerExceptions[0] is FirebaseException inner && (inner.ErrorCode != 0))
                        AddToInformation("\nError code = " + inner.ErrorCode + " Message = " + inner.Message);
                }
                else
                {
                    AddToInformation("Sign In Successful.");
                    SceneManager.LoadScene(1);
                }
            });
        }
    
        public void OnSignInSilently()
        {
            GoogleSignIn.Configuration = configuration;
            GoogleSignIn.Configuration.UseGameSignIn = false;
            GoogleSignIn.Configuration.RequestIdToken = true;
            AddToInformation("Calling SignIn Silently");
    
            GoogleSignIn.DefaultInstance.SignInSilently().ContinueWith(OnAuthenticationFinished);
        }
    
        public void OnGamesSignIn()
        {
            GoogleSignIn.Configuration = configuration;
            GoogleSignIn.Configuration.UseGameSignIn = true;
            GoogleSignIn.Configuration.RequestIdToken = false;
    
            AddToInformation("Calling Games SignIn");
    
            GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnAuthenticationFinished);
        }
    
        private void AddToInformation(string str) { infoText.text += "\n" + str; } */
    }

this is solved, it was because i was checking that the firebase dependences existed in both these scripts and it was throwing an exception.这已解决,这是因为我正在检查这两个脚本中是否存在 firebase 依赖项,并且它抛出异常。 I found this using the logcat logs \adb logcat -s Unity ActivityManager PackageManager dalvikvm DEBUG我发现这个使用 logcat 日志 \adb logcat -s Unity ActivityManager PackageManager dalvikvm DEBUG

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android Firebase Auth Facebook 如何在Kotlin注销更改facebook账户? - Android Firebase Auth Facebook how to sign out to change facebook account in Kotlin? RN Facebook auth with Firebase - 没有创建 Firebase App '[DEFAULT]' - RN Facebook auth with Firebase - No Firebase App '[DEFAULT]' has been created Firebase 如果帐户已经存在并且与 Google Auth 关联,则使用 Facebook 的 Auth 失败 - Firebase Auth with Facebook fails if the account already exists and is associated with a Google Auth 使用 Firebase.Auth; Unity 不认为这是有效的 - using Firebase.Auth; Unity does not recognize this as valid Ionic / Angular / Capacitor / Firebase Facebook 基于身份验证和角色的身份验证 - Ionic / Angular / Capacitor / Firebase Facebook Auth & role based authentification 如何在Android上自定义Firebase Auth域 - How to customize Firebase Auth domain on Android 苹果登录 android FireBase Auth 有问题 - Apple login in android with FireBase Auth has problem Firebase Phone Auth on Android APK 发行版 - Firebase Phone Auth on Android APK Release Version Unity Firebase 消息未在 Android 4.1.2 上初始化 - Unity Firebase messaging not initialising on Android 4.1.2 Android Firebase Oauth Facebook 无法在片段中工作 - Android Firebase Oauth Facebook not working in fragment
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM