В Spring boot JWT Plus Oauth2 TokenStore findTokensByClientId(clientId) возвращает пустой массив (мне нужны активные токены)

Я реализовал весеннюю загрузку с помощью 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-м пунктом, не могу получить жетоны)

Вы приняли ответ Деноксуса, но это не ответ на ваш вопрос Я хочу все активные токены, верно? Это только отвечает на вопрос, почему вы не получаете все жетоны. В следующий раз было бы неплохо уточнить ваш вопрос.

dur 22.04.2019 14:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

That's why you are getting the same token every time, but when this token will expire the authorize server will generate another one

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

That's why you are getting different token every time, but an empty list

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

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

Хороший способ поставить.!

Shirsh Sinha 19.04.2020 15:31

Другие вопросы по теме