如果有基本授权,如何在Node.js中使用http.client


105

根据标题,我该怎么做?

这是我的代码:

var http = require('http');

// to access this url I need to put basic auth.
var client = http.createClient(80, 'www.example.com');

var request = client.request('GET', '/', {
    'host': 'www.example.com'
});
request.end();
request.on('response', function (response) {
  console.log('STATUS: ' + response.statusCode);
  console.log('HEADERS: ' + JSON.stringify(response.headers));
  response.setEncoding('utf8');
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

12
不推荐使用http.createClient。请改用“ http.request”。
thomas-peter 2012年

Answers:


271

您必须Authorization在标题中设置该字段。

Basic在这种情况下,它包含身份验证类型以及username:password在Base64中编码的组合:

var username = 'Test';
var password = '123';
var auth = 'Basic ' + Buffer.from(username + ':' + password).toString('base64');
// new Buffer() is deprecated from v6

// auth is: 'Basic VGVzdDoxMjM='

var header = {'Host': 'www.example.com', 'Authorization': auth};
var request = client.request('GET', '/', header);

4
整个过程就是这样。服务器希望数据在Base64中编码。
Ivo Wetzel

3
在此示例中,“客户”是什么?
史蒂文·索罗卡

1
哦..这是个问题。h 纳米
史蒂文·索罗卡

哇好厉害,真的帮了我!
克里斯·艾林森

61

Node.js http.request API文档中, 您可以使用类似于

var http = require('http');

var request = http.request({'hostname': 'www.example.com',
                            'auth': 'user:password'
                           }, 
                           function (response) {
                             console.log('STATUS: ' + response.statusCode);
                             console.log('HEADERS: ' + JSON.stringify(response.headers));
                             response.setEncoding('utf8');
                             response.on('data', function (chunk) {
                               console.log('BODY: ' + chunk);
                             });
                           });
request.end();

8
这是现代答案。
David Jones

2
您需要执行“ user:password”还是“ Basic user:password”?
凯蒂

2
@kayvar不,您不需要在Basic前面加上前缀。
Sujay

@MarceloFilho这是我在文档上仍然看到的内容auth <string>基本身份验证,即“ user:password”,用于计算Authorization标头。
Sujay

15
var username = "Ali";
var password = "123";
var auth = "Basic " + new Buffer(username + ":" + password).toString("base64");
var request = require('request');
var url = "http://localhost:5647/contact/session/";

request.get( {
    url : url,
    headers : {
        "Authorization" : auth
    }
  }, function(error, response, body) {
      console.log('body : ', body);
  } );

1
由于安全性和可用性问题,不建议使用Buffer()。请使用Buffer.alloc(),Buffer.allocUnsafe(),或Buffer.from()方法,而不是
Sourabh

13

一个更简单的解决方案是直接在URL中使用user:pass @ host格式。

使用请求库:

var request = require('request'),
    username = "john",
    password = "1234",
    url = "http://" + username + ":" + password + "@www.example.com";

request(
    {
        url : url
    },
    function (error, response, body) {
        // Do more stuff with 'body' here
    }
);

我也为此写了一个小博客


18
这不是理想的建议:在客户端或服务器端记录任何URL都可能暴露密码值-这是众所周知的安全攻击媒介。我强烈建议没有人这样做。标头值更好,并且不使用基本身份验证-例如,采用摘要身份验证或OAuth 1.0a更好。RFC 3986中的URI中也已弃用了这种标识形式。–
Les Hazlewood

不使用基本身份验证听起来像是一些不好的建议。基本身份验证需要传输安全性,或者完全不安全,是的。但是具有传输安全性的基本身份验证比摘要身份验证更安全。OAuth 1是完全不同的野兽,具有完全正交的安全性问题。
rich remer

@LesHazlewood说受感染的客户可以公开密码是不公平的。妥协的客户只是意味着所有赌注都没有了。但是,您的弃用警告是公平的。
nurettin

10

对于我在OSX上使用node.js 0.6.7的价值,我无法使用“ Authorization”:auth来与我们的代理一起使用,需要将其设置为“ Proxy-Authorization”:auth我的测试代码是:

var http = require("http");
var auth = 'Basic ' + new Buffer("username:password").toString('base64');
var options = {
    host: 'proxyserver',
    port: 80,
    method:"GET",
    path: 'http://www.google.com',
    headers:{
        "Proxy-Authorization": auth,
        Host: "www.google.com"
    } 
};
http.get(options, function(res) {
    console.log(res);
    res.pipe(process.stdout);
});

3
为了吸引未来的读者:那是因为您正在使用代理服务器进行身份验证,而不是使用目标网络服务器(google)进行身份验证。如果您需要通过目标服务器进行身份验证,则可以使用Authorization标头。
Maks

是的,但是通常您需要同时做这两个事情,所以这是一个不错的答案
Mond Raymond

由于安全性和可用性问题,不建议使用Buffer()。请使用Buffer.alloc(),Buffer.allocUnsafe(),或Buffer.from()方法,而不是
Sourabh

6
var http = require("http");
var url = "http://api.example.com/api/v1/?param1=1&param2=2";

var options = {
    host: "http://api.example.com",
    port: 80,
    method: "GET",
    path: url,//I don't know for some reason i have to use full url as a path
    auth: username + ':' + password
};

http.get(options, function(rs) {
    var result = "";
    rs.on('data', function(data) {
        result += data;
    });
    rs.on('end', function() {
        console.log(result);
    });
});

2

我最近遇到了这个。设置的Proxy-AuthorizationAuthorization标头中的哪个取决于客户端正在与之通信的服务器。如果是Web服务器,则需要设置授权,如果是代理,则必须设置Proxy-Authorization标头


1

经过大量研究,此代码对我而言适用。您将需要安装请求npm软件包

var url = "http://api.example.com/api/v1/?param1=1&param2=2";
var auth = "Basic " + new Buffer(username + ":" + password).toString("base64");
exports.checkApi = function (req, res) {
    // do the GET request
    request.get({
        url: url,
        headers: {
            "Authorization": auth
        }
    }, function (error, response, body) {
        if(error)
       { console.error("Error while communication with api and ERROR is :  " + error);
       res.send(error);
    }
        console.log('body : ', body);
        res.send(body);      

    });    
}

由于安全性和可用性问题,不建议使用Buffer()。请改用Buffer.alloc(),Buffer.allocUnsafe()或Buffer.from()方法
Sourabh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.