2017-06-09 13 views
1

私はTeamcityサーバーにhttp RESTリクエストを送信することについて何かしています。 認証部分については、以下のコードを使用すると401エラーが発生します。httpリクエストを送信する前にBase64関連のアルゴリズムを使用する必要があります

public class Client { 

    public static void main(String args[]){ 
     try{ 
      Client client = new Client(); 
      client.sendGet(); 
      //client.sendPost(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

     String USER_AGENT = ""; 

     private void sendGet() throws Exception { 

      String url = "http://localhost:80/httpAuth/app/rest/builds"; 

      URL obj = new URL(url); 
      HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 

      con.setRequestMethod("GET"); 

      con.setRequestProperty("User-Agent", USER_AGENT); 

      String login = "gearon"; 
      String password = "gearonpassword"; 
      String token = login + ":" + password; 

      con.setRequestProperty ("Authorization", "Basic " + token); 

      int responseCode = con.getResponseCode(); 
      System.out.println("\nSending 'GET' request to URL : " + url); 
      System.out.println("Response Code : " + responseCode); 

      BufferedReader in = new BufferedReader(
        new InputStreamReader(con.getInputStream())); 
      String inputLine; 
      StringBuffer response = new StringBuffer(); 

      while ((inputLine = in.readLine()) != null) { 
       response.append(inputLine); 
      } 
      in.close(); 

      System.out.println(response.toString()); 
     } 
} 

私はコード

byte[] tokenArr = StringUtils.getBytesUtf8(token); 

    String encoded = new String(Base64.encodeBase64(tokenArr)); 

    con.setRequestProperty ("Authorization", "Basic " + token); 

の下に追加することで問題を解決し、これは私の問題を解決し、なぜしかし、私は把握することはできません。私のユーザ名やパスワードには特殊文字はありません。そして、私は、プロジェクト - >プロパティ - >リソース - >テキストファイルエンコーディング - > UTF-8を右クリックして、プロジェクトのエンコーディングをEclipseでUTF-8に設定しました。

getBytesUtf8方法のJavadocは

新しいバイト配列に結果を格納し、UTF-8 文字セットを使用してバイトシーケンスに与えられた文字列をエンコードしています。

私のプロジェクトで既にUTF-8を使用している場合、このメソッドは値を追加しません。別の方法encodeBase64について

、Javadocはある:

は、Base64アルゴリズムを使用してバイナリデータを符号化するが、チャンク 出力をしません。

多分、驚くべきことが起こります。私はBase64について何かを読むwiki

私はこの問題について自分自身を明確にすることはできません。だから、誰が何が起こったのか教えてもらえますか?

+1

ユーザー名とパスワードは、base64でエンコードする必要があります。 RFCはそれを必要とします。 –

+0

ブラウザから基本認証を必要とするリソースにアクセスしようとすると、ユーザー名とパスワードの追加を要求するダイアログが表示されます。コードから同じリソースにアクセスしようとすると、HTTPにBase64エンコーディングが必要です。 –

答えて

3

これはRFC 7617に定義されています。

承認を受けるために、クライアント

  1. は、ユーザーからユーザーIDとパスワードを取得し、

  2. は、ユーザーパスを構築しますuser-id、1つの コロン( ":")文字、およびパスワード

  3. を連結します
  4. はオクテット配列にユーザパス(文字符号化方式の 議論については以下を参照)、

  5. をコードし、Base64で([RFC4648]セクションを使用して、このオクテット配列 を符号化することによって基本クレデンシャルを取得します4)をUS-ASCII 文字のシーケンス([RFC0020])に変換する。

+0

正解ですが、古くなった仕様を引用しています。 –

+0

@JulianReschkeありがとう、現代版に更新されました。 – Henry

関連する問題