Firebase 3.x - 令牌/会话过期

49
有人知道这个令牌会在多长时间后过期吗?现在在控制台上没有设置令牌有效期的选项。
4个回答

60
自2016年5月起,Firebase身份验证登录会话不再过期。相反,它们使用长期有效的帐户令牌和短期自动刷新的访问/ID令牌的组合来获得最佳效果。
如果您想结束用户的会话,可以调用signOut()

2
我的令牌每小时过期一次,我已经在Firebase控制台中添加了SHA-1,并将令牌发送到我的自定义服务器进行验证。有谁可以帮我解释为什么我的过期时间只有一小时。 - Bikash
1
似乎这又改变了,现在令牌会在一段时间后过期。 - Incinerator
10
这个没有改变。登录会话不会过期。但是那些短暂的令牌(我想它们被称为 ID 令牌)只有一个小时有效期。当您使用 Firebase SDK 时,它会自动刷新这些短暂的令牌。 - Frank van Puffelen
4
由于 ID 令牌每小时过期一次,我们如何使用它们来对自定义服务器进行身份验证?我按照验证 id 令牌的说明在我的服务器上进行了操作,但是仅经过一个小时后,服务器就无法识别已登录的用户。 - django09
2
选项1:拦截响应并在令牌无效时刷新令牌并重新进行API调用。 - Giridhar Karnik
显示剩余3条评论

32

它会过期。在登录后一小时后,令牌ID将会过期。如果您尝试验证SDK,则会返回错误“Error: Firebase ID token has expired. Get a fresh token from your client app and try again. See https://firebase.google.com/docs/auth/server/verify-id-tokens 以获取有关如何检索ID令牌的详细信息。”

是否有一种方法可以更改Firebase令牌的过期时间,而不是自定义令牌。

了解其工作原理的任何人都可以回答这个问题。


遇到这个问题有什么解决办法吗? - Lion789
1
你可以始终使用 currentUser.getIdToken(),但我的问题是它返回一个 Promise :-/ 我不想在我的请求拦截器中进行异步操作... - ProblemsOfSumit
1
@ProblemsOfSumit,你可以将布尔值“false”作为参数传递给getIdToken,使其同步。 - geeky_monster

7

如果您仍然感到困惑,这里详细解释了所有内容

如果您的应用程序包括自定义后端服务器,则可以使用ID token与其安全通信,建议这样做。不要使用用户的原始UID发送请求,因为这可能会被恶意客户端轻松欺骗,而是发送用户的ID token, 可以通过Firebase Admin SDK(或者如果Firebase在您选择的语言中没有Admin SDK,则可以使用第三方JWT库)进行验证。为了实现这一点,现代的客户端SDK提供了方便的方法来检索当前已登录用户的ID token。 Admin SDK确保ID token有效,并返回解码后的token,其中包括其所属用户的UID以及添加到其中的任何自定义声明。


4
令牌仍在一小时后过期,这并没有解决这个问题。 - Andre Thiele

6
如果上面的回答仍然让您感到困惑,这是我所做的:
firebase.auth().onAuthStateChanged(async user => {
    if (user) {
        const lastSignInTime = new Date(user.metadata.lastSignInTime);
        const lastSignInTimeTimeStamp = Math.round(lastSignInTime.getTime() / 1000);
        const yesterdayTimeStamp = Math.round(new Date().getTime() / 1000) - (24 * 3600);
        if(lastSignInTimeTimeStamp < yesterdayTimeStamp){
          await firebase.auth().signOut()
          this.setState({
            loggedIn: false
          });
          return false;
        }
        this.setState({
          loggedIn: true,
          user
        });
      }
    })


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接