OAuth和Flickr问题 - 无法请求令牌

时间:2012-02-28 17:31:26

标签: actionscript-3 url oauth flickr

我目前正在尝试从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);

2 个答案:

答案 0 :(得分:4)

基本上,您需要使用HMAC-SHA1算法而不是MD5。我会引导你完成它。

<强> 1。创建签名基本字符串

您似乎正在这样做(但您将其直接分配给签名变量)。编译基本字符串是通过连接三个不同的部分来完成的。

  1. 将HTTP方法转换为大写,并将基本字符串设置为等于此值。示例:GET
  2. 附加'&amp;'字符串到基本字符串。
  3. 对URL进行百分比编码(不带参数)并将其附加到基本字符串。示例:http%3A%2F%2Fexample.com%2Frequest
  4. 附加'&amp;'字符串到基本字符串。
  5. 百分比对已排序的参数字符串进行编码,并将其附加到基本字符串。
  6. 它应该看起来像这样:

    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。

http://flickrnet.codeplex.com/