基本身份验证在node-rest-client节点

时间:2017-05-13 12:03:21

标签: python node.js rest

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

如果我将一个用户令牌添加到请求标题中,那么它很好,但在使用基本身份验证获取用户令牌的调用中,我的python系统成功进行身份验证并返回具有200状态的令牌,但烧瓶服务器则是将此更改为400 Bad Request。它可以使用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')]),

1 个答案:

答案 0 :(得分:1)

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

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

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

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

或者你可以告诉Flask如果没有要通过将silent=True传递给get_json来解析JSON数据就不要抱怨,但这只是对这个问题进行了论证并不是一个好主意。