2012-03-20 13 views
2

私はこれを理解することはできません。私は動的にキーをロールしようとしています。私はpostを呼び出すと、POST要求をうまく作成できますが、IOExceptionで400エラーとスタックトレースを受け取ります。以下は、自己完結型の例です。私はJSCHを使って鍵を生成しています。 APIドキュメント:http://developer.github.com/v3/users/keys/Java - Github v3公開鍵を作成

APIの呼び出し:POST /user/keys

public static class LiberalHostnameVerifier implements HostnameVerifier { 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 
} 

public static String post(String requestUrl, Map<String, String> params, 
    String username, String password) throws Exception { 
    String data = ""; 
    int paramCount = 1; 
    for (Entry<String, String> param : params.entrySet()) { 
     if (paramCount == 1) { 
      data = URLEncoder.encode(param.getKey(), "UTF-8") + "=" 
       + URLEncoder.encode(param.getValue(), "UTF-8"); 
     } else { 
      data += "&" + URLEncoder.encode(param.getKey(), "UTF-8") + "=" 
       + URLEncoder.encode(param.getValue(), "UTF-8"); 
     } 
     paramCount++; 
    } 
    URL url = new URL(requestUrl); 
    HttpsURLConnection conn = (HttpsURLConnection) (url).openConnection(); 
    conn.setDoOutput(true); 
    conn.setRequestMethod("POST"); 
    conn.setHostnameVerifier(new LiberalHostnameVerifier()); 
    BASE64Encoder enc = new BASE64Encoder(); 
    String userAuth = username + ":" + password; 
    String encodedAuthorization = enc.encode(userAuth.getBytes()); 
    conn.setRequestProperty("Authorization", "Basic " + encodedAuthorization); 
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
    wr.write(data); 
    wr.flush(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(
     conn.getInputStream())); 
    String line; 
    String response = ""; 
    while ((line = rd.readLine()) != null) { 
     response += line; 
    } 
    wr.close(); 
    rd.close(); 
    return response; 
} 

public static KeyPair generateKey(String filename) throws Exception { 
    JSch jsch = new JSch(); 
    try { 
     KeyPair kpair = KeyPair.genKeyPair(jsch, KeyPair.RSA); 
     kpair.setPassphrase(""); 
     kpair.writePrivateKey(filename + ".pem"); 
     kpair.writePublicKey(filename + ".pub", "Auto-generated."); 
     System.out.println("Finger print: " + kpair.getFingerPrint()); 
     // kpair.dispose(); 
     return kpair; 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
    return null; 
} 

public static String getFileContents(File file) throws Exception { 
    byte[] buffer = new byte[(int) file.length()]; 
    FileInputStream f = new FileInputStream(file); 
    f.read(buffer); 
    return new String(buffer); 
} 

public static String createKey(String title) throws Exception { 
    generateKey(title); 
    final String key = getFileContents(new File(
      "/Users/franklovecchio/Desktop/development/" + title 
       + ".pub")); 
    System.out.println("key: " + key); 
    Map<String, String> params = new HashMap<String, String>() { 

     { 
      put("title", title); 
      put("key", key); 
     } 
    }; 
    return post("https://api.github.com/user/keys", params, "username", 
     "password"); 
} 

//はcreateKey( "キー)を呼び出し、

+0

奇妙な、401はセキュリティエラーです。承認フレームワークはありますか?たぶんどこかに[SecurityManager](http://docs.oracle.com/javase/tutorial/essential/environment/security.html)の問題があります... –

+0

だから、あなたは間違っていました。正しい方向に1歩進んでください!今私は400の応答を得るが、有用であるメッセージが返されるのを見ない。私は "SimpleRestClient"クラスを作成し、コードを更新しました。 –

+0

400は[Bad request](http://www.checkupdown.com/status/E400.html)です。それはあなたのクライアントから来ます。 Google Chromeの[高度なRESTクライアント](https://chrome.google.com/webstore/detail/hgmloofddffdnphfgcellkdfbfbjeloo)などの別のクライアントでテストします。 –

答えて

1

@nico_ekitoと@ J-16 SDiZのおかげで正しい方向への手助けができました。ドキュメントをよく見れば、リクエストは標準のPOSTパラメータを使用するのではなく、JSONをRaw入力、ssh-rsaキーはエンコードできません。次に、disableHtmlEscapingを使ってもGSONに文字列をエンコードさせることはできません。だから、私はそれを偽造しなければならなかった:

String json = "{\"title\":\"" + title + "\",\"key\":\"" + key.trim() + "\"}"; 
0

あなたは、SSHライブラリー(例えばJSch)をしてみてくださいました彼らはRSAキーを生成することができます。 SSH consumable format

+0

うーん...私はしなかった。私はそれを試して、あなたに戻ってきます。ありがとう! –

+0

まだ401を手に入れていますが、近くに!新しいメソッドの更新。 –

関連する問題