2017-07-17 35 views
2

このトピックに関する既存の議論がありますが、私の状況に対する答えを見つけることができませんでした。URLを介して資格情報を直接渡したいと考えています(https://user:[email protected]スキームに従って)。私はこのコードで401エラーが表示されます。Spring RestTemplate URLの基本認証

final RestTemplate restTemplate = new RestTemplate(); 
final ResponseEntity<String> wsCalendarResponse = restTemplate.getForEntity("https://user:[email protected]", String.class); 

私はブラウザ(https://user:[email protected])に正確に同じURLをcopy.paste場合は、それが正常に動作します。

この回答よりも簡単な手がかり:Basic authentication for REST API using spring restTemplate

ありがとうございました

+0

回答が役に立ちましたか?なぜなら、RestTemplateと認証では、Apacheクライアントがすぐに解決しないヒッチがほとんどないからです。 –

答えて

1

まあ、Spring RestTemplateはURLに基​​本認証を保持していないようです。だから私は、URLの資格情報がある場合、それは考慮に入れて作るために、URLの呼び出しの前にいくつかのコードを追加:

final String urlWs = "https://user:[email protected]"; 
final HttpHeaders headers = new HttpHeaders(); 
final String pattern = "^(?<protocol>.+?//)(?<username>.+?):(?<password>.+?)@(?<address>.+)$"; 
final Pattern regExpPattern = Pattern.compile(pattern); 
final Matcher matcher = regExpPattern.matcher(urlWs); 
if(matcher.find()) { 
    final String username = matcher.group("username"); 
    final String password = matcher.group("password"); 
    final String plainCreds = username + ":" + password; 
    final byte[] plainCredsBytes = plainCreds.getBytes(); 
    final byte[] base64CredsBytes = Base64Utils.encode(plainCredsBytes); 
    final String base64Creds = new String(base64CredsBytes); 
    headers.add("Authorization", "Basic " + base64Creds); 
} 
final HttpEntity<String> request = new HttpEntity<String>(headers); 
final RestTemplate restTemplate = new RestTemplate(); 
final ResponseEntity<String> wsCalendarResponse = restTemplate.exchange(urlWs, HttpMethod.GET, request, String.class); 

これは何の資格情報がない場合でも、正常に動作しています。

0

デフォルトのrequestFactoryはURLの認証セクションを処理しません。 Apache HttpClientに置き換えて試してみてください。

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
      HttpClientBuilder.create().build()); 
final RestTemplaterestTemplate = new RestTemplate(clientHttpRequestFactory); 
final ResponseEntity<String> wsCalendarResponse = restTemplate.getForEntity("https://user:[email protected]", String.class);