1

アプリで Twitter にサインインするための request_token を取得しようとしていますが、常に 401 エラーが発生します。dev.twitter でアプリを作成し、コンシューマー キー、シークレット、およびコールバックを取得しました。

これは私の方法です:

def readSomething(String url){
    StringBuffer buffer = new StringBuffer();
    try {
    /** 
     * get the time - note: value below zero 
     * the millisecond value is used for oauth_nonce later on
     */
        int millis = (int) System.currentTimeMillis() * -1;
        int time = (int) millis / 1000;

        /**
         * Listing of all parameters necessary to retrieve a token
         * (sorted lexicographically as demanded)
         */
         def data = [

            "oauth_nonce": String.valueOf(millis),
            "oauth_signature":"",
            "oauth_signature_method":"HMAC-SHA1",
            "oauth_timestamp": String.valueOf(time),
            "oauth_version":"1.0"
         ]

        /**
         * Generation of the signature base string
         */
        String signature_base_string = 
            "POST&"+URLEncoder.encode(url, "UTF-8")+"&";
        data.each{
            // ignore the empty oauth_signature field
            if(it.key != "oauth_signature") {
            signature_base_string +=
                URLEncoder.encode(it.key, "UTF-8") + "%3D" +
                URLEncoder.encode(it.value, "UTF-8") + "%26";
            }
        }
        // cut the last appended %26 
        signature_base_string = signature_base_string.substring(0,
            signature_base_string.length()-3);

        /**
         * Sign the request
         */
        def signingKey=URLEncoder.encode(CONSUMER_SECRET, "UTF-8")+"&"
        Mac m = Mac.getInstance("HmacSHA1");
        m.init(new SecretKeySpec(signingKey.getBytes(), "HmacSHA1"));
        m.update(signature_base_string.getBytes());
        byte[] res = m.doFinal();
        String sig = String.valueOf(res.encodeBase64());

        data["oauth_signature"] = sig;

       /**
        * Create the header for the request
        */
       String header = "OAuth ";
      data.each {
            header += it.key+"=\""+it.value+"\", ";
       }
       // cut off last appended comma
       header = header.substring(0, header.length()-2);

       System.out.println("Signature Base String: "+signature_base_string);
       System.out.println("Authorization Header: "+header);
       System.out.println("Signature: "+sig);

       String charset = "UTF-8";
       URLConnection connection = new URL(url).openConnection();
       connection.setDoInput(true);
       connection.setDoOutput(true);
       connection.setRequestProperty("Accept-Charset", charset);
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
       connection.setRequestProperty("Authorization", header);
       OutputStream output = connection.getOutputStream();
       output.write(header.getBytes(charset));

       BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
       println"reader "+reader
       String read;
       while((read = reader.readLine()) != null) {
           buffer.append(read);
       }
    }
    catch(Exception e) { 
        e.printStackTrace();
    }
    println"buffer "+buffer
    println"buffer "+buffer.getClass()
    println"buffer "+buffer.toString()

   return buffer.toString()

}

それは何か問題がありますか?

署名が正しくなく、oauth_signature が間違っていると思います。この署名が正しいかどうかを確認する方法はありますか?

私はこれをやろうとしましたが (http://stackoverflow.com/questions/2964392/implement-oauth-in-java)、まだ機能していません。他に何が起こっているのか考えていますか?

前もって感謝します

4

0 に答える 0