我是 Unity 的菜鳥,我正在嘗試使用 Firebase 創建電子郵件和密碼身份驗證。我正在嘗試創建一個場景,如果客戶端離線(尤其是在沒有連接的區域),客戶端應該能夠離線登錄。有沒有辦法做到這一點?
下面是我從這里提取的代碼。
using System;
using System.Collections.Generic;
using Firebase.Extensions;
using UnityEngine;
using UnityEngine.SceneManagement;
[CreateAssetMenu]
public class AuthManager : ScriptableObject
{
// Firebase Authentication instance.
protected Firebase.Auth.FirebaseAuth auth;
// Firebase User keyed by Firebase Auth.
protected Dictionary<string, Firebase.Auth.FirebaseUser> userByAuth =
new Dictionary<string, Firebase.Auth.FirebaseUser>();
// Flag to check if fetch token is in flight.
private bool fetchingToken = false;
// Handle initialization of the necessary firebase modules:
public void InitializeFirebase()
{
Debug.Log("Setting up Firebase Auth");
auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.StateChanged = AuthStateChanged;
auth.IdTokenChanged = IdTokenChanged;
AuthStateChanged(this, null);
}
// Track state changes of the auth object.
void AuthStateChanged(object sender, System.EventArgs eventArgs)
{
Firebase.Auth.FirebaseAuth senderAuth = sender as Firebase.Auth.FirebaseAuth;
Firebase.Auth.FirebaseUser user = null;
if (senderAuth != null) userByAuth.TryGetValue(senderAuth.App.Name, out user);
if (senderAuth == auth && senderAuth.CurrentUser != user)
{
bool signedIn = user != senderAuth.CurrentUser && senderAuth.CurrentUser != null;
if (!signedIn && user != null)
{
Debug.Log("Signed out " user.UserId);
SceneManager.LoadScene("SignInScene");
}
user = senderAuth.CurrentUser;
userByAuth[senderAuth.App.Name] = user;
if (signedIn)
{
Debug.Log("Signed in " user.DisplayName);
DisplayDetailedUserInfo(user, 1);
SceneManager.LoadScene("MainScene");
}
}
else
{
SceneManager.LoadScene("SignInScene");
}
}
// Track ID token changes.
void IdTokenChanged(object sender, System.EventArgs eventArgs)
{
Firebase.Auth.FirebaseAuth senderAuth = sender as Firebase.Auth.FirebaseAuth;
if (senderAuth == auth && senderAuth.CurrentUser != null && !fetchingToken)
{
senderAuth.CurrentUser.TokenAsync(false).ContinueWithOnMainThread(
task => Debug.Log(String.Format("Token[0:8] = {0}", task.Result.Substring(0, 8))));
}
}
// Display a more detailed view of a FirebaseUser.
protected void DisplayDetailedUserInfo(Firebase.Auth.FirebaseUser user, int indentLevel)
{
string indent = new String(' ', indentLevel * 2);
DisplayUserInfo(user, indentLevel);
Debug.Log(String.Format("{0}Anonymous: {1}", indent, user.IsAnonymous));
Debug.Log(String.Format("{0}Email Verified: {1}", indent, user.IsEmailVerified));
Debug.Log(String.Format("{0}Phone Number: {1}", indent, user.PhoneNumber));
var providerDataList = new List<Firebase.Auth.IUserInfo>(user.ProviderData);
var numberOfProviders = providerDataList.Count;
if (numberOfProviders > 0)
{
for (int i = 0; i < numberOfProviders; i)
{
Debug.Log(String.Format("{0}Provider Data: {1}", indent, i));
DisplayUserInfo(providerDataList[i], indentLevel 2);
}
}
}
// Display user information.
protected void DisplayUserInfo(Firebase.Auth.IUserInfo userInfo, int indentLevel)
{
string indent = new String(' ', indentLevel * 2);
var userProperties = new Dictionary<string, string> {
{"Display Name", userInfo.DisplayName},
{"Email", userInfo.Email},
{"Photo URL", userInfo.PhotoUrl != null ? userInfo.PhotoUrl.ToString() : null},
{"Provider ID", userInfo.ProviderId},
{"User ID", userInfo.UserId}
};
foreach (var property in userProperties)
{
if (!String.IsNullOrEmpty(property.Value))
{
Debug.Log(String.Format("{0}{1}: {2}", indent, property.Key, property.Value));
}
}
}
// Clean up auth state and auth.
void OnDestroy()
{
auth.StateChanged -= AuthStateChanged;
auth = null;
}
}
uj5u.com熱心網友回復:
用戶離線時無法驗證任何憑據,因此對于大多數提供商而言,離線時登錄不是一種選擇。signIn...唯一可以在離線時滿足呼叫的內置提供程式是匿名身份驗證提供程式。
當用戶過去已經登錄并正在重新啟動應用程式時,情況就不同了。AuthStateListener在這種情況下,Firebase 假定用戶仍處于登錄狀態,即使在離線時也會設定當前用戶并觸發事件。重新建立連接后,它將重新驗證用戶憑據,例如檢查帳戶是否已暫停。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/438288.html
