【问题标题】:How to detect idToken expiry?如何检测 idToken 过期?
【发布时间】:2019-12-10 06:01:44
【问题描述】:

我有一个登录页面,它使用以下方式对用户进行身份验证 signInWithEmailAndPassword() 使用 Javascript 客户端 SDK。

如果登录成功,用户将被重定向(连同 idToken)到会员页面。

在服务器端(nodejs 使用 firebase admin SDK),成员页面检查 idToken 的有效性,如果有效,它会从 Firebase 获取用户特定数据并将其显示在网页上。在会员页面上,有很多数据可供查看/编辑/删除等。因此用户可能会在此页面上花费超过一个小时并不是不可想象的。

我的问题是,我找不到检测 idToken 是否已过期的方法。理想情况下,我想刷新并获得一个新的 idToken。那可能吗?如果这不可能,我想在 idToken 过期时将用户重定向到登录页面。

但我无法弄清楚如何实现其中任何一个。当 idToken 过期时,看起来 onAuthStateChangedonIdTokenChanged 不会被触发。而且我无法像firebase.auth().currentUser.getIdToken(true) 那样执行 idToken 的 forceRefresh。因为在会员页面,firebase.auth().currentUser返回null。

关于如何处理这种情况有什么建议吗?

谢谢。

【问题讨论】:

    标签: javascript firebase firebase-authentication


    【解决方案1】:

    使用 Firebase Node.js Admin SDK,您可以通过将 checkRevoked 参数设置为 true 来在调用 verifyIdToken() 时检查已撤销或过期的 ID 令牌。

    verifyIdToken(idToken: string, checkRevoked?: boolean): Promise<DecodedIdToken>

    checkedRevoked布尔值
    是否检查 ID 令牌是否被撤销。这需要向 Firebase Auth 后端发出额外请求,以检查相应用户的 tokensValidAfterTime 时间。如果未指定,则不会应用此附加检查。

    admin.auth().verifyIdToken(idToken, true)
      .then(function(decodedToken) {
        let uid = decodedToken.uid;
        // ...
      }).catch(function(error) {
        // Handle error for expired ID token
      });
    

    或者,可以在客户端检查 ID 令牌负载声明。有关如何Verify ID tokens using a third-party JWT library 的文档显示了有效负载声明。

    exp 过期时间:必须在未来。时间以 UNIX 纪元以来的秒数为单位。

    jwt.io 引用支持客户端令牌验证的库。

    另见:How to decode the JWT encoded token payload on client-side in angular 5?

    【讨论】:

    • 但这不会是一个好的用户体验。假设用户输入了长文本并单击了更新按钮。然后我将向服务器发出 ajax 请求以保存该文本。只有当我收到响应时,我才会知道令牌已过期。有没有办法从客户端检测令牌是否已过期?
    • @SKT 答案更新了客户端令牌验证的信息。
    猜你喜欢
    • 2018-02-11
    • 2019-07-23
    • 2020-09-07
    • 2020-10-19
    • 2019-06-01
    • 2017-12-02
    • 1970-01-01
    • 2019-02-05
    • 2018-05-29
    相关资源
    最近更新 更多