5

此时,我的以下代码每次都会返回 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);

当我每次进入代码时,我看到雅虎请求在标题中包含的所有信息,但每次我得到这个 401。

4

4 回答 4

2

我相信您知道,401 表示未经授权。这可能意味着您的签名无效。

您没有发布所有代码,但我看不出它如何正确生成正确的签名,因为您的签名方法似乎不采用任何参数 - 最明显的是时间戳和随机数 - 作为输入。如果您已经正确计算了签名,那么您需要在 Authorized 标头中使用完全相同的时间戳和随机数;使用不同的将意味着签名无效。

于 2010-11-20T19:26:23.350 回答
1

好的,首先:

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

其次,解决方案;

不要从本地主机运行它:P

当我在雅虎注册时,我应该更仔细地阅读,我第二次注册只是为了看看,它清楚地说明了您将从哪个域调用我们的 API。

于 2010-09-10T09:48:41.837 回答
1

我遇到了同样的事情......你必须仔细阅读规范:

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

仔细遵循每个字段的说明。例如,我没有看到您指定了 oauth_callback="oob"。我也错过了那个字段,只要我指定它,我就得到了令牌。

于 2011-08-04T14:59:25.430 回答
0

我正在回复,希望它会帮助别人。

雅虎!以小写形式存储域,我将域以混合大小写存储在回调变量中。

因此,我将域转换为全小写,并在其前面加上“www”。这让我解决了这个问题。尝试打雅虎!具有来自任何浏览器的最终 OAUTH URL 的服务器,以查看实际的错误消息。在应用程序中,它只是说“未经授权”。

于 2013-02-23T23:13:57.327 回答