Оставайтесь в системе с помощью Google Unity firebase

#java #unity3d #firebase-authentication #google-signin

# #java #unity3d #firebase-аутентификация #google-вход

Вопрос:

Я создаю приложение. Я добавил вход в Google, и он работает нормально, но каждый раз, когда я закрываю его и запускаю приложение, оно выходит из системы. Пожалуйста, скажите мне, как оставаться в системе с помощью Google.

 using System; using
System.Collections; using System.Collections.Generic; using
System.IO; using System.Linq; using System.Threading.Tasks; using
Firebase; using Firebase.Auth; using Google; using UnityEngine;
using UnityEngine.UI; using UnityEngine.Networking;

public class GoogleSignInDemo : MonoBehaviour {
    public Text infoText;
    public Text Name;
    public Text Email;
    public RawImage ProfileImage;
    public RawImage ProfileImage1;
    public Button disable;
    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()
    {
        AddToInformation("Calling Disconnect");
        GoogleSignIn.DefaultInstance.Disconnect();
    }

    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("Canceled");
        }
        else
        {
            AddToInformation("Welcome: "   task.Result.DisplayName   "!");
            AddToInformation("Email = "   task.Result.Email);
            AddToInformation("Google ID Token = "   task.Result.IdToken);
            AddToInformation("ImageUrl = "   task.Result.ImageUrl);
            AddToInformation("Email = "   task.Result.Email);
            SignInWithGoogleOnFirebase(task.Result.IdToken);
            Name.text =  task.Result.DisplayName;
            Email.text = task.Result.Email;
            disable.enabled = false;
            PlayerPrefs.SetString("Name", task.Result.DisplayName);
            PlayerPrefs.SetString("Email", task.Result.Email);
            String stringUri;
            stringUri = task.Result.ImageUrl.ToString();
            PlayerPrefs.SetString("ImageURL", stringUri);
            StartCoroutine(DownloadImage(stringUri));


            IEnumerator DownloadImage(string MediaUrl)
            {
                UnityWebRequest request = UnityWebRequestTexture.GetTexture(MediaUrl);
                yield return request.SendWebRequest();
                if (request.isNetworkError || request.isHttpError)
                    Debug.Log(request.error);
                else
                    ProfileImage.texture = ((DownloadHandlerTexture)request.downloadHandler).texture;
                    ProfileImage1.texture = ((DownloadHandlerTexture)request.downloadHandler).texture;
            }

        }    
    }    

    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 amp;amp; (inner.ErrorCode != 0))
                    AddToInformation("nError code = "   inner.ErrorCode   " Message = "   inner.Message);
            }
            else
            {
                AddToInformation("Sign In Successful.");
            }
        });
    }

    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");    
    }

    private void AddToInformation(string str) { infoText.text  = "n"   str; }
}
 

Ответ №1:

Firebase автоматически сохраняет состояние аутентификации пользователя и пытается восстановить его при перезапуске приложения. Но поскольку для этого требуется вызов серверов, это может занять некоторое время, вам нужно будет прослушать AuthStateChanged событие, как показано в документации по получению текущего пользователя, вошедшего в систему:

 Firebase.Auth.FirebaseAuth auth;
Firebase.Auth.FirebaseUser user;

// Handle initialization of the necessary firebase modules:
void InitializeFirebase() {
  Debug.Log("Setting up Firebase Auth");
  auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
  auth.StateChanged  = AuthStateChanged;
  AuthStateChanged(this, null);
}

// Track state changes of the auth object.
void AuthStateChanged(object sender, System.EventArgs eventArgs) {
  if (auth.CurrentUser != user) {
    bool signedIn = user != auth.CurrentUser amp;amp; auth.CurrentUser != null;
    if (!signedIn amp;amp; user != null) {
      Debug.Log("Signed out "   user.UserId);
    }
    user = auth.CurrentUser;
    if (signedIn) {
      Debug.Log("Signed in "   user.UserId);
    }
  }
}

void OnDestroy() {
  auth.StateChanged -= AuthStateChanged;
  auth = null;
}
 

Теперь, когда приложение перезагружается, ваше AuthStateChanged приложение будет немедленно вызвано без текущего пользователя, а затем оно будет / может быть вызвано снова, как только состояние аутентификации пользователя будет восстановлено.