我正在使用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;
非常感谢任何帮助。我的大脑被炒了......
答案 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}
);