【问题标题】:Spring REST template - 401 Unauthorized errorSpring REST 模板 - 401 未经授权的错误
【发布时间】:2017-02-03 10:48:13
【问题描述】:

我在 Spring Boot 应用程序中使用 Spring Rest 模板。

即使我传递了凭据,我也总是收到 401 Unauthorized 错误。

我可以通过 Chrome REST Web 服务客户端访问此服务。

SpringBoot中是否有一种访问REST模板的简化方式。

下面是目前执行的代码 sn-p 导致 401 错误

 private DetailsBean invokeDetailsRestService(UserParam userParam){
    ResponseEntity<DetailsBean> responseEntity = null;
    String url = "https://dev.com/app/identifyuser/";
    RestClientConfig restClientConfig =new RestClientConfig("user123","pass123");
    responseEntity= restClientConfig.postForEntity(url, userParam, DetailsBean.class);
    log.debug("User Details : {} ", responseEntity.getBody());
    return responseEntity.getBody();
}

public ClientHttpRequestFactory getRequestFactory(String userName,String password){
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials( new AuthScope(null, -1), new UsernamePasswordCredentials(userName,password) );
    HttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
    return new HttpComponentsClientHttpRequestFactory(httpClient);
}

RestClientConfig 类

  public RestClientConfig(String username, String password) {
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(
            new AuthScope(null, -1),
            new UsernamePasswordCredentials(username, password));
    HttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
    setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}

错误:

WARN c7af55b5-1cac-4db6-a202-202416c27ba4 
 12612 --- [apr-8082-exec-8] o.a.http.impl.auth.HttpAuthenticator    
: NEGOTIATE authentication error: 
No valid credentials provided (Mechanism level: 
No valid credentials provided (Mechanism level: 
Failed to find any Kerberos tgt))

【问题讨论】:

  • 你根本不用spring的RestTemplate。
  • RestClientConfig 与 RestTemplate 不同,错误是由于端点dev.com/app/identifyuser,您确定使用凭据。

标签: spring spring-boot resttemplate spring-rest


【解决方案1】:

授权问题已通过以下代码修复..

应使用以下代码将凭据传递给 Spring REST 模板:

   String userAndPass = "Test:Test123";

   HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_XML);
    headers.add("Authorization", "Basic " +  Base64Utility.encode(userAndPass.getBytes()));

【讨论】:

    【解决方案2】:

    我在尝试调用 web 服务时遇到了类似的问题,这解决了我的问题:

    restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("userName", "password"));
    restTemplate.postForObject('','',''');
    

    像这样传递凭据,应该可以解决问题。

    【讨论】:

    • BasicAuthorizationInterceptor 已弃用,可以使用 BasicAuthenticationInterceptor
    【解决方案3】:

    我使用的是 spring boot 2.2.4.RELEASE 版本。然后我在下面工作。

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor(username, password));
    RequestDto requestDto = new RequestDto();
    // set parameter 
    ResponseDto response = restTemplate.postForObject(URL, requestDto, ResponseDto.class);
    

    或者

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setBasicAuth(username, password);
    RequestDto requestDto = new RequestDto();
    // set parameter 
    HttpEntity<RequestDto> request = new HttpEntity<>(requestDto, headers);
    ResponseDto response = restTemplate.postForObject(URL, request, ResponseDto.class);
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2016-02-09
      • 2016-02-10
      • 1970-01-01
      • 2019-06-28
      • 2021-04-07
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多