Я установил сервер авторизации OAuth2.0, который подключился к базе данных с помощью JDBC и хочу повторно использовать токен обновления. Тем не менее, когда я пытался запросить новый токен доступа, он возвращает сообщение об ошибке и регистрирует «ORA-00001: уникальное ограничение»
Я искал в интернете, но не могу найти решение, может кто-нибудь сказать мне, где проблема?
Воспроизвести его:
(1) запрос на AccessToken: a1 и RefreshToken: r1 -> успешный
сообщение журнала
2019-10-02 11: 37: 02.842 ОТЛАДКА 78 csomsuCustomUserDetailsService.findUserFromDatabase (): найдено пользователь БД 2019-10-02 11: 37: 02.962 ИНФОРМАЦИЯ 28 csocJwtTokenEnhancer.enhance (): расширение (accessToken, аутентификация) выполняется ... 2019-10-02 11: 37: 02.980 ОТЛАДКА 49 csocJwtTokenEnhancer.enhance (): токен доступа = fb1a5690-e668-458f-82fd-f6eacc71fa7f 2019-10-02 11: 37: 02.980 ОТЛАДКА 50 csocJwtTokenEnhancet(скрыто) 2019-10-02 11: 37: 03.028 ИНФОРМАЦИЯ 168 ossoptsJdbcTokenStore.readAccessToken (): не удалось найти токен доступа для токена AccessToken: a1
(2) Запрос AccessToken: a2 с помощью RefreshToken: r1 -> успешно и получить новый RefreshToken: r2, так как я реализовал JWT
сообщение журнала
2019-10-02 11: 39: 50.722 DEBUG 78 csomsuCustomUserDetailsService.findUserFromDatabase(): Найден пользователь БД 2019-10-02 11: 39: 50.740 ИНФОРМАЦИЯ 28 csocJwtTokenEnhancer.enhance (): усиление (accessToken, аутентификация) выполняется ... 2019-10-02 11: 39: 50.756 ОТЛАДКА 49 csocJwtTokenEnhancer.enhance(): Токен доступа = 11f51132-c072-4257-a7e8-f39156092cc9 2019-10-02 11: 39: 50.756 ОТЛАДКА 50 csocJwtTokenEnhancer.enhance (): JWT Дополнительная информация = (скрыто) 2019-10-02 11: 39: 50.762ИНФОРМАЦИЯ 168 ossoptsJdbcTokenStore.readAccessToken (): не удалось найти токен доступа для токена AccessToken: a2
(3) попытаться запросить AccessToken: a3, используя RefreshToken: r1 снова -> не удалось
сообщение в журнале
2019-10-02 11: 41: 00.824 ОТЛАДКА 78 csomsuCustomUserDetailsService.findUserFromDatabase (): найден пользователь БД 2019-10-02 11: 41: 00.829 INFO 28 csocJwtTokenEnhancer.enhance (): улучшитьccessToken, аутентификация) выполняется ... 2019-10-02 11: 41: 00.847 ОТЛАДКА 49 csocJwtTokenEnhancer.enhance (): токен доступа = 57bf505d-cb69-4606-a3f3-f4677810c5c4 2019-10-02 11: 41: 00.847 ОТЛАДКА50 csocJwtTokenEnhancer.enhance (): JWT Дополнительная информация = (скрыто) 2019-10-02 11: 41: 00.853 ИНФОРМАЦИЯ 168 ossoptsJdbcTokenStore.readAccessToken (): не удалось найти токен доступа для токена AccessToken: a3 2019-10-02 11:41: 00.859 WARN 169 ossopeTokenEndpoint.handleException (): ошибка обработки: DuplicateKeyException, PreparedStatementCallback;SQL [вставить в oauth_access_token (token_id, token, authentication_id, user_name, client_id, аутентификация, refresh_token) значения (?,?,?,?,?,?,?)];ORA-00001: уникальное ограничение (MYCMSUSER.SYS_C0069816);вложенное исключение: java.sqlionException: ORA-00001: ограничение уникальности (MYCMSUSER.SYS_C0069816) 2019-10-02 11: 41: 00.861 WARN 198 .mmaExceptionHandlerExceptionResolver.logException (): Resolved [org.springframework.dao.DuplicatebackSException: Исключение: исключение: Исключение: Исключение:SQL [вставить в oauth_access_token (token_id, token, authentication_id, user_name, client_id, аутентификация, refresh_token) значения (?,?,?,?,?,?,?)];ORA-00001: уникальное ограничение (MYCMSUSER.SYS_C0069816);вложенное исключение: java.sqlionException: ORA-00001: ограничение уникальности (MYCMSUSER.SYS_C0069816)]
json message
{"error": "server_error", "error_description":" Внутренняя ошибка сервера "}
(4) попытаться запросить AccessToken: a3 с помощью RefreshToken: r2 -> ошибка
сообщение журнала
2019-10-02 11: 42: 00.364 ИНФОРМАЦИЯ 234 ossoptsJdbcTokenStore.readRefreshToken (): не удалось найти токен обновления для токена RefreshToken: r2
json message
{"error": "invalid_grant", "error_description": "Недопустимый токен обновления: RefreshToken: r2"}
вот мой AuthorizationServerConfiguration
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
private static final Logger logger = LoggerFactory.getLogger(AuthorizationServerConfiguration.class);
@Autowired
public DataSource dataSource;
@Autowired
private Environment environment;
@Autowired
public PasswordEncoder passwordEncoder;
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private TokenStore tokenStore;
@Autowired(required = false)
private JwtAccessTokenConverter jwtAccessTokenConverter;
@Autowired(required = false)
private TokenEnhancer jwtTokenEnhancer;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private AuthorizationEndpoint authorizationEndpoint;
@PostConstruct
public void init() {
authorizationEndpoint.setUserApprovalPage("forward:/confirm");
authorizationEndpoint.setErrorPage("forward:/error");
}
@Bean
public ApprovalStore approvalStore() {
return new JdbcApprovalStore(dataSource);
}
@Bean
protected AuthorizationCodeServices authorizationCodeServices() {
return new JdbcAuthorizationCodeServices(dataSource);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.jdbc(dataSource);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.tokenStore(tokenStore)
.approvalStore(approvalStore())
.authorizationCodeServices(authorizationCodeServices())
.userDetailsService(userDetailsService)
.reuseRefreshTokens(true)
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
;
if (jwtAccessTokenConverter != null && jwtTokenEnhancer != null) {
TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(Arrays.asList(jwtTokenEnhancer, jwtAccessTokenConverter));
endpoints.tokenEnhancer(tokenEnhancerChain).accessTokenConverter(jwtAccessTokenConverter);
}
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.tokenKeyAccess("isAuthenticated()")
.checkTokenAccess("isAuthenticated()")
.allowFormAuthenticationForClients();
}
}
Большое спасибо! !