在阅读您的问题时,我尝试在 Internet 上搜索不记名令牌是如何加密或签名的,但没有成功。我猜不记名令牌没有经过哈希处理(可能是部分,但不是完全),因为在这种情况下,将无法解密它并从中检索用户属性。
但是您的问题似乎是试图找到有关 Bearer 令牌功能的答案:
假设我正在实现一个授权提供程序,我可以为不记名令牌提供任何类型的字符串吗?可以是随机字符串吗?它是否必须是某些属性的 base64 编码?应该散列吗?
因此,我将尝试解释 Bearer 令牌和 Refresh 令牌的工作原理:
当用户通过 SSL 向服务器请求令牌发送用户和密码时,服务器返回两件事:访问令牌和刷新令牌。
访问令牌是一个不记名令牌,您必须将其添加到所有请求标头中才能作为具体用户进行身份验证。
Authorization: Bearer <access_token>
访问令牌是包含您希望的所有用户属性、声明和角色的加密字符串。(如果您添加更多角色或声明,您可以检查令牌的大小是否增加)。一旦资源服务器接收到访问令牌,它将能够解密它并读取这些用户属性。这样,用户将与所有应用程序一起被验证和授予。
访问令牌的有效期很短(即 30 分钟)。如果访问令牌的有效期很长,那将是一个问题,因为理论上不可能撤销它。所以想象一个角色=“Admin”的用户更改为“用户”。如果用户使用 role="Admin" 保留旧令牌,他将能够使用管理员权限访问令牌,直到令牌到期。这就是为什么访问令牌的有效期很短。
但是,想到一个问题。如果访问令牌的有效期很短,我们必须每隔很短的时间发送用户和密码。这安全吗?不,不是。我们应该避免它。那时刷新令牌似乎解决了这个问题。
刷新令牌存储在数据库中,有效期较长(例如:1 个月)。
用户可以使用用户在第一次令牌请求中收到的刷新令牌获取新的访问令牌(例如,当它过期时,每 30 分钟一次)。当访问令牌过期时,客户端必须发送一个刷新令牌。如果数据库中存在此刷新令牌,则服务器将向客户端返回一个新的访问令牌和另一个刷新令牌(并将用新的刷新令牌替换旧的刷新令牌)。
如果用户访问令牌已被泄露,则必须从数据库中删除该用户的刷新令牌。这样,令牌将仅在访问令牌过期之前有效,因为当黑客尝试获取发送刷新令牌的新访问令牌时,此操作将被拒绝。