是否可以使用无状态逻辑(无数据库)使令牌无效?
Is it possible to invalidate a token with stateless logic (no database)?
我需要服务器(无后端)和客户端之间的无服务器通信。客户要求令牌。当客户端使用此令牌发出请求时,后端会生成一个新令牌并将其发送回客户端。当客户端尝试使用先前的令牌发出请求时,后端会拒绝它。我不希望后端在 ram 或数据库中跟踪 valid/invalid 令牌的白名单或黑名单。允许后端进行静态查找 table or/and 静态 rule/algorithm 以在需要时执行此逻辑(以使用令牌有效负载中的信息)。
那么,是否有可能实现这样的目标?有没有办法在每个令牌中应用某种信息来知道您是否接受过一次?
也许你可以试试 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 秒内有效。所以你可能想决定管理令牌的有效性。
在您的场景中,服务器是无状态的(至少在身份验证方面),因此您不能使用服务器的状态来区分接收到的令牌是否已被使用。
此外,在您生成令牌的那一刻,它是在第一次使用之前,因此您不能向其中注入任何可以说明它是否被使用的信息:只是您当时没有该信息当然是时间。
所以基本上如果你唯一的信息容器是这两个(无状态服务器和自生成令牌)答案是否无论如何完成了;根本没有地方可以在信息生成的那一刻(在第一次使用时)放置这些信息(这个令牌是不是最后一个)。
从理论上讲,您可以将此信息发送给第三方实体,并在需要时要求返回.. ..但这只是作弊:如果您不接受 DB 或 RAM 或文件系统存储,我想通过 API 将此信息发送到某个地方 或者与其他选项一样只是一个被排除的选项。
我需要服务器(无后端)和客户端之间的无服务器通信。客户要求令牌。当客户端使用此令牌发出请求时,后端会生成一个新令牌并将其发送回客户端。当客户端尝试使用先前的令牌发出请求时,后端会拒绝它。我不希望后端在 ram 或数据库中跟踪 valid/invalid 令牌的白名单或黑名单。允许后端进行静态查找 table or/and 静态 rule/algorithm 以在需要时执行此逻辑(以使用令牌有效负载中的信息)。 那么,是否有可能实现这样的目标?有没有办法在每个令牌中应用某种信息来知道您是否接受过一次?
也许你可以试试 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 秒内有效。所以你可能想决定管理令牌的有效性。
在您的场景中,服务器是无状态的(至少在身份验证方面),因此您不能使用服务器的状态来区分接收到的令牌是否已被使用。
此外,在您生成令牌的那一刻,它是在第一次使用之前,因此您不能向其中注入任何可以说明它是否被使用的信息:只是您当时没有该信息当然是时间。
所以基本上如果你唯一的信息容器是这两个(无状态服务器和自生成令牌)答案是否无论如何完成了;根本没有地方可以在信息生成的那一刻(在第一次使用时)放置这些信息(这个令牌是不是最后一个)。
从理论上讲,您可以将此信息发送给第三方实体,并在需要时要求返回.. ..但这只是作弊:如果您不接受 DB 或 RAM 或文件系统存储,我想通过 API 将此信息发送到某个地方 或者与其他选项一样只是一个被排除的选项。