【问题标题】:Using a oauth token in second request - NODEJS在第二个请求中使用 oauth 令牌 - NODEJS
【发布时间】:2016-03-13 12:18:08
【问题描述】:

提前感谢您的帮助。

我正在尝试解决一个困扰我好几个星期的问题(尝试自己解决),但我非常卡住。

基本上,我有一个场景,我正在向身份服务器 (Oauth 2.0) 发送数据调用以检索然后在 API 调用中使用的令牌。

为此,我在 NodeJS 中设置了两个对请求模块的调用。第一次调用查询服务器,而第二次调用需要使用在第一次调用中检索到的令牌来访问我正在访问的 API。

我不知道如何从第一个调用(令牌)中获取变量,以便第二个请求可以访问。我一直在控制台中发现它是未定义的。

这是我迄今为止尝试过的代码。相关变量。尝试将变量令牌通过请求 2,因为我需要该令牌进行 api 调用。我在一个名为 dostuff 的函数中运行这些请求。

 var request = require('request');
    var http = require('http');
    var fs = require('fs');

    var options = {
    url: 'https://identitywebsite.com/connect/token',
    headers: {'authorization' : 'basic <<KEY>>', 'Content-Type' :    'application/x-www-form-urlencoded'},
    port: '443',
    path: '/users',
    method: 'POST',
    body: 'grant_type=password&username=<<USERNAME>>&password=<<PASSWORD>>&scope=read+write'


var dostuff = function() {

request(options, function(error, response, body){

    console.log("success");
    Data = JSON.parse(body);
    //console.log(xx);
    global.token = data.access_token;

})

};

var options2 = {

    url: 'https://apiwebsite.com',
    headers: {'authorization' : 'Bearer ' + token, 'Content-Type' : 'application/json'},
    port: '443',
    path: '/users',
    method: 'GET'

}

console.log(options2);

request(options2, function(error, response, apiresponse){
console.log("triggered");
    console.log(" data success2");
    apidata = JSON.parse(apiresponse);  
    console.log(apidata);   

});

【问题讨论】:

    标签: javascript node.js variables oauth


    【解决方案1】:

    你应该做几件事。一种是使用一些承诺。也尽量不要使用全局变量。

    您的第一个选项也缺少右括号。

    不过,Promise 确实很简洁,因为你可以做这样的事情。

    do_something(options)
              .then(function(my_data){
                       var options2 = {
                             url: 'https://apiwebsite.com',
                             headers: {'authorization' : 'Bearer ' + my_data, 'Content-Type' : 'application/json'},
                             port: '443',
                             path: '/users',
                             method: 'GET'
                             }
                      do_something_else(options2)
                                     .then(function(my_other_data){
                                               //do stuff with my_other_data
                                                }
                    }
    

    使用这个库!它使对请求的承诺变得非常容易!

    https://github.com/request/request-promise,您也可以在 bluebird 中执行此操作,这是我在所有 promise 库中最喜欢的,但它稍微复杂一些。

    编辑:

    因为有人发帖说这是题外话,但事实并非如此。我将更深入地探讨为什么这不能按照您认为的方式工作。这不能正常工作的原因之一是 Node.JS 是异步的。

    这意味着您的代码不会在运行第二个请求之前等待您的第一个请求完成,因此在您的下一个请求需要此之前,您实际上并没有获得令牌。

    解决这个问题的一种方法是使用我最初所说的 Promise。有很多库可以强制同步。例如有这个库:

    https://github.com/yortus/asyncawait

    还有更多。

    您可以进一步抽象,并从您的第二个请求中调用您的第一个请求,以获取 API 密钥并存储它。

    【讨论】:

    • 答案非常离题。请将此作为评论。
    • 我的回答很好,但我补充了。
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2010-12-14
    • 2012-05-01
    • 2011-09-05
    • 2017-10-26
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多