错误:Firebase ID令牌已过期

时间:2017-12-13 23:10:02

标签: firebase firebase-authentication

在我的服务器上,我在使用firebase admin sdk .verifyIdToken()

时看到了这些错误
  

Firebase ID令牌已过期。从您的客户端应用获取新的令牌,然后重试

     

Firebase ID令牌具有“kid”声明,该声明与已知的公钥不对应。很可能ID令牌已过期,因此请从您的客户端应用获取新令牌,然后重试。有关如何检索ID令牌的详细信息,请参阅https://firebase.google.com/docs/auth/admin/verify-id-tokens

在客户端,我在浏览器<>之间的每个请求之前执行此操作服务器:

firebase.auth().currentUser.getIdToken()

通过阅读文档,我的理解是此函数将获得有效的,未过期的令牌,因为后台的SDK将根据需要自行刷新。或者,我可以将true传递给此函数以强制刷新。

为什么这个getIdToken()函数似乎将过期的令牌发送到我的后端?

似乎要解决这个问题,我的选择是:

  1. 每次调用getIdToken()时,都会传入true强制刷新。这是不必要的昂贵,因为它将增加来自浏览器的整个往返网络请求的开销<>来自浏览器的请求之前的firebase<>我的服务器
  2. 以我现在的方式调用getIdToken() - 在客户端手动解码令牌,检查过期,如果过期,再次调用getIdToken(true)强制刷新并发送新刷新的令牌到我的服务器
  3. 2号是推荐/预期的方式来处理这个问题吗?看来这里有些不对劲......

7 个答案:

答案 0 :(得分:6)

上述提到的另一种可能的解决方案是您的浏览器(或系统)日期错误。几乎总是和日期有关吗?

答案 1 :(得分:5)

令牌通常在一小时后到期。如果缓存的令牌已过期,getIdToken将刷新缓存的令牌。当您需要将令牌发送到服务器时,请确保始终在客户端上调用它。如果您缓存令牌并始终将其发送到您的后端,它将在某个时候到期。

另外,以防万一,确保您的服务器时钟同步。由于某种原因,你的时钟可能不同步。

答案 2 :(得分:1)

comp_rev_long['check'] = comp_rev_long['key'].str.contains('|'.join(comp_rev_long['id']),case=False)

当设备时间错误时,您将收到此错误。还要检查您的设备时钟时间。

答案 3 :(得分:0)

尝试使用类似以下的内容:

Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in

/* your code to manage error and success */

}

答案 4 :(得分:0)

您是否注意到获取令牌的异步方式?

            mAuth.getCurrentUser().getIdToken(false).addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
            @Override
            public void onSuccess(GetTokenResult getTokenResult) {
                long time = System.currentTimeMillis() - starttime;

                Log.d("testt", "time " + time + ", token " + getTokenResult.getToken());
            }
        });

不确定,但是我想它会进行内部检查,并且令牌是否不再有效(例如,当前用户广播了刷新的令牌,并且由于某种原因未到达用户,网络问题例如),它请求新的并返回。

P.S。我也正在对此主题进行研究,如果会发现新内容,将会进行更新。

答案 5 :(得分:0)

如果您在后端使用令牌,则可以执行以下操作

1。检查后端令牌

2。如果令牌已过期,请发送401未经授权的邮件。

3。在客户端上,检查状态代码是否未经授权使用401,如果是,请致电group并保存新令牌

答案 6 :(得分:0)

在尝试一些错误前后,我都遇到了同样的问题,我发现这是由时间同步引起的。

我将计算机的时间和时区设置为自动,并解决了该问题。 另外,请记住在getIdToken(true)中添加“ true”