我目前正在尝试从Flickr请求令牌,然后能够对其OAuth方法进行一些调用。我知道我一定做错了,因为我得到的答复是签名错了,但老实说我遵循他们的指示(http://www.flickr.com/services/api/auth.oauth.html, {{3 },http://www.flickr.com/services/api/auth.oauth.html#request_token)但我仍然收到错误:
oauth_problem=signature_invalid&debug_sbs=GET&http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3D%26oauth_consumer_key%3Da0f20d2c9b0a142848cffdf9d9a5ad78%26oauth_nonce%3DFCBB713F-581E-4BC6-42FF-C50252D839EC%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1330450158%26oauth_version%3D1.0
我不知道如何创建该签名以及如何将其放入请求中,是否有人能指出我正确的方向?谢谢!
我目前正在使用AS3,下面是我的代码:
// request params
var now:Date = new Date();
var requestParams:Object = {};
requestParams.oauth_callback = ""; // there is no callback, it's a desktop application
requestParams.oauth_consumer_key = API_KEY;
requestParams.oauth_nonce = UIDUtil.getUID(now);
requestParams.oauth_timestamp = String(now.time).substring(0, 10);
requestParams.oauth_signature_method = "HMAC-SHA1";
requestParams.oauth_version = "1.0";
// create an array to sort param names alphabetically
// mandatory to create signature
var sortedRequestParamNames:Array = [];
var name:String;
for(name in requestParams)
{
sortedRequestParamNames.push(name);
}
sortedRequestParamNames.sort();
// create signature
// see http://www.flickr.com/services/api/auth.spec.html#signing
var oauthSignature:String = API_SECRET;
var i:uint;
var numParams:uint = sortedRequestParamNames.length;
var paramName:String;
for(i = 0; i < numParams; i++)
{
paramName = sortedRequestParamNames[i];
oauthSignature += paramName + convertToPercentEntities(requestParams[paramName]);
}
oauthSignature = MD5.hash(oauthSignature);
// build request
var tokenRequestString:String = REQUEST_TOKEN_URL;
for(i = 0; i < numParams; i++)
{
paramName = sortedRequestParamNames[i];
tokenRequestString += (i == 0) ? "?" : "&";
tokenRequestString += paramName + "=" + requestParams[paramName];
}
tokenRequestString += "&oauth_signature=" + oauthSignature;
var tokenRequest:URLRequest = new URLRequest(tokenRequestString);
tokenRequest.method = URLRequestMethod.GET;
// load request
initLoader();
_loader.addEventListener(Event.COMPLETE, requestTokenLoadedHandler);
_loader.load(tokenRequest);
答案 0 :(得分:4)
基本上,您需要使用HMAC-SHA1算法而不是MD5。我会引导你完成它。
<强> 1。创建签名基本字符串
您似乎正在这样做(但您将其直接分配给签名变量)。编译基本字符串是通过连接三个不同的部分来完成的。
GET
http%3A%2F%2Fexample.com%2Frequest
它应该看起来像这样:
GET&http%3A%2F%2Fexample.com%2Frequest&a2%3Dr%2520b%26a3%3D2%2520q
%26a3%3Da%26b5%3D%253D%25253D%26c%2540%3D%26c2%3D%26oauth_consumer_
key%3D9djdj82h48djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_m
ethod%3DHMAC-SHA1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk
9d7dh3k39sj
现在您已完成签名基本字符串。让我们继续
<强> 2。找出你的签名密钥。
您的签名密钥采用以下格式:CONSUMER_SECRET + "&" + TOKEN_SECRET
。但由于您还没有令牌,因此签名密钥是消费者密钥和&符号。像这样:CONSUMER_SECRET + "&"
。
对于所有请求,除了第一个请求之外,您将拥有一个令牌,无论是请求令牌还是访问令牌。
第3。使用HMAC-SHA1算法组合密钥和基本字符串。
我在使用AS3签名时使用了http://code.google.com/p/as3crypto/。您甚至可以在此演示页面上测试其HMAC-SHA1算法:http://crypto.hurlant.com/demo/。
使用基本字符串作为输入,并使用签名密钥作为HMAC-SHA1算法的关键字。
HMAC-SHA1算法的输出将是二进制字符串,需要进行base64编码才能生成最终签名。看起来应该是这样的:
NYIQGEwIomgCuVOIA28pMDMID78=
这应该与请求一起作为oauth_signature
参数发送。
答案 1 :(得分:0)
我也遇到了问题,最后使用了FlickrNet API。