2011-08-10 11 views
0

Androidアプリケーションでhttpプロトコルを使用してTwitterアカウントのリソースにアクセスしようとしています。 Twitterはオープン認証標準OAuthを認証に使用しています。その結果、私はhttps://dev.twitter.com/docs/auth/oauth#Overviewの例に従っています。 私の問題は次のとおりです: リクエストトークンを取得することが必要ですが、エンドポイントにリクエストを行うと、応答は "oauthシグネチャとトークンの検証に失敗しました"という応答が返されます。 マイコード:SIGNATUREステップTwitter API oauth署名とトークンjavaの検証に失敗しました

タイムスタンプとノンスFOR

oauthTimestamp = String.valueOf(new Date().getTime()); 
oauthNonce = Base64.encodeToString(oauthTimestamp.getBytes(),Base64.DEFAULT); 
    //remove /n at the end of the string 
oauthNonce = oauthNonce.substring(0, oauthNonce.length() - 1); 

シグニチャベースストリング

String signatureBaseString = 
    "POST"                        
    + "&" 
    + URLEncoder.encode("https://api.twitter.com/oauth/request_token") 
    + "&" 
    + URLEncoder.encode("oauth_callback=" + redirectUrl) 
    + URLEncoder.encode("&" + "oauth_consumer_key=" + consumerKey) 
    + URLEncoder.encode("&" + "oauth_nonce=" + oauthNonce) 
    + URLEncoder.encode("&" + "oauth_signature_method=" + "HMAC-SHA1") 
    + URLEncoder.encode("&" + "oauth_timestamp=" + oauthTimestamp) 
    + URLEncoder.encode("&" + "oauth_version=" + "1.0"); 

署名コール

signature = getSignatureToken(applicationSecret, signatureBaseString, "HmacSHA1"); 

署名方法

private String getSignatureToken(String consumerSecret, String baseString, String algotithm) { 
    byte[] keyBytes = (consumerSecret+"&").getBytes(); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, algotithm); 
    Mac mac; 
    String res = null; 
    try { 
     mac = Mac.getInstance(algotithm); 
     mac.init(secretKeySpec); 
     byte[] rawHmac = mac.doFinal((baseString).getBytes()); 
     res = android.util.Base64.encodeToString(rawHmac, android.util.Base64.DEFAULT); 
     res = res.substring(0, res.length() - 1); 
     System.out.println("MAC : " + res); 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } 
    return res; 
} 

リクエストトークンのSTEP

HttpResponse response; 
HttpPost authorization = new HttpPost("https://api.twitter.com/oauth/request_token"); 
final String headerValue = 
    "OAuth " + 
    "oauth_nonce=\""+oauthNonce+"\", " + 
    "oauth_callback=\""+redirectUrl+"\", " + 
    "oauth_signature_method=\"HMAC-SHA1\", " + 
    "oauth_timestamp=\""+oauthTimestamp+"\", " + 
    "oauth_consumer_key=\""+consumerKey+"\", " + 
    "oauth_signature=\""+URLEncoder.encode(signature)+"\", " + 
    "oauth_version=\"1.0\"";  

authorization.addHeader("Authorization", headerValue); 
response = this.httpClient.execute(authorization); 
System.out.println(EntityUtils.toString(response.getEntity())); 

応答が= this.httpClient.execute(認可は)私のHTTP/1.1 401不正な

任意のアイデアを与えますか?

おかげ

+0

私は同じ問題に直面していますが、解決できません。どのように解決しましたか教えてください。 –

答えて

0

さて、あなたは段階的にこれをデバッグする必要がありますが、一つのこと、私は奇妙な見つける:なぜあなたはgetSignatureToken()でHMAC(署名)の最後の文字を削除していますか?それはBase64エンコーディングを破る可能性があります。

関連する問題