Я хочу получить токен доступа oath2 и с его помощью вызвать другую службу. Код ниже делает то же самое, он получает токен доступа и вызывает другой API, используя его. Используя приведенный ниже код, я могу делать все, что захочу, с помощью приведенного ниже кода. Но я новичок в Spring Security, я просто хочу знать, есть ли лучший способ сделать это. Например, вместо того, чтобы делать отдельный вызов, чтобы получить токен, а затем вызвать в службу, могу ли я сделать это за один вызов? Или, используя любой другой класс, предоставленный Spring, могу ли я написать это лучше?
public class TestAPIToken{
@RequestMapping(value = "/showEmployees", method = RequestMethod.GET)
public ModelAndView showEmployees(@RequestParam("code") String code) throws JsonProcessingException, IOException {
String accessToken = getAccessToken();
System.out.println("API Token ---------" + accessToken);
HttpEntity<String> response = getResponseByCallingWithToken(accessToken);
System.out.println("API Response ---------" + response.getBody());
return null;
}
private HttpEntity<String> getResponseByCallingWithToken(String accessToken) {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.add("Authorization", "Bearer " + accessToken);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("msisdn", msisdn)
.queryParam("email", email);
HttpEntity<?> entity = new HttpEntity<>(headers);
HttpEntity<String> response = restTemplate.exchange(
builder.toUriString(),
HttpMethod.GET,
entity,
String.class);
reponse.getBody();
return response;
}
private String getAccessToken() {
ResponseEntity<String> response = null;
System.out.println("Authorization Code------" + code);
RestTemplate restTemplate = new RestTemplate();
// According OAuth documentation we need to send the client id and secret key in the header for authentication
String encodedCredentials = new String(Base64.encodeBase64(credentials.getBytes()));
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.add("Authorization", "Basic " + encodedCredentials);
MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add("scope","scope,value");
body.add("grant_type","scope,value");
HttpEntity<String> request = new HttpEntity<String>(body, headers);
String access_token_url = "http://localhost:8080/oauth2/token";
ResponseEntity<TokenModel> response = restTemplate.exchange(access_token_url, HttpMethod.POST, request, TokenModel.class);
String accessToken = response.getBody().access_token;
return accessToken;
}
}
class TokenModel{
String access_token;
String scope;
String token_type;
String expires_in;
}
Я новичок в безопасности Spring. Пожалуйста, помогите, даже если вам это кажется простым NB: у этого вопроса нет точного дубликата
@MarcosBarbero Не могли бы вы дать мне образец кода
Извините, но у меня нет примера. Однако, используя приведенную выше информацию, вы можете легко найти ее в Google.




Вы можете использовать
OAuth2RestTemplate, и он будет обрабатывать весь обмен токенами за вас. Также стоит изучитьWebClient, так какOAuth2RestTemplateбудет считаться устаревшим в будущей версии.