在获取访问令牌时,已使用令牌错误



我试图设置一个node.js应用程序,使用OAuth2.0使用Elance API我正在使用passport.js连接到elance api,到目前为止我能够正确地获得代码。在使用api方法之前,我需要使用post请求获得请求令牌。

然而,我得到一个'代码已经使用'错误。这是我的回调代码

app.get('/callback', 
  passport.authenticate('elance', { failureRedirect: '/failure' }),
  function(req, res) {
    console.log('CODE : ' + req.query.code); // this is getting displayed properly
 var payload = {
    code: req.query.code,
    grant_type:'authorization_code',
    client_id: auth.CLIENT_ID,
    client_secret: auth.CLIENT_SECRET
  };
request.post('https://api.elance.com/api2/oauth/token/', payload)
   .then(function(response) {
        var x = response.getBody();
        console.log('resp::::'+x);
        res.redirect('/success');
    });
});

我使用请求来执行post请求,并且不使用/调用临时代码的服务器。下面是生成的错误:

... [Sat, 29 Mar 2014 05:54:15 GMT] "GET /callback?code=F9t-zztOLJ3IOlbGXlsqous686HstXqkv7etrvEnF11Vg4M HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:30.0) Gecko/20100101 Firefox/30.0"
InternalOAuthError: Failed to obtain access token (status: 401 data: {"errors":[{"code":null,"description":"Code already used."}]})

也许用Elance实现这个的正确方法是编写一个strategy。只需使用其他发布的一个,如Facebook作为模型,或一个更简单的,如GitHub。它应该相当直接,并且封装得更好。这里有一个完整的列表:http://passportjs.org/如果你想探索。更好的是,使这个模块可重用,其他人就可以以更标准的方式从中受益。

策略将为您交换令牌的代码。可能是代码被使用的原因,然后你得到了那个错误。这是标准OAuth2流程的一部分。

我也遇到过同样的问题,不得不与Elance的支持人员合作来解决这个问题。这个错误发生在我身上,因为多个同时请求来自多个线程/服务器的同一用户,具有相同的API密钥。

在我的例子中,它是一个正在做后台工作的服务器线程池,我们需要同步登录,所以它只发生一次。多个线程可以重用同一个access_token,只是不需要同时申请一个代码和一个access_token/refresh_token。

这也可能发生,因为您有多个人/构建服务器运行测试用例,这些测试用例请求代码,然后并行访问_tokens。

为了接收令牌,以下几点似乎是至关重要的:

  1. 设置正确的内容类型和内容长度值。
  2. 请求应该是HTTPS请求。
  3. 方法应该是POST。
  4. 我还安装并使用了Open SSL,只是为了避免由于服务器进行的非安全呼叫而引起的任何问题。
  5. 使用requesttify的调用每次都失败,即使我设置了上面#1中提到的相同的头信息。正如所附的截图所示,它可以正常工作与正常的https请求调用。

后续查询的JSON响应从以下代码中获得:

var request = require("request");
var jobURL = 'https://api.elance.com/api2/jobs/my?access_token=' + _token;
request(jobURL, function (error, response, body) {
    res.write(body);
    res.end();
});

最新更新