Проблема с OAuth и Flickr - невозможно запросить токен - PullRequest
2 голосов
/ 28 февраля 2012

В настоящее время я пытаюсь запросить токен у Flickr, чтобы затем сделать несколько вызовов их методам OAuth. Я знаю, что, должно быть, что-то делаю не так, потому что я получаю ответ, что подпись неверна, но, честно говоря, я следовал их инструкциям (http://www.flickr.com/services/api/auth.oauth.html, http://www.flickr.com/services/api/auth.oauth.html#request_token, http://www.flickr.com/services/api/flickr.auth.oauth.getAccessToken.html), но все равно получаю ошибку:

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 ]

4 голосов
/ 29 февраля 2012

По сути, вам нужно использовать алгоритм HMAC-SHA1 вместо MD5. Я проведу тебя через это.

1. Создать базовую строку подписи

Вы, кажется, делаете это (но вы назначаете это непосредственно в переменную подписи). Компиляция базовой строки выполняется путем объединения трех разных частей.

  1. Преобразовать метод HTTP в верхний регистр и установить базовую строку равной этому значению. Пример: GET
  2. Добавление символа '&' к базовой строке.
  3. Процент кодирования URL (без параметров) и добавление его к базовой строке. Пример: http%3A%2F%2Fexample.com%2Frequest
  4. Добавьте символ '&' к базовой строке.
  5. Процент кодирования отсортированной строки параметров и добавление ее к базовой строке.

Это должно выглядеть так:

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.

Я использовал http://code.google.com/p/as3crypto/ при подписании с AS3. Вы даже можете проверить его алгоритм HMAC-SHA1 на этой демонстрационной странице: http://crypto.hurlant.com/demo/.

Использовать базовую строку в качестве ввода и ключ подписи в качестве ключа алгоритма HMAC-SHA1.

Выход алгоритма HMAC-SHA1 будет двоичной строкой, которая должна быть закодирована в base64 для получения окончательной сигнатуры. Это должно выглядеть примерно так:

NYIQGEwIomgCuVOIA28pMDMID78=

Это должно быть отправлено с запросом в качестве параметра oauth_signature.

0 голосов
/ 03 сентября 2012

У меня тоже были проблемы с этим, в итоге я использовал FlickrNet API.

http://flickrnet.codeplex.com/

...