OAuth2 Refresh Token нельзя использовать повторно, если для reuseRefreshToken () установлено значение true из-за ограничения уникальности - PullRequest
0 голосов
/ 02 октября 2019

Я установил сервер авторизации 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();
    }
}

Большое спасибо! !

...