Сервер Spring OAuth2 не может обновить токен с потоком предоставления учетных данных (пароля) владельца ресурса - PullRequest
0 голосов
/ 28 декабря 2018

Я настроил сервер авторизации OAuth2 с oauth безопасности Spring с использованием токенов jwt:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

...
    @Override
    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource).passwordEncoder(passwordEncoder);
    }

    @Bean
    public ApprovalStore approvalStore() {
        return new JdbcApprovalStore(dataSource);
    }

    @Bean
    public TokenStore tokenStore() {
        var jwtTokenStore = new JwtTokenStore(tokenConverter());
        jwtTokenStore.setApprovalStore(approvalStore());
        return jwtTokenStore;
    }

    @Bean
    public JwtAccessTokenConverter tokenConverter() {
        var converter = new JwtAccessTokenConverter();
        var keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource(jwtKeyStore), jwtKeyPass.toCharArray());
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("jwtkey"));
        return converter;
    }

}

Есть клиент, который имеет права доступа password и refresh_token.Я могу получить доступ и обновить токены с помощью следующего запроса:

curl --request POST \
   --url 'http://localhost:8080/oauth/token?grant_type=password&scope=read' \
  --header 'authorization: Basic <xxxxxxx>' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data 'username=xxxxxxx&password=xxxxxxx'

Ответ:

{
    "access_token": "<long access token>",
    "token_type": "bearer",
    "refresh_token": "<long refresh token>",
    "expires_in": 599,
    "scope": "read",
    "subject": "xxx",
    "jti": "xxx"
}

Однако, когда я пытаюсь обновить токен, я получаю ошибку Invalid refresh token.Дальнейшая отладка в кодах Spring. Я вижу, что по первому запросу он не вставляет строку в таблицу oauth_approvals.И при втором запросе (обновлении токена) он думает, что пользователь не утвердил область (хотя у меня есть autoapprove=true).

Это не относится к implicit или authorization_code потоку предоставления: в этих случаях он вставляет строку в таблицу oauth_approvals, и токен успешно обновляется.

Это ошибка в Spring OAuth или есть обходной путь?

1 Ответ

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

Покопавшись в кодах Spring, я пришел к выводу, что это действительно ошибка.Поэтому я расширил JdbcApprovalStore и использовал это вместо этого.Вот псевдокод

public class JdbcApprovalStoreAutoApprove extends JdbcApprovalStore {
    ...
    @Override
    public List<Approval> getApprovals(String userName, String clientId) {
        if (client has auto approved scopes) {
            return those scopes;
        }
        return super.getApprovals(userName, clientId);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...