2010-09-08 145 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的服务器以查看实际的错误消息。在应用程序中它只是说“未经授权”。