我的下面代码每次都会返回401 Unauthorized错误:
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);
当我每次进入代码时,我看到所有信息都是雅虎要求在标题中提供的信息,但每次我得到这个信息时都会有。
答案 0 :(得分:2)
我相信你知道,401意味着没有授权。这可能意味着您的签名无效。
您没有发布所有代码,但我无法看到它如何正确生成正确的签名,因为您的签名方法似乎没有采用任何参数 - 最明显的是时间戳和nonce - 作为输入。如果您已经正确计算了签名,则需要在Authorized标头中使用完全相同的时间戳和nonce;使用不同的签名将意味着签名无效。
答案 1 :(得分:1)
好的,首先:
http://www.youtube.com/watch?v=lZLP0siJI-8&feature=related
其次,解决方案;
不要从localhost:P
运行它当我注册雅虎时,我应该仔细阅读,我第二次注册只是为了看,它清楚地说明你将从哪个域调用我们的API。
答案 2 :(得分:1)
我遇到了同样的事情......你必须仔细阅读规范:
http://developer.yahoo.com/oauth/guide/oauth-requesttoken.html
请仔细按照每个字段的说明进行操作。例如,我没有看到你指定了oauth_callback =“oob”。我也错过了这个领域,一旦我指定它,我就得到了令牌。
答案 3 :(得分:0)
我希望它会帮助别人。
雅虎!以小写形式存储域,我在回调变量中以混合大小写形式存储域。
所以我将域名转换为全部小写,并以“www”为前缀。这让我解决了这个问题。尝试打雅虎!具有来自任何浏览器的最终OAUTH URL的服务器,以查看实际的错误消息。在app中,它只是说“未经授权”。