Auth 服务器上的 Oauth2 哈希令牌

Oauth2 hash token on Auth Server

我正在使用 Spring Security Oauth2 实现 Auth 服务器。我注意到,当 spring security 保存访问令牌(使用 JdbcTokenStore)时,OAuth2AccessToken 被序列化为这意味着访问令牌本身被保存为纯文本。我对此有几个问题。

1.) 从未使用访问令牌值实际检索令牌。它是使用令牌 ID 检索的。这是为什么?

2.) 是否可以散列此令牌,因为它永远不会使用它的值检索?

3.) 我们真的需要生成令牌 ID 吗?我们能否将额外的信息从资源服务器传递到身份验证服务器以检索令牌并根据哈希对其进行验证?

默认情况下 Spring 以纯文本形式存储令牌。如果您在同一个浏览器中再次请求获取令牌,您会注意到 Spring 将 return 相同的令牌,只要它仍然有效。

1) 这并不完全正确。在资源服务器上,从 header 中读取令牌并创建 PreAuthenticatedAuthenticationToken。通过几个步骤,令牌值用于创建 OAuth2Authentication。密钥是一个中间步骤,但只有在您将令牌解析为 OAuth2AccessToken 之后(参见 TokenStore.readAccessToken()

2) 就我个人而言,我会先对令牌进行哈希处理,然后再将其存储到数据库中!然而,这确实需要您 implement/extend 一个 TokenStore,因为您需要覆盖 TokenStore.storeAccessToken() 来保存散列值,并且 TokenStore.readAccessToken() 来散列传入的令牌并在数据库中查找散列。

3) 通常,身份验证服务器和资源服务器读取同一个数据库,并且都以标识用户的 OAuth2Authentication 结束。如果你想散列,你只需要实现上面描述的store/read方法。

我在 1½ 年前用 Spring Oauth2 实现了这样的解决方案,因此散列令牌和刷新令牌不太可能。在我们的例子中,我们最终没有使用来自 Spring Oauth2 的资源服务器实现,因为我们每分钟收到 20K 个请求,我们想延迟解析令牌直到请求被验证,并使用多层缓存来避免在每次请求时都访问数据库。