В микросервисной инфраструктуре, созданной с использованием Jhipster с Oauth2 и UAA, я увидел, что, войдя по адресу "localhost: 8080 / auth / login", метод sendPasswordGrant (String username, String password) устанавливает статического клиента:значение пароля и использует HttpEntity для отправки этой информации на UAA (OAuth-сервер).В заголовке запроса, чтобы клиент был динамическим, я добавил параметр @RequestHeader("Authorization") String autorization
в метод контроллера входа, однако в процессе обновления токена система должна установить клиент: пароль, и я не нашел способа установитьданные отправляются в заголовке, как я сделал при входе в систему.
Из того, что я понимаю о процессе обновления токена, в какой-то момент вызывается метод sendRefreshGrant(String refreshTokenValue)
, который статически присваивает значения client: password.Как я могу заставить токен обновления получить клиент: пароль, отправленный клиентом в заголовке http?
Метод, который я изменил для динамической установки данных клиента:
@Override
public OAuth2AccessToken sendPasswordGrant(String username, String password, String autorization) {
HttpHeaders reqHeaders = new HttpHeaders();
reqHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
reqHeaders.add("Authorization", autorization);
MultiValueMap<String, String> formParams = new LinkedMultiValueMap<>();
formParams.set("username", username);
formParams.set("password", password);
formParams.set("grant_type", "password");
// addAuthentication(reqHeaders, formParams);
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(formParams, reqHeaders);
log.debug("contacting OAuth2 token endpoint to login user: {}", username);
ResponseEntity<OAuth2AccessToken>
responseEntity = restTemplate.postForEntity(getTokenEndpoint(), entity, OAuth2AccessToken.class);
if (responseEntity.getStatusCode() != HttpStatus.OK) {
log.debug("failed to authenticate user with OAuth2 token endpoint, status: {}", responseEntity.getStatusCodeValue());
throw new HttpClientErrorException(responseEntity.getStatusCode());
}
OAuth2AccessToken accessToken = responseEntity.getBody();
return accessToken;
}
Кодобновить метод токена, который статически устанавливает клиент, вызвав метод addAuthentication(headers, params)
:
@Override
public OAuth2AccessToken sendRefreshGrant(String refreshTokenValue) {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "refresh_token");
params.add("refresh_token", refreshTokenValue);
HttpHeaders headers = new HttpHeaders();
addAuthentication(headers, params); // This method adds the static "client:password"
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers);
log.debug("contacting OAuth2 token endpoint to refresh OAuth2 JWT tokens");
ResponseEntity<OAuth2AccessToken> responseEntity = restTemplate.postForEntity(getTokenEndpoint(), entity,
OAuth2AccessToken.class);
if (responseEntity.getStatusCode() != HttpStatus.OK) {
log.debug("failed to refresh tokens: {}", responseEntity.getStatusCodeValue());
throw new HttpClientErrorException(responseEntity.getStatusCode());
}
OAuth2AccessToken accessToken = responseEntity.getBody();
log.info("refreshed OAuth2 JWT cookies using refresh_token grant");
return accessToken;
}