Spring RestTemplate 在使用授权标头发送时给出 401 未授权错误

问题描述 投票:0回答:1

我正在尝试使用以下代码在我的 Spring Rest 应用程序中点击一个 Microsoft Flow POST URL,但它给了我 401 错误。 我的代码:

    @RequestMapping(value = "/hookslistner", method = RequestMethod.POST)
    public ResponseEntity<Void> recieveWebhook(@RequestBody InventorySystemModel inventory,
            @RequestHeader("event") String event,
            @RequestHeader("Authorization") String authorization) {
// authorization = "Basic <Base64 encoded value of username:pwd>"

        RestTemplate restTemplate = new RestTemplate();

        org.springframework.http.HttpHeaders httpHeaders = new org.springframework.http.HttpHeaders();

        String url = "https://prod-01.centralindia.logic.azure.com/workflows/835348<hiding rest of part>";        
        String headerName = "Authorization";
        httpHeaders.add(headerName, authorization);
        httpHeaders.add("Content-Type", "application/json");
        HttpEntity<String> requestEntity = new HttpEntity<>("Headers", httpHeaders);
        System.out.println(">>>>>>>" + restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class).getBody());
    }

错误:

SEVERE: Servlet.service() for servlet [webhooks] in context with path [/inventoryhooks] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 401 Unauthorized] with root cause
org.springframework.web.client.HttpClientErrorException: 401 Unauthorized
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
.
.
.

是不是因为我的target url是https而我的localhost是http?

谁能指出我出了什么问题?

java spring rest resttemplate spring-restcontroller
1个回答
0
投票

两点让你检查这个问题:

  1. 如果目标服务器是http服务器,那么你不应该在url中使用https。
  2. 确保
    authorization
    值是
    base64
    编码的。

更新:

由于目标服务器是https服务器,所以问题是您没有将

ssl
信息配置到
RestTempalte
中。您可以参考以下代码片段来获取 ssl restTemplate:

@Configuration
public class RestClientConfig {
    @Bean
    public RestOperations restOperations(ClientHttpRequestFactory clientHttpRequestFactory) throws Exception {
        return new RestTemplate(clientHttpRequestFactory);
    }

    @Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
        return new HttpComponentsClientHttpRequestFactory(httpClient);
    }

    @Bean
    public HttpClient httpClient(@Value("${keystore.file}") String file, @Value("${keystore.pass}") String password) throws Exception {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream inStream = new FileInputStream(file);
        try {
            trustStore.load(inStream, password.toCharArray());
        } finally {
            inStream.close();
        }

        SSLContext sslcontext =
                SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
        SSLConnectionSocketFactory sslsf =
                new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1.2"}, null,
                                               null);
        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

测试用例:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = RestClientConfig.class)
public class RestClientTest {

    @Autowired
    private RestOperations rest;

    private HttpHeaders getHeaders(){
        String plainCredentials="admin:admin";
        String base64Credentials = Base64.getEncoder().encodeToString(plainCredentials.getBytes());

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + base64Credentials);
        return headers;
    }

    @Test
    public void test() {
        HttpEntity<String> request = new HttpEntity<String>(getHeaders());
        ResponseEntity<String> response = rest.exchange(url, HttpMethod.GET, request, String.class);
        System.out.println(response.getBody());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.