可以从浏览器获得响应,但从resttemplate未授权401

时间:2018-06-21 13:38:42

标签: java rest http https resttemplate

可以从Chrome的响应中获取信息,但是当我想通过resttemplate获取它时,它会给出401响应。

我尝试使用rest模板添加确切的内容类型,但它仍然会出现401错误。

这是我从Chrome浏览器获取的请求:

GET URL HTTP/1.1
Host: host
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Basic auth
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en,de;q=0.9,tr;q=0.8

这是我在Java中用于连接服务的代码:

RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_XHTML_XML, MediaType.APPLICATION_XML, MediaType.TEXT_HTML));
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);
HttpEntity<Map<String, String>> entity = new HttpEntity<>(params,createHeaders(username, password));

restTemplate.getForObject("URL",String.class, entity);

public static HttpHeaders createHeaders(String username, String password) {
    String auth = username + ":" + password;
    byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
    String authHeader = "Basic " + new String(encodedAuth);

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("Authorization", authHeader);
    return httpHeaders;
}

1 个答案:

答案 0 :(得分:0)

对授权令牌生成进行编码似乎存在问题。 如果您确定用户名和密码正确无误,则唯一的可能性是,用于生成令牌的方法/编码在浏览器(或生成令牌的UI应用程序)和{{1 }}方法。

有关更多详细信息,请参阅以下链接:

What encoding should I use for HTTP Basic Authentication?

https://github.com/request/request/issues/1334

希望会有所帮助。