Не удается пройти проверку подлинности на сервере авторизации Spring oauth с зашифрованным паролем - PullRequest
0 голосов
/ 25 января 2019

Я учусь интегрировать 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}.

Есть идеи, что я здесь не так делаю?Я пропустил какой-то важный шаг?Документация мне не понятна, так как она не показывает, как постепенно настраивать конфигурацию.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете использовать DelegatingPasswordEncoder, что

Кодер пароля, который делегирует другому на основе PasswordEncoder по префиксному идентификатору.

Формат хранения пароля

Общий формат пароля: {id}encodedPassword

Такой, что "id" - это идентификатор, используемый для поиска, какой PasswordEncoder следует использовать, и "encodedPassword" - это оригинальный кодированный пароль для выбранного PasswordEncoder. «Идентификатор» должен быть в начале пароль, начинайте с "{" и заканчивайте "}". Если «идентификатор» не может быть найдено, "id" будет нулевым. Например, следующее может быть список паролей, закодированных с использованием разных «id». Все оригинал пароли являются «паролем».

{Bcrypt} $ 2a $ 10 $ dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM / BG
{} Noop пароль {} PBKDF2 5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc

Для кодирования DelegatingPasswordEncoder, который мы создали выше:

  • Первый пароль будет иметь идентификатор PasswordEncoder "bcrypt" и кодированный пароль "$ 2a $ 10 $ dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM / BG". когда совпадение его делегировало бы BCryptPasswordEncoder.
  • Второй делегировал бы NoOpPasswordEncoder.
  • Третий пароль будет делегирован Pbkdf2PasswordEncoder.

Сопоставление пароля осуществляется на основе идентификатора и сопоставления "id" для PasswordEncoder, предоставленного в конструкторе.

Таким образом, чтобы заставить это работать, вы должны объявить bean-компонент PasswordEncoder (и в основном вы можете без проблем переключаться между кодировщиками паролей, вы получаете бесплатную миграцию для каждого нового созданного пользователя!):

@Bean
PasswordEncoder passwordEncoder(){
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
0 голосов
/ 25 января 2019

Когда вы включаете хеширование, это не значит, что вам нужно передавать закодированный пароль в вашей команде curl, просто введите «password», и пружина закодирует его и сравнит с

"{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc"

вам нужен бин типа Pbkdf2PasswordEncoder, поэтому пружина будет использовать при хешировании и сравнении

...