【问题标题】:Do I have to verify a JWT token per request?我是否必须为每个请求验证 JWT 令牌?
【发布时间】:2020-06-08 16:25:54
【问题描述】:

我们有一个 API,我们有几个客户端应用程序(app、webapp 等)。

我们正在使用 Firebase 身份验证 (https://firebase.google.com/docs/auth/admin/verify-id-tokens);我很容易验证在我的客户端 SDK 上生成的 JWT 令牌的完整性,但是,我面临一个小问题。

每个请求,我们在 HTTP 标头中传递一个身份验证令牌/jwt 令牌,以确保每个调用都经过身份验证。这会产生大量开销,因为每个令牌完整性检查平均占用大约 200-400 毫秒。

我正在考虑将密钥存储在内存中或具有 (exp) 到期时间的东西中,但我不确定这是否是一个很好的解决方案。我只会用给出的一大串密钥来验证密钥,当密钥到期日期清除时,它就会清除。

我应该如何处理这个问题?有没有办法绕过时间开销?

谢谢!

【问题讨论】:

    标签: python firebase firebase-authentication jwt firebase-admin


    【解决方案1】:

    时间真的花在验证令牌上吗?您可能想看看是否可以准确地看到它的去向,因为解码令牌应该非常快。但是,如果您每次都在检索帐户的公钥,那当然可以部分解释。

    除此之外,缓存exp 或令牌的任何其他解码信息没有任何问题,只要该令牌未过期。事实上,这是一个相当标准的空间与时间权衡。请记住,您将为那里的每个令牌使用内存,因此随着您获得更多并发用户,这将累加。

    【讨论】:

    • 我们使用 Python Admin SDK 对令牌进行解码。我们根据 JWT 令牌中的 JSON 数据生成一个 dict,并使用 JSON 响应返回它。我将检查我们是否正在做任何耗时或占用大量 CPU 的事情,以及仅验证令牌。
    • 我正在检查 check_revoked=True。使用 check_revoked=False,大约需要 60-90ms。
    • 啊哈,检查它的撤销肯定需要一段时间,因为它需要主动检查服务器。最好将 JWT 视为不记名令牌,并假设如果它们没有过期,它们是有效的。据我所知,这就是所有(大多数?)Google 服务所做的。
    • 我明白了,它们的实现方式应该始终有效,因此将它们视为 Bearer 令牌可能是可行的方法。我真的不喜欢验证 JWT 令牌完整性所需的 60-90 毫秒时间。可能我无能为力,我猜是计算复杂度和 Python 瓶颈。
    • 如果你实现了你提到的缓存,你只需要在第一次得到它时解码一个令牌。之后,您可以将传入的令牌与缓存进行比较(这可能会快很多),使用令牌本身作为键。
    猜你喜欢
    • 2021-09-17
    • 2016-07-05
    • 2016-03-29
    • 2019-04-02
    • 2020-11-09
    • 2019-07-12
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多