【问题标题】:Oauth2 hash token on Auth Server身份验证服务器上的 Oauth2 哈希令牌
【发布时间】:2023-03-04 13:21:01
【问题描述】:

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

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

2.) 是否可以对这个令牌进行哈希处理,因为它永远不会使用它的值来检索?

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

【问题讨论】:

    标签: spring spring-security oauth oauth-2.0 spring-security-oauth2


    【解决方案1】:

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

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

    2) 我个人会在将令牌存储到数据库之前对其进行哈希处理!但是,这确实需要您实现/扩展 TokenStore,因为您需要覆盖 TokenStore.storeAccessToken() 以保存散列值,并覆盖 TokenStore.readAccessToken() 以散列传入的令牌并在数据库中查找散列。

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

    我在 1½ 前使用 Spring Oauth2 实现了这样的解决方案,因此哈希令牌和刷新令牌是可能的。在我们的例子中,我们最终没有使用 Spring Oauth2 中的资源服务器实现,因为我们每分钟收到 20K 请求,我们希望延迟解析令牌,直到请求得到验证,并使用多层缓存来避免命中数据库对每个请求。

    【讨论】:

    • 在您的解决方案中,您是否使用了一种方式散列?如果是这样,您是如何检索令牌的?
    • 哈希总是一种方式,原理和普通密码哈希一样。您给客户端未散列的令牌,当您在请求中收到未散列的令牌时,您对其进行散列并检查您是否有具有相同值的未过期散列。如果您使用 UUID 作为令牌,则不需要使用盐,并且可以使用单个 sha-256 哈希,因为 UUID 的熵远大于常规密码。
    猜你喜欢
    • 2020-01-16
    • 2015-11-02
    • 1970-01-01
    • 2014-12-01
    • 2016-04-19
    • 1970-01-01
    • 2022-08-16
    • 2021-05-12
    • 2020-03-03
    相关资源
    最近更新 更多