2015-04-29 2 views
1

Я создаю приложение с node.js и express.js. Я использую модуль node-oauth для подключения к yahoo, чтобы я мог получить запросы к api. Я получаю ошибку нижеnode-oauth Yahoo API oAuth2 issue

{ statusCode: 401, 
    data: '{"error":{"@lang":"en-US", 
      "@uri":"http://yahoo.com", 
      "description":"Not Authorized - Either YT cookies or a valid OAuth token must be passed for authorization","detail":"Not Authorized - Either YT cookies or a valid OAuth token must be passed for authorization"}}' } 

Попробовав на некоторое время, чтобы понять мою проблему, я прошу сообщество, чтобы проверить свой код и посмотреть, что я делаю неправильно. Код приведен ниже.

"use strict"; 

// declare libraries 
var express = require('express'); 
var router = express.Router(); 
var OAuth = require('OAuth'); 

// set yahoo key and secret 
var yahooKey = '*****************************************************'; 
var yahooSecret = '*********************************'; 

var oauth2 = new OAuth.OAuth2(
    yahooKey, 
    yahooSecret, 
    'https://api.login.yahoo.com/', 
    'oauth2/request_auth', 
    'oauth2/get_token', 
    null 
); 

router.get('/', function(req, res, next) { 
    var access_token = oauth2.getOAuthAccessToken(
    '', 
    {'grant_type':'authorization_code', 'redirect_uri':'http://www.domain.com'}, 
    function (e, access_token, refresh_token, results) { 
    // console.log(e); 
    // done(); 
    }); 
    // console.log(oauth); 
    oauth2.get(
    'https://social.yahooapis.com/v1/user/circuitjump/profile?format=json', 
    access_token, 
    function (error, data, response){ 
     if (error) { 
     console.error(error); 
     } 
     // data = JSON.parse(data); 
     // console.log(JSON.stringify(data, 0, 2)); 
     // console.log(response); 
    }); 
    res.render('index', { title: 'Express' }); 
}); 

// export route 
module.exports = router; 

Любая помощь очень ценится. Мой мозг жарится ...

ответ

0

Кажется, что вам не хватает некоторых шагов. Я хотел бы направить вас первым в этом руководстве:

https://developer.yahoo.com/oauth2/guide/flows_authcode/

Во-первых, от вашего стартового пути в «/», то нужно перенаправить (302) пользователя на страницу авторизации (шаг 2 из руководства в Yahoo). OAuth Lib есть помощник для вас, чтобы сгенерировать правильный URL:

var location = oauth2.getAuthorizeUrl({ 
    client_id: yahooKey, 
    redirect_uri: 'https://yourservice.com/oauth2/yahoo/callback', 
    response_type: 'code' 
}); 
res.redirect(location); 

Что вы сделали там вы перенаправляется браузер пользователя на страницу авторизации Yahoo, где пользователь получает диалоговое окно с запросом, если они хотят, чтобы ваши сервисный доступ XYZ, чтобы делать вещи от имени пользователя. После нажатия кнопки «Разрешить» yahoo перенаправит браузер на ваш URL-адрес обратного вызова (шаг 3 руководства yahoo), предоставив вам authorization code в параметрах запроса. В этом примере вы подключили на /oauth2/yahoo/callback

Вы можете установить, что как так (Шаг 4 руководства в Yahoo):

router.get('/oauth2/yahoo/callback', function(req, res) { 
    // Aha now I have an authorization code! 
    var code = req.query.code; 
    oauth2.getOAuthAccessToken(
     code, 
     { 
      'grant_type': 'authorization_code', 
      'redirect_uri': 'oob' 
     }, 
     function(e, access_token, refresh_token, results) { 
      console.log('Now I have a token', access_token, 'that I can use to call Yahoo APIs!'); 
      res.end(); 
     }); 
}); 

Я надеюсь, что все, что делает какой-то смысл. Я оставлю это как упражнение для вас, чтобы выяснить токен обновления (шаг 5). Если вы сделаете так далеко, что часть должна быть легко :)

Редактировать

Похоже, Yahoo также требует, чтобы вы отправить свой ключ и секрет в заголовке Authorization Basic. Вы можете сгенерировать этот заголовок и сообщить модулю oauth2 включить его так:

var encoded = new Buffer(yahooKey+":"+yahooSecret).toString('base64') 
var authHeader = "Basic " + encoded; 

var oauth2 = new OAuth.OAuth2(
    yahooKey, 
    yahooSecret, 
    'https://api.login.yahoo.com/', 
    'oauth2/request_auth', 
    'oauth2/get_token', 
    { Authorization: "Basic " + authHeader} 
); 
+1

Спасибо, связка !!! это достало меня почти всю дорогу. Я до сих пор не получаю access_token, но теперь получаю код авторизации. Ошибка, которую я получаю, это «{statusCode: 400, data: '{" error ":" invalid_request "}'}". Во всяком случае, как только я там, я отправлю сообщение, и я опубликую то, что я сделал для шага 5 :) Еще раз спасибо –

+0

Я думаю, что проблема может заключаться в том, что yahoo требует, чтобы вы передали свой ключ/секрет yahoo через «Авторизация Basic» 'header на вызове' get_token'. К сожалению, модуль npm oauth предполагает, что вы хотите отправить его в тело сообщения https://github.com/ciaranj/node-oauth/blob/a4b96a/lib/oauth2.js#L163 –

+0

... но вы можете указать его как часть опции customHeaders в конструкторе 'OAuth2'. Я обновил свой ответ, чтобы включить это. –