Firebase Auth - 如何在没有当前用户对象的情况下刷新访问令牌
Firebase Auth - how to refresh access token without current user object
我正在通过以下方式使用从 firebase auth 获得的访问令牌访问我的后端:
- 通过电子邮件和密码登录
- 接收当前用户对象
- 从用户对象获取令牌
- 在本地存储令牌以允许进一步访问我的后端(使用 firebase admin 来验证令牌)
只要访问令牌过时,它就可以工作。
如果应用程序保持打开状态并且可以捕获由于令牌过期而导致的 403(我可以重用当前用户对象来获取新令牌),这也可能有效。但是,如果令牌在应用程序关闭时过期,再次打开它(不再有用户对象)会导致强制用户重新输入其凭据,对吗?
我想到的一种方法是使用自定义令牌功能:
我可以在登录后将刷新令牌发送给客户端,然后客户端存储它并使用它登录(以自动方式)而不是使用凭据。
但是 "custom" 这个词让我觉得我走错了路。肯定有一种简单的方法可以使用预期的功能来做到这一点。
谁能帮我解决这个问题?
你好,
码海
使用此侦听器会自动刷新令牌,在编辑器中不起作用。
为了让我的代码正常工作,我必须以某种方式在所有 Firebase 任务上添加 TaskScheduler.FromCurrentSynchronizationContext()..
void Start()
{
auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.IdTokenChanged += IdTokenChanged;
}
void IdTokenChanged(object sender, System.EventArgs eventArgs)
{
Firebase.Auth.FirebaseAuth senderAuth = sender as Firebase.Auth.FirebaseAuth;
if (senderAuth == auth && senderAuth.CurrentUser != null && !fetchingToken)
{
fetchingToken = true;
senderAuth.CurrentUser.TokenAsync(true).ContinueWith(
task =>
{
if (task.IsCanceled)
{
Debug.Log("canceled");
}
if (task.IsFaulted)
{
foreach (var errors in task.Exception.InnerExceptions)
{
Debug.Log(errors.InnerException.Message);
}
}
Debug.Log("New Token: " + task.Result);
// save task.Result
fetchingToken = false;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
private void OnDestroy()
{
auth.IdTokenChanged -= IdTokenChanged;
}
我正在通过以下方式使用从 firebase auth 获得的访问令牌访问我的后端:
- 通过电子邮件和密码登录
- 接收当前用户对象
- 从用户对象获取令牌
- 在本地存储令牌以允许进一步访问我的后端(使用 firebase admin 来验证令牌)
只要访问令牌过时,它就可以工作。 如果应用程序保持打开状态并且可以捕获由于令牌过期而导致的 403(我可以重用当前用户对象来获取新令牌),这也可能有效。但是,如果令牌在应用程序关闭时过期,再次打开它(不再有用户对象)会导致强制用户重新输入其凭据,对吗?
我想到的一种方法是使用自定义令牌功能: 我可以在登录后将刷新令牌发送给客户端,然后客户端存储它并使用它登录(以自动方式)而不是使用凭据。 但是 "custom" 这个词让我觉得我走错了路。肯定有一种简单的方法可以使用预期的功能来做到这一点。
谁能帮我解决这个问题?
你好,
码海
使用此侦听器会自动刷新令牌,在编辑器中不起作用。
为了让我的代码正常工作,我必须以某种方式在所有 Firebase 任务上添加 TaskScheduler.FromCurrentSynchronizationContext()..
void Start()
{
auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.IdTokenChanged += IdTokenChanged;
}
void IdTokenChanged(object sender, System.EventArgs eventArgs)
{
Firebase.Auth.FirebaseAuth senderAuth = sender as Firebase.Auth.FirebaseAuth;
if (senderAuth == auth && senderAuth.CurrentUser != null && !fetchingToken)
{
fetchingToken = true;
senderAuth.CurrentUser.TokenAsync(true).ContinueWith(
task =>
{
if (task.IsCanceled)
{
Debug.Log("canceled");
}
if (task.IsFaulted)
{
foreach (var errors in task.Exception.InnerExceptions)
{
Debug.Log(errors.InnerException.Message);
}
}
Debug.Log("New Token: " + task.Result);
// save task.Result
fetchingToken = false;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
private void OnDestroy()
{
auth.IdTokenChanged -= IdTokenChanged;
}