是否可以使用无状态逻辑(无数据库)使令牌无效?

Posted

技术标签:

【中文标题】是否可以使用无状态逻辑(无数据库)使令牌无效?【英文标题】:Is it possible to invalidate a token with stateless logic (no database)? 【发布时间】:2021-02-16 22:22:55 【问题描述】:

我需要服务器(更少的后端)和客户端之间的无服务器通信。客户要求一个令牌。当客户端使用此令牌发出请求时,后端会生成一个新令牌并将其发送回客户端。当客户端尝试使用以前的令牌发出请求时,后端会拒绝它。我不希望后端在 ram 或数据库中跟踪有效/无效令牌的白名单或黑名单。如果需要,后端可以有一个静态查找表或/和一个静态规则/算法来执行此逻辑(以使用令牌有效负载中的信息)。 那么,是否有可能实现这样的目标?有没有办法在每个令牌中应用某种信息来知道你是否接受过一次?

【问题讨论】:

......否 【参考方案1】:

也许你可以试试 TOTP,https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm。这与用于 MFA 的算法相同。

这里是python实现,你也可以找到其他语言的实现。 https://pypi.org/project/pyotp/2.0.1/

后端:

    创建随机密钥并将其保存为静态数据库。 当客户端请求令牌时,使用随机密钥创建令牌(+base64 转换)并发送回客户端。 当您的服务器获得令牌时(-base64 转换)。使用相同的随机密钥验证收到的令牌。 totp 算法将确保旧令牌无效。

您的令牌通常有效期为 30 秒。因此您可能需要决定管理令牌的有效性。

【讨论】:

【参考方案2】:

    在您的场景中,服务器是无状态的(至少在身份验证方面),因此您无法使用服务器的状态来区分接收到的令牌是否已被使用。

    此外,在您生成令牌的那一刻,它是在第一次使用之前,因此您无法向其中注入任何表明它是否被使用的信息:当然,您当时没有该信息。

所以基本上,如果您唯一的信息容器是这两个(无状态服务器和自生成令牌),那么无论如何完成,答案都是;只是在生成信息的那一刻(在第一次使用时),没有地方可以放置这一位信息(这个令牌是否是最后一个)。

从理论上讲,您可以将此信息发送给第三方实体,并在需要时将其返回……但这只是作弊:如果您不接受数据库或 RAM 或文件系统存储,我想 通过 API 将这些信息发送到某处,否则只是与其他选项一样被排除在外的选项。

【讨论】:

以上是关于是否可以使用无状态逻辑(无数据库)使令牌无效?的主要内容,如果未能解决你的问题,请参考以下文章

何时应该实现刷新令牌以及如何保持无状态?

如果 oauth 是无状态的,谷歌如何销毁 oauth 令牌?

Kubernetes 学习12 kubernetes 存储卷

无状态令牌过期

OAuth 2.0。没有会议? (无国籍)

为啥 JWT 是无状态认证?