Я учусь интегрировать oauth2 в наш проект весенней загрузки, чтобы защитить наши API.Поэтому я начал с базового примера, который читал из spring-security-oauth2-boot , который работал хорошо, затем, когда я пытаюсь изменить кодировщик пароля, чтобы использовать любой кодер, который я не могу аутентифицировать.
Это моя AuthorizationServerConfiguration:
@Component
@EnableResourceServer
@EnableAuthorizationServer
class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
AuthenticationManager authenticationManager
AuthorizationServerConfiguration(AuthenticationConfiguration authenticationConfiguration) throws Exception {
this.authenticationManager = authenticationConfiguration.getAuthenticationManager()
}
@Override
void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("myclient")
//.secret("{noop}password") <-- this works
.secret("{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc")
.authorizedGrantTypes("client_credentials")
.scopes("all")
.accessTokenValiditySeconds(3600)
}
@Override
void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
}
}
Когда я использую {noop}password
, я могу успешно аутентифицироваться с помощью curl:
$ curl myclient:password@localhost:8080/oauth/token?scope=all -d grant_type=client_credentials
{"access_token":"4320fa79-38c2-45b1-a788-5ea1b5ce881a","token_type":"bearer","expires_in":3599,"scope":"all"}
Но когда я включаю любое хеширование, яЯ не могу подтвердить подлинность.Я попробовал этот способ аутентификации с помощью curl, но не повезло:
$ curl congero:5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc@localhost:8080/oauth/token?scope=all -d grant_type=client_credentials
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
$ curl congero:{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc@localhost:8080/oauth/token?scope=all -d grant_type=client_credentials
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
Также я добавил в код этот фрагмент для генерации пароля для двойной проверки, что дало мне другое хеширование, также проверенное с помощью curl итоже не повезло:
PasswordEncoder passwordEncoder = new Pbkdf2PasswordEncoder()
String encoded = passwordEncoder.encode('password')
println "PASSWORD: $encoded"
$ curl congero:91d1ee4784686a2e2a39c214f5a4b3ebb41e1206e2d1fc770d3ff146b034f8c156ea279c73aa1629@localhost:8080/oauth/token?scope=all -d grant_type=client_credentials
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
$ curl congero:{pbkdf2}91d1ee4784686a2e2a39c214f5a4b3ebb41e1206e2d1fc770d3ff146b034f8c156ea279c73aa1629@localhost:8080/oauth/token?scope=all -d grant_type=client_credentials
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
Я отладил исходный код Spring и обнаружил, что в кодировщиках паролей (Pbkdf2PasswordEncoder, а также в BcryptPasswordEncoder) пароль декодируется с помощью этого метода:
private byte[] decode(String encodedBytes) {
if(this.encodeHashAsBase64) {
return Base64.getDecoder().decode(encodedBytes);
}
return Hex.decode(encodedBytes);
}
Этот Hex.decode
выглядит виновником того, что пароли не совпадают, что не происходит при использовании {noop}
.
Есть идеи, что я здесь не так делаю?Я пропустил какой-то важный шаг?Документация мне не понятна, так как она не показывает, как постепенно настраивать конфигурацию.