我试图从雅虎提取细节!使用OAuth2.0的Fantasy Sports API。我使用YQL查询access_token
。我的代码
using (var client = new System.Net.WebClient())
{
client.Headers.Add("Authorization", "Bearer " + response.access_token);
var query = "select%20*%20from%20fantasysports.games%20where%20game_key%3D'nfl'";
Response.Write(query);
var url = String.Format("https://query.yahooapis.com/v1/yql?q={0}&format=json&diagnostics=true&callback=", query);
output = client.DownloadString(url);
}
我的回复
{
"query": {
"count": 0,
"created": "2015-09-27T17:39:48Z",
"lang": "en-US",
"diagnostics": {
"publiclyCallable": "true",
"url": {
"execution-start-time": "4",
"execution-stop-time": "137",
"execution-time": "133",
"http-status-code": "401",
"http-status-message": "Authorization Required",
"content": "http://fantasysports.yahooapis.com/fantasy/v2/games;game_keys=nfl"
},
"user-time": "138",
"service-time": "133",
"build-version": "0.2.240"
},
"results": null
}
}
我收到需要授权状态消息。
我认为必须对我的请求标题执行某些操作。有人可以帮我理解为什么我的请求在这里被拒绝了吗?
答案 0 :(得分:3)
雅虎!有两个OAuth授权流程
雅虎注意到,
大多数Fantasy API数据都依赖于三脚架OAuth 数据特定于某个Yahoo!用户。但是,你可以使用 两条OAuth,用于请求纯粹的公共数据。双腿OAuth 有效地归结为在不设置访问权限的情况下发出请求 令牌通过默认的PHP OAuth库,或有效地使用您的 消费者密钥/秘密作为令牌。
所以我们应该按照Yahoo!中的描述进行three-legged flow of OAuth authorization文档。在授权流程结束时,您将获得oauth_token
和oauth_token_secret
。
雅虎已在C#(Link here)中提供此代码。
public static string GetUserDataFromYahoo(string requestEndPoint, string token, string tokenSecret)
{
var data = String.Empty;
var uri = new Uri(requestEndPoint);
string url, param;
var oAuth = new OAuthBase();
var nonce = oAuth.GenerateNonce();
var timeStamp = oAuth.GenerateTimeStamp();
var signature = oAuth.GenerateSignature(
uri,
consumerKey,
consumerSecret,
token,
tokenSecret,
"GET",
timeStamp,
nonce,
OAuthBase.SignatureTypes.HMACSHA1,
out url,
out param);
data = String.Format("{0}?{1}&oauth_signature={2}", url, param, signature);
var requestParametersUrl = String.Format("{0}?{1}&oauth_signature={2}", url, param, signature);
var request = WebRequest.Create(requestParametersUrl);
using (var response = request.GetResponse())
using (Stream dataStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(dataStream))
{
data = reader.ReadToEnd();
}
return data;
}
此代码使用此OAuthBase.cs class。
当您使用此代码时,您将获得
OST_OAUTH_SIGNATURE_INVALID_ERROR
这是因为OAuthBase.cs有一个bug that's been noted here。要纠正你必须这样做。
第199行(在NormalizeRequestParameters方法中)必须从:
更改sb.AppendFormat("{0}={1}", p.Name, p.Value);
到
sb.AppendFormat("{0}={1}", UrlEncode(p.Name), UrlEncode(p.Value));
快乐的编码!
答案 1 :(得分:2)
我建议你没有正确收到access_token
。这就是你在服务器上调用Authorization Required
的原因。
您需要检查获得access_token