Firebase Auth - 如何在没有当前用户对象的情况下刷新访问令牌

Firebase Auth - how to refresh access token without current user object

我正在通过以下方式使用从 firebase auth 获得的访问令牌访问我的后端:

  1. 通过电子邮件和密码登录
  2. 接收当前用户对象
  3. 从用户对象获取令牌
  4. 在本地存储令牌以允许进一步访问我的后端(使用 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;
    }