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
다음과 같이 구현합니다.
특히 다음과 같이 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
다음과 같습니다.
다음과 같이 인스턴스화하는 대신:
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
'programing' 카테고리의 다른 글
moteJs 날짜 문자열에 5일 추가 (0) | 2022.11.26 |
---|---|
MySQL의 Force Index - 어디에 배치해야 합니까? (0) | 2022.11.26 |
Java에서 Selenium WebDriver를 사용하여 새 탭을 여는 방법 (0) | 2022.11.26 |
새 창에서 열린 하위 구성 요소 (0) | 2022.11.26 |
인덱스를 사용하지만 테이블 스캔처럼 보이는 MariaDB SELECT (0) | 2022.11.26 |