2012-06-14 62 views
2

我想在android上創建一個flickr應用程序,但我堅持在請求令牌的身份驗證。Android Flickr Oauth invalid_signature同時獲取請求令牌

生成簽名

API密鑰:-496a8ac6ca46325e6cef * * ****

阿比揭祕:-685682a92 * **

基礎線: - GET&http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3Dsoft%253A%252F%252Fcom.alice.testflickr%26oauth_consumer_key%3D496a8ac6ca46325e6cef%26oauth_nonce%3D394e61453f7b82cd633d229ac9b6454b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1339654651%26oauth_version%3D1.0

生成簽名的方法: -

 public String computeSignature(String baseString,String key)throws IllegalStateException, UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException{ 
      //here key is the appsecret+"&" 
      byte[] byteHMAC = null; 
    Mac mac = Mac.getInstance("HmacSHA1"); 
    SecretKeySpec spec = new SecretKeySpec(key.getBytes(),"HmacSHA1"); 
    mac.init(spec); 
    byteHMAC = mac.doFinal(baseString.getBytes("UTF-8")); 

    return new String(Base64.encode(byteHMAC,Base64.NO_WRAP)); 
} 

時間戳是(System.currentTimeMillis)/1000

隨機數是Long.toString(System.nanoTime());

我的請求令牌這樣的要求: -

http://www.flickr.com/services/oauth/request_token?oauth_nonce=12190496931948&oauth_timestamp=1339664498&oauth_consumer_key=496a8ac6ca46325e6cef&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature=jg8CCdKb8gw%2BMJK0aJ6Brpba0G0%3D&oauth_callback=soft%3A%2F%2Fcom.alice.testflickr 

但我總是最後得到

oauth_problem=signature_invalid&debug_sbs=GET&http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3Dsoft%253A%252F%252Fcom.alice.testflickr%26oauth_consumer_key%3D496a8ac6ca46325e6cef%26oauth_nonce%3D12190496931948%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1339664498%26oauth_version%3D1.0 

我的簽名方式有什麼問題,或者是否有其他問題? 編輯:於即basestring時間戳和請求的值相同

回答

0

Flickr的文件說,簽名過程應該是這樣的:

使用的認證令牌的所有API調用都必須簽名。在
此外,flickr上的flickr.auth。*方法調用和重定向到
auth頁面也必須簽名。

簽名過程如下。

  • 根據參數名稱將參數列表按字母順序排序。
    例如
    富= 1,欄= 2,巴茲= 3種吧= 2,巴茲= 3,富= 1

  • 串聯共享祕密和參數名稱 - 值對
    例如
    SECRETbar2baz3foo1

  • 計算此字符串

  • 追加此值,以與所述名稱api_sig參數列表的MD5()的散列,以十六進制形式的字符串
    例如
    api_sig = 1f3870be274f6c49b3e31a0c6728957f