2010-09-08 326 views
5

我下面的代碼,每次返回一個401未經授權錯誤在這一點上:401未授權使用雅虎的OAuth

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://query.yahooapis.com/v1/yql?q=select%20fields.value%20from%20social.contacts%20where%20guid%3Dme&diagnostics=false"); 
request.Headers.Add(
    "Authorization: OAuth " + 
    "realm=\"" + "yahooapis.com" + "\"," + 
    "oauth_consumer_key=\"" + ConfigurationManager.AppSettings["yahoo_oauth_consumer_key"] + "\"," + 
    "oauth_nonce=\"" + Guid.NewGuid().ToString() + "\"," + 
    "oauth_signature_method=\"" + "PLAINTEXT" + "\"," + 
    "oauth_timestamp=\"" + ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks)/(1000 * 10000)).ToString() + "\"," + 
    "oauth_token=\"" + accessToken.TokenValue + "\"," + 
    "oauth_version=\"1.0" + "\"," + 
    "oauth_signature=\"" + ConfigurationManager.AppSettings["yahoo_oauth_signature"] + "%26" + "\"" 
); 
StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream(), true); 

當我步入代碼每次我看到所有的信息是存在的,雅虎要求有在頭,但每次我得到這個401

回答

1

好吧首先:

http://www.youtube.com/watch?v=lZLP0siJI-8&feature=related

其次,解決方案;

不要從本地主機運行它:P

當我在雅虎簽署了我應該已經閱讀更仔細,我簽署了第二次剛好看到,它明確規定從哪個域名將您正在打電話給我們的API。

+1

用於開發,測試和調試目的,您需要從本地主機運行。有一種方法可以做到這一點。您可以將C:\ Windows \ System32 \ drivers \ etc \ hosts文件修改爲指向www.YOUR-DOMAIN.com的127.0.0.1。您可以將C:\替換爲託管Windows操作系統的分區。我相信非Windows操作系統必須有一種替代方法來做同樣的事情。 – 2013-02-23 22:50:07

2

正如我確信你知道,401意味着未經授權。這可能意味着您的簽名無效。

您不會發布您的所有代碼,但我看不到它可能正確生成正確的簽名,因爲您的簽名方法似乎沒有采用任何參數 - 最明顯的是時間戳和隨機數 - - 作爲輸入。如果您已經正確計算了簽名,那麼您需要在授權標頭中使用完全相同的時間戳和隨機數;使用不同的簽名將意味着簽名無效。

1

我也陷入了同樣的事......你必須仔細閱讀規格:

http://developer.yahoo.com/oauth/guide/oauth-requesttoken.html

仔細按照每個字段的方向。例如,我沒有看到你指定了oauth_callback =「oob」。我錯過了這個領域,只要我指定它,我就得到了這個標記。

+1

呵呵,localhost不*關係重大。 – djunod 2011-08-04 14:59:49

0

我在回覆,希望它能幫助別人。

Yahoo!以小寫形式存儲域,並以混合大小寫形式將域存儲在回調變量中。

因此,我將域轉換爲全部小寫,並用「www」作爲前綴。這讓我解決了這個問題。嘗試擊中Yahoo!具有來自任何瀏覽器的最終OAUTH URL的服務器以查看實際的錯誤消息。在應用程序中它只是說「未經授權」。