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

时间:2019-02-15 15:10:46

标签: firebase unity3d firebase-authentication firebase-admin

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

  1. 通过电子邮件和密码登录
  2. 接收当前用户对象
  3. 从用户对象获取令牌
  4. 将令牌存储在本地,以允许进一步访问我的后端(使用firebase admin验证令牌)

这是有效的,只要访问令牌是陈旧的即可。 如果应用程序保持打开状态并且可以捕获由于令牌过期而导致的403(我可以仅重用当前用户对象以获得新令牌),则这也可能会起作用。但是,如果令牌在关闭应用程序时过期,那么再次打开令牌(不再有用户对象)会导致用户重新输入其凭据,是吗?

我想到的一种方法是使用自定义令牌功能: 登录后,我可以将刷新令牌发送给客户端,然后刷新令牌将其存储并用于(自动)登录而不是使用凭据。 但是“习俗”一词使我认为我以某种方式走错了路。当然,必须有一种使用预期功能的简单方法。

有人可以帮我吗?

问候,

Codehai

1 个答案:

答案 0 :(得分:0)

使用此侦听器会自动刷新令牌,在编辑器中将无法使用

要使我的代码正常工作,我必须在所有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;
    }