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

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

但是,我收到了“ 已使用代码 ”错误。 这是我的callback代码

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'); }); }); 

我正在使用requestify执行发布请求,并没有使用/调用临时代码的服务器。 这是生成的错误:

 ... [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这样的其他types的模型,或者像GitHub这样简单的模型。 它应该相当简单,并且封装得更好。 这是一个完整的列表: http : //passportjs.org/如果你想探索。 更好的是,使这个模块可重用,其他人可以更标准的方式从中受益。

策略会为你交换令牌的代码。 可能的代码被使用的原因,你会得到这个错误。 这是标准OAuth2stream程的一部分。

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

在我的情况下,这是一个服务器线程池做后台工作,我们需要同步login,所以它只发生一次。 多个线程可以重复使用相同的access_token,只是不申请代码,然后并行申请一个access_token / refresh_token。

也可能发生这种情况,因为您有多个运行testing用例的人员/构build服务器,这些testing用例需要并行访问代码,然后访问access_tokens。

以下是为了获得令牌似乎是至关重要的几点:

  1. 设置正确的内容types和内容长度值。
  2. 该请求应该是HTTPS请求。
  3. 方法应该是POST。
  4. 我也安装并使用了Open SSL,只是为了避免由于服务器进行非安全调用而引起的任何问题。
  5. 使用Requestify进行的调用每次都失败,即使我设置了上面#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(); });