是否可以使用无状态逻辑(无数据库)使令牌无效?
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 令牌?