【问题标题】:node-oauth Yahoo API oAuth2 issue节点 oauth 雅虎 API oAuth2 问题
【发布时间】:2015-07-08 02:22:22
【问题描述】:

我正在使用 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;

非常感谢任何帮助。我的大脑被炸了……

【问题讨论】:

    标签: node.js express oauth yahoo-api


    【解决方案1】:

    您似乎遗漏了一些步骤。我会先引导您阅读本指南:

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

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

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

    您刚才所做的是将用户的浏览器重定向到 yahoo 的授权页面,用户会在该页面上看到一个对话框,询问他们是否要允许您的服务 XYZ 访问代表用户执行操作。单击“允许”后,雅虎会将浏览器重定向到您的回调网址(雅虎指南的第 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}
    );
    

    【讨论】:

    • 非常感谢!!!这让我几乎一路走到了那里。我仍然没有得到 access_token,但现在得到了授权码。我得到的错误是“{ statusCode: 400, data: '{"error":"invalid_request"}' }"。无论如何,一旦我在那里,我会回帖,我会发布我为第 5 步所做的:) 再次感谢
    • 我认为问题可能在于雅虎要求您通过Authorization Basic 标题在get_token 调用上传递您的雅虎密钥/秘密。不幸的是,npm oauth 模块假定您的意思是将其发送到帖子正文 github.com/ciaranj/node-oauth/blob/a4b96a/lib/oauth2.js#L163
    • ...但您可以将其指定为OAuth2 构造函数中customHeaders 选项的一部分。我已更新我的答案以包含此内容。
    • 嗨 Andrew,我只是想让你知道我会在这个周末尝试更改并报告它是否有效,它是如何工作的等等。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2012-04-10
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多