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




That's why you are getting the same token every time, but when this token will expire the authorize server will generate another one
That's why you are getting different token every time, but an empty list
вы можете проверить класс JwtTokenStore в этом связь в Строка 162, вы обнаружите, что по умолчанию выдается пустой список
Поэтому для стандартной конфигурации вы должны использовать JwtTokenStore
Хороший способ поставить.!
Вы приняли ответ Деноксуса, но это не ответ на ваш вопрос Я хочу все активные токены, верно? Это только отвечает на вопрос, почему вы не получаете все жетоны. В следующий раз было бы неплохо уточнить ваш вопрос.