2012-08-17 160 views
1

我正在嘗試使用請求模塊對Node.js進行REST API調用。我已經獲得了accessToken和accessTokenSecret。LinkedIn API失敗 - Node.js請求

當我做了一個API調用來獲得我的個人資料我得到一個結果,但是當我調用API做企業搜索我碰到下面的錯誤

<error> 
    <status>401</status> 
    <timestamp>1345187981287</timestamp> 
    <request-id>HE45IXV7YZ</request-id> 
    <error-code>0</error-code> 
    <message>[unauthorized]. OAU:xxxxx|xxxxx|*01|*01:1345188248:kCNFNUu6JePTEy7k5e8Ca9vHAzg=</message> 
</error> 

但是,當我做出同樣的API使用JAVA(Scribe jar)調用,使用相同的accessToken和accessTokenSecret我得到公司搜索的結果。

我張貼下面我Node.js的代碼以供參考

//oauth test 

var request = require('request'); 

var key = 'xxxxx'; 
var secret = 'xxxxx'; 
var redirect = ''; 
var restURL = 'http://api.linkedin.com/v1/company-search?keywords=philips&format=json'; 
var accessToken = 'xxxxx'; 
var accessTokenSecret = 'xxxxx'; 



var proxySetting = "http://proxy:port/"; 



function getRequestToken() 
{ 
    var requestOAuth = 
    { 
      consumer_key: key 
      , consumer_secret: secret 
      //, token: accessToken 
      //, token_secret: accessTokenSecret 
    }; 

    var requestTokenURL = 'https://api.linkedin.com/uas/oauth/requestToken'; 
    request.get({'proxy':proxySetting,url:requestTokenURL,oauth:requestOAuth},function(e,r,data) 
    { 
     console.log('Error is: ' + e); 
     console.log('Data is: ' + data); 
     console.log('Response is: ' + r); 
    }); 
} 




function getAccessToken() 
{ 
    var accessOAuth = 
    { 
      consumer_key: key 
      , consumer_secret: secret 
      , token: 'xxxxx' 
      , token_secret: 'xxxx' 
      ,verifier : ##### 
    }; 

    var accessTokenURL = 'https://api.linkedin.com/uas/oauth/accessToken'; 
    request.get({'proxy':proxySetting,url:accessTokenURL,oauth:accessOAuth},function(e,r,data) 
    { 
     console.log('Error is: ' + e); 
     console.log('Data is: ' + data); 
     console.log('Response is: ' + r); 
    }); 
} 

/  

function comSearch() 
{ 
    var apiToken = 'xxxxx'; 
    var apiTokenSecret = 'xxxxx'; 
    var apiOAuth = 
    { 
      consumer_key: key 
      , consumer_secret: secret 
      , token: apiToken 
      , token_secret: apiTokenSecret 
    }; 

    var apiURL = 'http://api.linkedin.com/v1/company-search?keywords=philips'; 
    var peopleProfile = 'http://api.linkedin.com/v1/people/~'; 
    request.get({'proxy':proxySetting,url:apiURL,oauth:apiOAuth},function(e,r,data) 
    { 
     console.log('Error is: ' + e); 
     console.log('Data is: ' + data); 
     console.log('Response is: ' + r); 
    }); 
}                

comSearch(); 

以下是我的頭

Response is: GET http://api.linkedin.com/v1/company-search?keywords=philips HTTP/1.1 
host: api.linkedin.com 
Authorization: OAuth keywords="philips",oauth_consumer_key="xxx",oauth_nonce="xxx",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1345189928",oauth_token="xxx",oauth_version="1.0",oauth_signature="xxx" 
content-length: 0 
Connection: keep-alive 

難道還有一些錯誤,由於簽名問題是什麼?

我已經發布這個Issue,但在這裏張貼到更廣泛的受衆


編輯1

原因,我現在用的request模塊,它可以幫助我做的OAuth背後的代理。

我很想嘗試Passport.jsnode-oauthlinked-in但沒有似乎有選擇,我可以指定我的代理

回答

2

我設法得到它的工作使用節點的OAuth

顯然有提供這樣我們就可以通過代理訪問節點的OAuth和運行完美的代碼修復。

Jared Hanson在此SO Question中提到了通過http代理使用node-oauth的修復方法。通過http代理可以找到node-oauth的修復程序here

0

請分享您的生成基礎簽名字符串。看起來好像你的查詢參數並沒有被正確地添加到簽名字符串中。在linkedIn論壇上的一些舊帖子中,我已經看到參數需要在字符串中組織,以便以字母數字順序登錄。

+0

如何獲取我生成的基本簽名字符串? – 2012-08-17 09:15:32

+0

我沒有使用JS框架,所以我不能完全說。瀏覽器中可能有一些嗅探器或調試器。它可能如下所示:_http%3A%2F%api.linkedin.com%2Fv1%2Fpeople&keywords%3Drealex%26oauth_consumer_key%3Dconsumer_key%26oauth_nonce%3Dabcdefghijk%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D123456%26oauth_token%3Da_token%26oauth_version%3D1。 0%26_ – 2012-08-17 10:20:56