programing tip

Spring restTemplate을 사용한 REST API의 기본 인증

itbloger 2020. 11. 19. 07:55
반응형

Spring restTemplate을 사용한 REST API의 기본 인증


나는 RestTemplate과 기본적으로 REST API에서도 완전히 새로운 것입니다. Jira REST API를 통해 내 애플리케이션에서 일부 데이터를 검색하고 싶지만 401 Unauthorised를 되찾고 싶습니다. jira rest api 문서 에 대한 기사를 찾았 지만 예제에서는 curl과 함께 명령 줄 방식을 사용하므로이를 Java로 다시 작성하는 방법을 모릅니다. 다시 작성하는 방법에 대한 제안이나 조언을 주시면 감사하겠습니다.

curl -D- -X GET -H "Authorization: Basic ZnJlZDpmcmVk" -H "Content-Type: application/json" "http://kelpie9:8081/rest/api/2/issue/QA-31"

스프링 나머지 템플릿을 사용하여 자바로. 여기서 ZnJlZDpmcmVk는 사용자 이름 : 암호의 base64 인코딩 문자열입니다. 대단히 감사합니다.


이 사이트예제에서 가져온 헤더 값을 채우고 헤더를 템플릿에 전달하는 것이 가장 자연스러운 방법이라고 생각합니다.

이것은 헤더를 채우는 것입니다 Authorization.

String plainCreds = "willie:p@ssword";
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);

HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);

그리고 이것은 헤더를 REST 템플릿에 전달하는 것입니다.

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
Account account = response.getBody();

spring-boot RestTemplateBuilder를 사용할 수 있습니다.

@Bean
RestOperations rest(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.basicAuthentication("user", "password").build();
}

문서 보기

(SB 2.1.0 이전에는 #basicAuthorization)


(아마도) spring-boot를 가져 오지 않는 가장 쉬운 방법입니다.

restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));

TestRestTemplate다음과 같이 Spring Boot의 구현을 참조하십시오 .

https://github.com/spring-projects/spring-boot/blob/v1.2.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/test/TestRestTemplate.java

특히 다음과 같이 addAuthentication () 메서드를 참조하십시오.

private void addAuthentication(String username, String password) {
    if (username == null) {
        return;
    }
    List<ClientHttpRequestInterceptor> interceptors = Collections
            .<ClientHttpRequestInterceptor> singletonList(new BasicAuthorizationInterceptor(
                    username, password));
    setRequestFactory(new InterceptingClientHttpRequestFactory(getRequestFactory(),
            interceptors));
}

마찬가지로 RestTemplate쉽게 만들 수 있습니다.

TestRestTemplate다음과 같이 상속 으로 :

https://github.com/izeye/samples-spring-boot-branches/blob/rest-and-actuator-with-security/src/main/java/samples/springboot/util/BasicAuthRestTemplate.java


Spring 5.1부터 사용할 수 있습니다. HttpHeaders.setBasicAuth

기본 승인 헤더를 만듭니다.

String username = "willie";
String password = ":p@ssword";
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
...other headers goes here...

RestTemplate에 헤더를 전달합니다.

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
Account account = response.getBody();

문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html#setBasicAuth-java.lang.String-java.lang.String-


다음과 같이 인스턴스화하는 대신 :

TestRestTemplate restTemplate = new TestRestTemplate();

다음과 같이하십시오.

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

그것은 나를 위해 작동합니다, 나는 그것이 도움이되기를 바랍니다!


.NET Framework에 기본 HTTP 인증을 추가하는 방법에는 여러 가지가 있습니다 RestTemplate.

1. 단일 요청

try {
    // request url
    String url = "https://jsonplaceholder.typicode.com/posts";

    // create auth credentials
    String authStr = "username:password";
    String base64Creds = Base64.getEncoder().encodeToString(authStr.getBytes());

    // create headers
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Basic " + base64Creds);

    // create request
    HttpEntity request = new HttpEntity(headers);

    // make a request
    ResponseEntity<String> response = new RestTemplate().exchange(url, HttpMethod.GET, request, String.class);

    // get JSON response
    String json = response.getBody();

} catch (Exception ex) {
    ex.printStackTrace();
}

Spring 5.1이상을 사용하는 경우 더 이상 권한 헤더를 수동으로 설정할 필요가 없습니다. headers.setBasicAuth()대신 방법을 사용하십시오 .

// create headers
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("username", "password");

2. 요청 그룹의 경우

@Service
public class RestService {

    private final RestTemplate restTemplate;

    public RestService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder
                .basicAuthentication("username", "password")
                .build();
    }

   // use `restTemplate` instance here
}

3. 모든 요청에 ​​대해

@Bean
RestOperations restTemplateBuilder(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.basicAuthentication("username", "password").build();
}

도움이 되었기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/21920268/basic-authentication-for-rest-api-using-spring-resttemplate

반응형