【问题标题】:Basic authentication not working in node-rest-client node基本身份验证在 node-rest-client 节点中不起作用
【发布时间】:2017-05-13 12:03:21
【问题描述】:

我正在使用 node-rest-client 库来调用我的 rest API,在测试服务器中运行 python 烧瓶应用程序。节点设置和请求代码如下。

如果我将用户令牌添加到请求标头中它的话很好,但是在使用基本身份验证获取用户令牌的调用中,我的 python 系统成功验证并返回具有 200 状态的令牌,但是烧瓶服务器是将其更改为 400 错误请求。使用 Postman 拨打电话效果很好。

我的 node-rest-client 的两个配置对象中是否缺少某些内容?

干杯。

var options_auth = { 
    user: "bob", 
    password: "password",
    mimetypes: {
        json: ["application/json", "application/json;charset=utf-8"]
    } 
};

var Client = require('node-rest-client').Client;
var client = new Client(options_auth);
var method = "/authtoken";

var args = {
    headers: { 
        "Content-Type": "application/json",
        "api-key": "asf89a7assa98d7sd98d98ds",
        //"token": "dsf98s7dsf98dsf7sd98f7dsf",
        "Accept": "application/json"
    },
    responseConfig: {
        timeout: 1000 //response timeout
    }
};

client.get(Api.url+method, args, function (data, response) {
    // parsed response body as js object 
    // raw response 
    //console.log(response);

    if(Buffer.isBuffer(data)){
        data = data.toString('utf8');
    }
    console.log(data);

    var stringData = data.toString('utf8');

    console.log("String data = "+stringData);

}).on('error', function (err) {
    console.error('Something went wrong with the http client', err);
});

另外,发现服务器收到的请求标头之间的这些差异:

// Node Request fails: 400
  'headers': EnvironHeaders([
        ('Authorization', u'Basic XXXXXXXXXXXXXX=='),
        ('Vga-Api-Key', u'xxxxxxxxxxxxxxxxxxxxxxxx'),
        ('Content-Length', u'0'), 
        ('Connection', u'close'), 
        ('Host', u'127.0.0.1:8080'), 
        ('Accept', u'*/*'), 
        ('Content-Type', u'application/json')]),

  // Postman Request works: 200
  'headers': EnvironHeaders([
        ('Authorization', u'Basic XXXXXXXXXXXXXX=='), 
        ('Vga-Api-Key', u'xxxxxxxxxxxxxxxxxxxxxxxx'), 
   *    ('Content-Length', u''), 
   *    ('Connection', u'keep-alive'), 
        ('Host', u'127.0.0.1:8080'), 
   *    ('Cache-Control', u'no-cache'), 
        ('Accept', u'*/*'), 
        ('Content-Type', u''), 
   *    ('Accept-Encoding', u'gzip, deflate')]),

【问题讨论】:

    标签: python node.js rest


    【解决方案1】:

    问题在于您对标头Content-Type: application/json 的设置以及request.get_json() 的服务器中可能直接或通过(已弃用)request.json 属性间接调用。

    get_json() 被调用时,Flask 将检查是否已在请求正文中发送 JSON 有效负载,然后解析它(如果存在)。如果请求实际上在正文中包含 JSON,那没关系,但是,作为 GET 请求,您的请求没有。在这种情况下,它的 JSON 期望未实现,服务器引发 BadRequest 错误并返回 HTTP 400 错误响应。

    根据您显示的内容,您的请求不需要是 JSON,因为授权用户名和密码在 Authorization: Basic xxxxxxxx 标头中传递。

    解决问题的最简单和最好的方法是简单地省略内容类型标题。

    或者,如果没有要解析的 JSON 数据,您可以告诉 Flask 不要抱怨,方法是将 silent=True 传递给 get_json,但这只是解决了问题,并不是一个好主意。

    【讨论】:

    • 嗨,不,我没有在请求正文中传递任何内容,所以没有在烧瓶端提取 JSON。实际上我只是添加了内容以尝试解决问题:-)
    • 实际上,我刚刚通过删除烧瓶端的一些目前不需要的操作来工作,并且它工作了 - 我尝试了另一个提取用户数据的函数,它工作正常。所以也许这是某种时间问题?它很奇怪,也许我会再次遇到这个问题,但现在它有效。不会说我已经解决了它,只是暂时回避了这个问题。另外,我是 Node 新手,但我没有看到使用 node-rest-client 比使用标准 http 客户端有多大收获。
    • @Jon:你删除了什么?
    • 啊,我确实删除了一些与 JSON 相关的内容。 if request.json and 'eit' in request.json: - 不知道是不是这样,按照您之前的建议进行。我没想到代码块会运行,但正如您上面描述的那样,它可能足以破坏它。
    • 我会尝试使用“解决问题的最简单和最好的方法是简单地省略内容类型标题。”
    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2014-09-06
    • 2014-01-22
    • 2016-01-11
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多