node-oauth Yahoo API oAuth2问题

时间:2015-04-29 01:38:20

标签: node.js express oauth yahoo-api

我正在使用node.js和express.js构建应用程序。我正在使用node-oauth模块连接到yahoo,所以我可以向api发出get请求。我一直收到以下错误

{ 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;

非常感谢任何帮助。我的大脑被炒了......

1 个答案:

答案 0 :(得分:0)

你似乎错过了一些步骤。我会先指导你这本指南:

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

首先,从您在' /'的起始路径,您需要将用户重定向(302)到授权页面(雅虎指南的第2步)。 oauth lib有一个帮助您生成正确的URL:

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

您刚刚在那里做了什么,您将用户的浏览器重定向到雅虎的授权页面,在该页面中,用户会收到一个对话框,询问他们是否允许您的服务XYZ访问权限对用户执行操作&# 39;代表。点击"允许",雅虎会将浏览器重定向到您的回调网址(雅虎指南的第3步),在查询参数中为您提供authorization code。在这个例子中,您已经联系到/oauth2/yahoo/callback

你可以这样设置(雅虎指南的第4步):

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}
);