2015-04-29 102 views
1

我正在用node.js和express.js構建一個應用程序。我正在使用node-oauth模塊連接到雅虎,這樣我就可以向api發出請求。我不斷收到以下node-oauth Yahoo API oAuth2問題

{ 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步)。該OAuth的LIB有一個幫手爲你生成正確的網址:

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

什麼,你只是做了有你重定向用戶的瀏覽器到雅虎的授權頁面,在這裏用戶得到一個對話框,詢問他們是否要允許您服務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)。如果你做了這一步,這部分應該是很容易:)

編輯

它看起來像雅虎也需要你把你的密鑰和密碼的授權基本頭。你可以生成這個頭文件並告訴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

我認爲問題可能是,雅虎要求你通過你的雅虎密鑰/祕密通過'Authorization Basic ''get_token'調用的頭部。不幸的是,npm oauth模塊假定你的意思是在郵件正文中發送它https://github.com/ciaranj/node-oauth/blob/a4b96a/lib/oauth2.js#L163 –

+0

...但是你可以指定它作爲「OAuth2」構造函數中'customHeaders'選項的一部分。我已經更新了我的答案以包含此內容。 –