programing

spring restTemplate를 사용한 REST API 기본 인증

javaba 2022. 11. 26. 21:30
반응형

spring restTemplate를 사용한 REST API 기본 인증

RestTemplate는 물론 REST API도 완전히 새로워졌습니다.Jira REST API를 통해 어플리케이션의 데이터를 가져오고 싶은데 401 Unauthorized를 돌려받았습니다.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"

spring rest 템플릿을 사용하여 java로 변환합니다.여기서 ZnJlZDpmcmVk는 username:password의 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();

스프링 부트 Rest Template Builder를 사용할 수 있습니다.

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

매뉴얼 참조

(SB 2.1.0 이전에는#basicAuthorization)

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

1. 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();
}

스프링을 사용하는 경우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();
}

도움이 됐으면 좋겠네요!

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-

(아마도) spring-boot를 Import하지 않고 가장 쉬운 방법일 것입니다.

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

스프링 부트 참조TestRestTemplate다음과 같이 구현합니다.

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

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

TestRestTemplate restTemplate = new TestRestTemplate();

이렇게 하면 됩니다.

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

효과가 있어요, 도움이 됐으면 좋겠네요!

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

그 후, 다음의 다른 순서와 같은 순서로 진행됩니다.

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

setBasicAuth을 정하다

HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("myUsername", myPassword);

그런 다음 원하는 대로 요청을 만듭니다.

예:

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

버전을 5.3.15내 유닛 테스트 환경을 위해.하였습니다.withBasicAuth : my테스 for for for테테스 for 。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyTestClass {
    ...
    @Autowired
    private TestRestTemplate restTemplate;
    ...
    @Test
    @SneakyThrows
    public void TestGetSettings(){
        DtoClass dtoClass  = this.restTemplate
                           .withBasicAuth(UserServices.DEFAULT_USER, UserServices.DEFAULT_PASSWORD)
                           .getForObject(String.format("http://localhost:%d/setting",
                port), DtoClass.class);
        assertThat(dtoClass.getClientAddress()).isNotEmpty();
    }
   ...
}

보시는 바와 같이 이 방식은 기본 인증에서만 작동합니다.의 상세 withBasicAuth 출처는 .

// TestRestTemplate.java file: 
...
public class TestRestTemplate {
    ... 
    private final RestTemplateBuilder builder;
    ...
    public TestRestTemplate withBasicAuth(String username, String password) {
      TestRestTemplate template = new TestRestTemplate(this.builder, username, password, this.httpClientOptions);
      ...
    }
}

그 다른 는, 「아니다」, 「아니다」, 「아니다」를 사용할 수 .RestTemplateBuilder이치노

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

반응형