Правильный способ получить токен доступа Oath2 и вызвать другую службу в Java Spring Boot

Я хочу получить токен доступа 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: у этого вопроса нет точного дубликата

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

Marcos Barbero 31.03.2021 14:15

@MarcosBarbero Не могли бы вы дать мне образец кода

tech user 31.03.2021 14:42

Извините, но у меня нет примера. Однако, используя приведенную выше информацию, вы можете легко найти ее в Google.

Marcos Barbero 31.03.2021 16:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
25
0

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