Ошибка OATH 401 расширения Chrome (несанкционированная)

#javascript #oauth #google-chrome-extension

#javascript #oauth #google-chrome-extension

Вопрос:

Я использую JS для доступа к плагину rdio. Я использую следующее для Oauthhttp://code.google.com/chrome/extensions/tut_oauth.html . Я могу получить подписанный токен и т.д. Однако, когда я когда-либо пытаюсь отправить signedRequest наhttp://api.rdio.com/1 /, Я получаю 401, неавторизованную ошибку.

X-Mashery-Код ошибки:ERR_401_INVALID_SIGNATURE X-Mashery-Ответчик: mashery-web4.LAX

Это то, что я пытаюсь отправить:

  var url = 'http://api.rdio.com/1/';
 var request = {
   'method': 'POST',
   'headers': {
     'Content-Type': 'application/x-www-form-urlencoded'
   },    
   'parameters': {
     'alt': 'json',
     'method':'currentUser'
   },
   'body': 'Data to send'
 };

 bgPage.oauth.sendSignedRequest(url, mycallback, request);  
  

Я получаю следующую ошибку в консоли.

 Request URL:http://api.rdio.com/1/?alt=jsonamp;method=currentUseramp;oauth_consumer_key=yv8ehzehdv55**********amp;oauth_nonce=******amp;oauth_signature=**********amp;oauth_signature_method=HMAC-SHA1amp;oauth_timestamp=1305190893amp;oauth_token=us6myp99p4qc86umea9p8fp*****************
Request Method:POST
Status Code:401 Unauthorized
Request Headers
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:12
Content-Type:application/x-www-form-urlencoded
Cookie:__qca=P0-158278476-1296771701175; r=eyJfdSI6IDE5MjY1LCAiX2UiOiAzMTU1NjkyNn0.SvN8xd7rIuLzTp7hxqi4eJEdvu8; __utmz=225830489.1305153361.198.18.utmcsr=rdioquiz.ianloic.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utma=225830489.281668250.1296676147.1305184513.1305187119.201; __utmc=225830489
Host:api.rdio.com
Origin:chrome-extension://oiojbkkpmcgmpnjkhjmaggajckamjkap
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24
Query String Parameters
alt:json
method:currentUser
oauth_consumer_key:yv8ehzehdv55pbb74ss9dt23
oauth_nonce:BQF0x
oauth_signature:KttF************tRO 8PL yjPF2Ktk=
oauth_signature_method:HMAC-SHA1
oauth_timestamp:1305190893
oauth_token:us6myp99p4qc86umea9p8fphbgq4dxdd76txvyn***********
Form Data
Data to send:
Response Headers
Accept-Ranges:bytes
Content-Length:30
Content-Type:text/xml
Date:Thu, 12 May 2011 09:01:33 GMT
Server:Mashery Proxy
X-Mashery-Error-Code:ERR_401_INVALID_SIGNATURE
X-Mashery-Responder:mashery-web4.LAX    
  

* Я просто пытаюсь имитировать то, что упомянуто здесь. Это библиотека Oauth (http://code.google.com/chrome/extensions/tut_oauth.html ) от Google для упрощения разработки расширений Chrome.
У них есть пример кода Oauth для получения вашего списка документов и т.д.http://code.google.com/chrome/extensions/samples.html#4e35caa9742fb82dbd628892d23a781614f6eff6
Я думаю, что я не могу пройти мимо отправки POST-запроса в rdio API. Выдает неавторизованную ошибку.*

Комментарии:

1. Общеизвестно, что OAuth сложно отлаживать, можете ли вы использовать приложение на hueniverse.com/2008/10 / … чтобы увидеть, сравните подпись с тем, что выводится вашим кодом.

2. Спасибо, это очень помогло бы в отладке.

Ответ №1:

Мы обнаружили аналогичную проблему с тем же сервисом (rdio) и методом («CurrentUser»).

В итоге сработало следующее: (1) убедитесь, что у вас есть method= CurrentUser в теле сообщения; Я не уверен из приведенного выше вывода curl, так ли это.

И это тот бит, который фактически устранил проблему: (2) нам пришлось также добавить имя метода к самой подписи.

К вашему сведению, мы использовали эту библиотеку:https://oauth.googlecode.com/svn/code/javascript

Но сложная часть, как вы видите, заключалась в том, чтобы выяснить, как заполнить метод в той библиотеке, которая создает подпись. Без ‘method= CurrentUser’, являющегося частью подписи, мы столкнулись с тем же состоянием ошибки.

Ответ №2:

Проверьте свой часовой пояс, дату и время на вашем компьютере. Если какой-либо из этих параметров неверен, OAuth завершится ошибкой.

Комментарии:

1. как это связано с Oauth?

2. OAuth использует «одноразовые номера», числа, которые предназначены для использования один и только один раз. Из-за этого провайдерам необходимо отслеживать большое количество одноразовых номеров. Чтобы ограничить количество одноразовых номеров, которые провайдерам необходимо запоминать, одноразовые номера OAuth действительны только в течение определенного периода времени, после чего провайдер может их забыть. Считается нормальным. Более подробная информация доступна здесь: hueniverse.com/oauth/guide/security