Я настроил сервер авторизации 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 или есть обходной путь?