【问题标题】:Token already used error while fetching access token获取访问令牌时令牌已使用错误
【发布时间】:2014-05-08 19:02:09
【问题描述】:

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

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

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."}]})

【问题讨论】:

    标签: node.js api oauth-2.0 passport.js freelancer.com-api


    【解决方案1】:

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

    策略将为您交换代币的代码。可能是使用代码的原因,您会收到该错误。这是标准 OAuth2 流程的一部分。

    【讨论】:

    • 谢谢 Eugenio,我现在已经开始着手这方面的工作,并将结果发布在这里
    • 我已经制定了策略(github.com/SumitBisht/passport-elance),但问题仍然存在。 elance 网站中给出的创建 php 应用程序的进一步尝试也失败了。有什么方法可以检查 Oauth Server 状态吗?
    • @Sumit - 我希望你没有将此标记为正确,因为它不适合你。我花了很长时间试图弄清楚“这个答案的含义”,直到我意识到这是错误的答案:-)。
    • @Ryan 在你的回答中看到我的 cmets
    • @SumitBisht 知道了。至少,您应该将答案标记为正确。
    【解决方案2】:

    我遇到了同样的问题,必须与 Elance 支持部门合作才能解决。这个错误发生在我身上,因为来自具有相同 API 密钥的多个线程/服务器的同一用户的多个同时请求。

    在我的例子中,它是一个执行后台工作的服务器线程池,我们需要同步登录,所以它只发生一次。多个线程可以重复使用同一个access_token,只是不要并行申请一个code再申请一个access_token/refresh_token。

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

    【讨论】:

    • 实际上,我的情况并非如此,因为我是从单个客户端执行此操作的,并且没有使用可能导致这种重复策略的多线程/池。虽然您的回答很有帮助,但对我来说并非如此。
    【解决方案3】:

    以下是获得令牌的关键点:

    1. 设置正确的内容类型和内容长度值。
    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();
    });
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 2018-09-26
      • 1970-01-01
      • 2012-07-14
      • 2020-02-26
      • 2013-08-23
      • 2018-02-17
      • 2014-07-09
      相关资源
      最近更新 更多