2011-04-08 129 views
1

我依照指示在http://dev.twitter.com/pages/auth#request-token,並制定了C#類做OAuth授權。 我使用了頁面上的參數,輸出簽名基礎字符串和簽名與頁面上的參數匹配。所以我認爲算法部分是正確的。然後我用我的twitter應用程序中的參數替換參數,但是我未能從Twitter服務獲取請求令牌。響應數據是「無法驗證oauth簽名和令牌」。收購Twitter請求令牌失敗

這是我發送請求(我用的,而不是HTTPS的調試HTTP):

POST http://api.twitter.com/oauth/request_token HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Authorization: OAuth oauth_callback="http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11", oauth_consumer_key="GDdmIQH6jhtmLUypg82g", oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1272323042", oauth_version="1.0", oauth_signagure="IP%2FEEoc4tKdiobM%2FKH5cPK69cJM%3D" 
Host: api.twitter.com 
Proxy-Connection: Keep-Alive 

而這裏的響應:

HTTP/1.1 401 Unauthorized 
Connection: Keep-Alive 
Connection: Proxy-Support 
Content-Length: 44 
Via: 1.1 APS-PRXY-09 
Expires: Tue, 31 Mar 1981 05:00:00 GMT 
Date: Fri, 08 Apr 2011 05:47:20 GMT 
Content-Type: text/html; charset=utf-8 
Server: hi 
Proxy-Support: Session-Based-Authentication 
Status: 401 Unauthorized 
X-Transaction: 1302241640-40339-46793 
Last-Modified: Fri, 08 Apr 2011 05:47:20 GMT 
X-Runtime: 0.01519 
Pragma: no-cache 
X-Revision: DEV 
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0 
Set-Cookie: k=207.46.55.29.1302241640766556; path=/; expires=Fri, 15-Apr-11 05:47:20 GMT; domain=.twitter.com 
Set-Cookie: guest_id=13022416407746962; path=/; expires=Sun, 08 May 2011 05:47:20 GMT 
Set-Cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCEiBpjMvAToHaWQiJWMzMTViOGZiNDkzMDRi%250ANjNhMmQwYmVkZDBhNTc2NTc4IgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--177afd5c0f6fe30005ab9a9412e6f85ab03cbfa7; domain=.twitter.com; path=/; HttpOnly 
Vary: Accept-Encoding 

Failed to validate oauth signature and token 

我這是怎麼產生的歸一化參數:

string.Join("&", (from d in this.BuildParameterDict() 
        select string.Format("{0}={1}", OAuthEncoding.Encode(d.Key), OAuthEncoding.Encode(d.Value)))) 

BuildParameterDict方法將s orted創建一個列表:來自查詢字符串的參數;來自身體的參數;參數指定爲'oauth',但'oauth_signature'除外。

然後由所產生的簽名基本字符串:

  StringBuilder sb = new StringBuilder(); 

      sb.Append(OAuthEncoding.Encode(this._request.Method)); 
      sb.Append('&'); 
      sb.Append(OAuthEncoding.Encode(this.GetNormalUri())); 
      sb.Append('&'); 
      sb.Append(OAuthEncoding.Encode(this.GetNormalParameters())); 

這與從上述頁面的參數產生的鹼字符串:

POST & HTTPS%3A%2F%2Fapi.twitter .COM%2Foauth%2Frequest_token & oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11%26oauth_consumer_key%3DGDdmIQH6jhtmLUypg82g%26oauth_nonce%3DQP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk%26oauth_signatu re_method%3DHMAC-SHA1%26oauth_timestamp%3D1272323042%26oauth_version%3D1.0

它與該頁面上的字符串相同。

+0

你的基本字符串似乎沒問題。你的哈希怎麼樣?你在創建簽名時使用了什麼?密鑰需要從OAUTH_CONSUMER_SECRET和OAUTH_TOKEN構建。即使令牌缺少關鍵需要有一個與末(代碼是PHP):'$ KEY = $ OAUTH_CONSUMER_SECRET '&' $組oauth_token;'比簽名'$ OAUTH_SIGNATURE = BASE64_ENCODE(hash_hmac(「SHA1。 ',$ BASE_STRING,$ KEY,true));'...我想你的簽名有問題。 – emrahgunduz 2011-04-08 11:24:34

+0

此外,您創建的字符串似乎與Twitter示例中的「完全一樣」。你是不是自己創建一個隨機數和時間戳?你使用手寫字符串嗎?您必須提供時間戳作爲unixtime,並且隨機數必須是隨機的。像md5哈希一個隨機大數字... – emrahgunduz 2011-04-08 11:31:32

+0

是的,'&'已經照顧好了。在上面的代碼中,我硬編碼'timespan'和'nonce',實際上它們被替換爲正確的值。 – davidshen84 2011-04-08 13:23:59

回答

4

您的OAuth簽名被列爲您的要求「oauth_signagure」。

OAUTH參數具有發送之前進行排序,但簽名必須是在授權請求的結束。(在http://oauth.net/core/1.0/#anchor14 9.1.1)

您可能還需要指定一個境界=「/ OAuth的/ request_token」。這是可選的,但正如我記得正確的Twitter要求這一個請求令牌。

如果你可以添加你的代碼中,我們可能會發現這是怎麼回事,因爲你可能不會建立你的簽名正確散列請求和密鑰。

+0

感謝您發現這個錯字:)我會在原文中添加一些代碼片段。 – davidshen84 2011-04-08 08:25:11

+1

是的,你是對的。 'oauth_signature'必須是最後一個。但它沒有提到[這裏](http://dev.twitter.com/pages/auth#request-token),這個例子甚至是錯誤的...我討厭微博:( – davidshen84 2011-04-11 03:02:35