В весенней загрузке JWT Plus Oauth2 TokenStore findTokensByClientId (clientId) возвращает пустой массив (я хочу активные токены) - PullRequest
0 голосов
/ 22 апреля 2019

Я реализовал весеннюю загрузку с jwt plus oauth2 (в памяти).

Здесь токены расположены в памяти, а не в базе данных.

Но когда я использую tokenStore.findTokensByClientId(clientId), тогда он возвращает пустой массивв нижнем случае

Пример

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {


    static final String CLIEN_ID = "vishvas-client";
    static final String CLIENT_SECRET = "$2a$10$kfH4W.jyBuqvX5TLu.OfbOEUtScm4V9FEUDvGI8AWPaqObUOQ7HJ2"; // vishvas-secret
    static final String GRANT_TYPE_PASSWORD = "password";
    static final String AUTHORIZATION_CODE = "authorization_code";
    static final String REFRESH_TOKEN = "refresh_token";
    static final String IMPLICIT = "implicit";
    static final String SCOPE_READ = "read";
    static final String SCOPE_WRITE = "write";
    static final String TRUST = "trust";
    static final int ACCESS_TOKEN_VALIDITY_SECONDS = 12 * 60 * 60; // 12 hour
    static final int FREFRESH_TOKEN_VALIDITY_SECONDS = 24 * 60 * 60; // 24 hour

    @Autowired
    private AuthenticationManager authenticationManager;

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("as466gf");
        return converter;
    }

    @Bean
    public TokenStore tokenStore() {
        //  return new InMemoryTokenStore();   // Success : working but same access token generated every time. i want different access tokens
        return new JwtTokenStore(accessTokenConverter()); // Error :  tokenStore.findTokensByClientId(clientId) returns blank

    }

    @Override
    public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {

        configurer.inMemory().withClient(CLIEN_ID).secret(CLIENT_SECRET)
                .authorizedGrantTypes(GRANT_TYPE_PASSWORD, AUTHORIZATION_CODE, REFRESH_TOKEN, IMPLICIT)
                .scopes(SCOPE_READ, SCOPE_WRITE, TRUST).accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS)
                .refreshTokenValiditySeconds(FREFRESH_TOKEN_VALIDITY_SECONDS);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
                .accessTokenConverter(accessTokenConverter());
    }
}


@RestController
@RequestMapping("/api/tokens")
public class TokensEndpointController {

    @Autowired
    private TokenStore tokenStore;

    @CrossOrigin
    @SuppressWarnings({ "unchecked", "rawtypes", "deprecation" })
    @GetMapping
    public ResponseEntity<?> findAllActiveSessions(@RequestParam String clientId,
            HttpServletRequest httpServletRequest) {

        try {

            String username = httpServletRequest.getUserPrincipal().getName();

            Collection<OAuth2AccessToken> tokens = tokenStore.findTokensByClientId(clientId);
            List<String> tokenValues = tokens.stream().map(OAuth2AccessToken::getValue).collect(Collectors.toList());

            System.out.println("tokenValues : " + tokenValues); // Blank array

            return ResponseEntity.ok(new ResponseWrapperDTO(HttpServletResponse.SC_OK,
                    httpServletRequest.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString(),
                    "Tokens got successfully.", tokenValues));

        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseEntity(
                    new ResponseErrorDTO(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                            MethodUtils.getApiPathFromHttpServletRequest(httpServletRequest), e.getMessage()),
                    HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

}

Пример объяснения:

  1. В tokenStore() методе, если я использую return new InMemoryTokenStore();, тогда я могу получитьвсе токены успешно используют API (http://localhost:8080/api/tokens?clientId=vishvas-client),, но каждый раз генерируется один и тот же токен доступа

  2. В методе tokenStore(), если я использую return new JwtTokenStore(accessTokenConverter());, тогда API (http://localhost:8080/api/tokens?clientId=vishvas-client) возвращает пустой массив. (Проблема со 2-й точкой, невозможно получить токены)

1 Ответ

1 голос
/ 22 апреля 2019
  1. В первой конфигурации " InMemoryTokenStore ":
    • Является ли стандартный метод генерации токенов oauth2 , означает, что будет генерироваться один токен для каждого пользователя , и он будет сохранен (поэтому, когда вы запрашиваете у сервера авторизации токены клиента, которые он выбирает, если он не генерируется), пока токен не будет истечет , тогда будет сгенерирован другой токен

Вот почему вы получаете один и тот же токен каждый раз, но когда этот токен истекает, сервер авторизации сгенерирует еще один

  1. Во второй конфигурации " JwtTokenStore ":
    • Это стандартный oauth2 метод генерации jwt , означающий, что каждый раз, когда вы запрашиваете токен, сервер авторизации генерирует для вас токен, а не сохраняет его в памяти
    • На этом этапе, если вы используете токен JWT, сервер должен быть без сохранения состояния, что означает отсутствие хранилища токенов или хранилища информации о пользователях, поскольку токен JWT автономен для сервера не требуется хранить токен или информация о пользователе

Вот почему вы каждый раз получаете разные токены, но пустой список

Вы можете проверить JwtTokenStore класс в этой ссылке в Строка 162 , вы обнаружите, что по умолчанию даёт Пустой список

Так что для стандартной конфигурации вы должны использовать JwtTokenStore

...