0

Twitter から認証するアプリケーションを作成しようとしていますが、次のエラーが発生します。

Failed to validate oauth signature and token

アプリのコードは次のとおりです。

public class TwitCons {

    String sign_method ="HMAC-SHA1";

    public static String consumer_key ="^^^^^^^^^^^^^^^^^^^^";
    public static String consumer_secret="^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
    String request_uri = "https://api.twitter.com/oauth/request_token";
    String oauth_callback="http://127.0.0.1:8080/twitter/getToken";

    String getNonce(){
        Random ran = new Random(); 
        long nonce1 = ran.nextLong(); 

        Long nonce = Math.abs(new Long(nonce1)); 

        return nonce.toString();
    }


    String getTimestamp(){
        long time = System.currentTimeMillis();


        return String.valueOf(time/1000);
    }


    String getSignature(String request_uri ,String request_token,String nonce) throws UnsupportedEncodingException
    {
        String base="oauth_callback=http://127.0.0.1:8080/twitter/getToken&oauth_consumer_key="+consumer_key+"&oauth_nonce="+nonce+"&oauth_signature_method="+sign_method+"&oauth_timestamp="+getTimestamp()+"&oauth_token=&oauth_version=1.0";

        String baseString="POST&"+URLEncoder.encode(request_uri , "UTF-8")+"&"+URLEncoder.encode(base , "UTF-8");

        String signKey = consumer_secret +"&"+ request_token ;
        System.out.println(signKey +"\n"+baseString);

        try {
            SecretKeySpec signingKey = new SecretKeySpec(signKey.getBytes(),"HmacSHA1");
            Mac mac = Mac.getInstance(signingKey.getAlgorithm());
            mac.init(signingKey);
            byte[] rawHmac = mac.doFinal(baseString.getBytes());
            String result = new String(Base64.encodeBase64(rawHmac));
            System.out.println(URLEncoder.encode(result , "UTF-8"));
            return URLEncoder.encode(result , "UTF-8");
            //return result;

        } catch (GeneralSecurityException e) {
            return "";
        }




    }


}

public class Twitter extends TwitCons{

    public void getRequest() throws IllegalArgumentException, HttpException, IOException
    {

        HttpClient client = new HttpClient();
        PostMethod post = new PostMethod("https://api.twitter.com/oauth/request_token");
        String nonce=getNonce();
        String header = "oauth_callback=\""+URLEncoder.encode(oauth_callback ,"UTF-8")+"\","+
            "oauth_consumer_key=\""+consumer_key +"\","+
            "oauth_nonce=\""+nonce + "\","+
            "oauth_signature=\""+getSignature(request_uri,"",nonce) + "\","+ 
            "oauth_signature_method=\""+sign_method + "\","+
            "oauth_timestamp=\""+getTimestamp() + "\","+
            "oauth_version=\"1.0\""  ;

        post.addRequestHeader("Authorization", "OAuth "+header);
        client.executeMethod(post);

        System.out.println(post.getResponseBodyAsString()+"\n"+post.getRequestHeader("Authorization"));






    }

クラスには、request_token と token_secret を取得するための Twitter リクエストを作成するためのメソッド getRequest があります。

および2番目のクラスのTwitConには、リクエストトークンを取得するための異なるメソッドと定数があります

4

2 に答える 2

0

ではTwitter.getRequest()、ヘッダーが間違っているようです。各パラメーターの値は、二重引用符 ( ")で囲む必要があります。

StringBuilder headerBuilder = new StringBuilder("OAuth ");

headerBuilder.append("oauth_callback=\"").append(oauth_callback).append("\", ");
headerBuilder.append("oauth_consumer_key=\"").append(consumer_key).append("\", ");
headerBuilder.append("oauth_nonce=\"").append(nonce).append("\", ");
headerBuilder.append("oauth_signature=\"").append(getSignature(request_uri,"",nonce)).append("\", ");
headerBuilder.append("oauth_signature_method=\"").append(sign_method).append("\", ");
headerBuilder.append("oauth_timestamp=\"").append(getTimestamp()).append("\", ");
headerBuilder.append("oauth_version=\"1.0\"");

String header = headerBuilder.toString();

詳細については、Twitter API の対応するページを参照してください: https://dev.twitter.com/docs/auth/authorizing-request

EDIT : コンマの前にスペースがないため、コードが修正されました。

于 2012-07-09T13:42:56.733 に答える
-1

oauth_tokenにがありませんString base取得方法については、 https://dev.twitter.com/docs/auth/3-legged-authorizationを参照してください(これをまだ知らず、ベース文字列に入れるのを忘れていない場合は ;))。

&oauth_token=文字列に含まれているため、署名が間違って計算されている可能性がありますbaseが、そのキーはリクエストの一部ではありません。OAuth 1.0 仕様には次のように書かれています。

署名ベース文字列は、リクエスト要素を単一の文字列に一貫して再現可能な連結したものです。

文字列のその部分を削除してみる価値があるかもしれません。

アップデート:

おそらく、Authorization ヘッダーでコールバック URL を urlencode し、アルファベット順に並べて、@air-dex が推奨するようにパラメーターを引用符で囲む必要があります。これを試して:

String oauth_callback = "http://127.0.0.1:8080/twitter/getToken";
String oauth_callback_encoded = URLEncoder.encode(oauth_callback, "UTF-8");

それから

String header = "oauth_callback=\"" + oauth_callback_encoded + "\", " +
            "oauth_consumer_key=\"" + consumer_key + "\", " +
            "oauth_nonce=\"" + nonce + "\", " +
            "oauth_signature=\"" + getSignature(request_uri, "", nonce) + "\", " +
            "oauth_signature_method=\"" + sign_method + "\", " +
            "oauth_timestamp=\"" + getTimestamp() + "\", " +
            "oauth_version=\"1.0\"";

String base = "oauth_consumer_key=" + consumer_key + 
            "&oauth_nonce=" + nonce + 
            "&oauth_signature_method=" + sign_method + 
            "&oauth_timestamp=" + getTimestamp() +
            "&oauth_version=1.0";
于 2012-07-08T14:56:25.617 に答える