1

我正在尝试使用请求模块对 Node.js 进行 REST API 调用。我已经获得了 accessToken 和 accessTokenSecret。

当我进行 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>  

但是,当我使用 JAVA(Scribe jar)进行相同的 API 调用时,使用相同的 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

由于签名问题会不会有一些错误?

我已发布此问题,但将其发布在这里以吸引更广泛的受众


编辑 1

我使用请求模块的原因是,它可以帮助我在代理后面进行 oauth。

我很想尝试Passport.jsnode-oauthlinked-in,但似乎没有一个选项可以指定我的代理

4

2 回答 2

2

我设法使用 node-oauth 让它工作

显然提供了代码修复,以便我们可以通过代理访问 node-oauth,并且效果很好。

Jared Hanson 在这个SO Question中提到了在 http-proxy 上使用 node-oauth 的修复。可以在此处找到通过 http-proxy 对 node-oauth 的修复

于 2012-08-17T10:49:06.963 回答
0

请分享您生成的基本签名字符串。您的查询参数似乎没有正确添加到签名字符串中。在linkedIn论坛上的一些旧帖子中,我看到需要在字符串中组织参数才能以字母数字顺序登录。

于 2012-08-17T09:00:15.853 回答