我有 2 个关于 Spring 授权服务器 OAuth2 客户端创建的问题,这可能听起来很愚蠢。
问题1:
在Spring授权服务器的例子中我看到了“{noop}secret”。下面的代码中的“{noop”} 应该做什么?
RegisteredClient.withId(UUID.randomUUID().toString())
.clientId(clientId)
.clientSecret("{noop}"+secret). //<-- this
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
.scope(OidcScopes.OPENID)
.scope(OidcScopes.PROFILE)
我没有创建任何 BCryptPasswordEncoder 等 bean,所以听起来我需要声明该类型的 bean。在保存 OAuth2 客户端时,我是否需要以编程方式对秘密进行编码,如下所示:
.clientSecret(bcryptPassword.encode(secret)). // like that?
问题2: 几个月前我创建了一个 OAuth2 客户端,现在我不再记得这个秘密了。当我查看数据库时,它采用 bcrypt 形式“{bcrypt}$2a$...”,我不知道它是如何变成这个值的。我相信它在“{noop}mysecretvalue”中。
谢谢你
问题1:
如果您不想在将密码保存到存储库时对其进行编码,可以通过在您的密码中添加前缀
{noop}
来实现。当您执行此操作时,Spring 在将用户提供的密码与您配置的密码进行比较时,将在后台使用 NoOpPasswordEncoder
。
如果您使用
BCryptPasswordEncoder
,则必须按照您已经提到的方式对密码进行编码。
例如:
clientSecret(bcryptPasswordEncoder.encode(secret))
但是,
NoOpPasswordEncoder
已被弃用,Spring 建议使用自适应单向编码函数,如Bcrypt
。
问题2:
这是由于 Spring 授权服务器中的
UpgradeEncoding
功能而发生的。当您稍后声明 BCryptPasswordEncoder
bean 时,如果您之前在存储库中保存了 {noop}secret
,则此功能会将其解释为您已升级密码编码器,现在您想要升级密钥。所以它会相应地升级你的秘密。如果您仍然想在不编码的情况下使用机密,则应该专门声明一个 NoOpPasswordEncoder
bean。您可以在此处阅读更多相关信息。