Cách sử dụng http.client trong Node.js nếu có ủy quyền cơ bản


105

Theo tiêu đề, làm thế nào để làm điều đó?

Đây là mã của tôi:

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 không được dùng nữa. Sử dụng 'http.request' để thay thế.
thomas-peter

Câu trả lời:


271

Bạn phải đặt Authorizationtrường trong tiêu đề.

Nó chứa kiểu xác thực Basictrong trường hợp này và sự username:passwordkết hợp được mã hóa trong 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
Đó chỉ là cách toàn bộ hoạt động. Máy chủ mong đợi dữ liệu được mã hóa trong Base64.
Ivo Wetzel

3
'Khách hàng' trong ví dụ này là gì?
Steven Soroka,

1
oh .. nó trong câu hỏi. tât nhiên. nm.
Steven Soroka,

Wow quá tuyệt vời, thực sự đã giúp tôi!
Chris Allinson

61

Từ http.request API Documents của Node.js, bạn có thể sử dụng thứ gì đó tương tự như

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
Đây là câu trả lời của thời hiện đại.
David Jones

2
Bạn có cần thực hiện "user: password" hay "Basic user: password" không?
Katie

2
@kayvar Không, bạn không cần phải thêm tiền tố bằng Basic.
Sujay

@MarceloFilho Đây là những gì tôi thấy trên tài liệu vẫn còn auth <string> Xác thực cơ bản tức là 'user: password' để tính toán tiêu đề Ủy quyền.
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 () không được dùng nữa do các vấn đề về bảo mật và khả năng sử dụng. Vui lòng sử dụng các phương thức Buffer.alloc (), Buffer.allocUnsafe () hoặc Buffer.from () để thay thế
Sourabh

13

Một giải pháp dễ dàng hơn là sử dụng định dạng user: pass @ host trực tiếp trong URL.

Sử dụng thư viện yêu cầu :

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
    }
);

Tôi cũng đã viết một bài đăng blog nhỏ về điều này.


18
Đây không phải là lời khuyên lý tưởng: bất kỳ ghi nhật ký URL nào ở phía máy khách hoặc máy chủ đều có thể làm lộ giá trị mật khẩu - đây là một vectơ tấn công bảo mật được biết đến rộng rãi. Tôi đặc biệt khuyên rằng không ai làm điều này. Giá trị tiêu đề tốt hơn và không sử dụng Xác thực cơ bản - có lợi cho xác thực Thông báo hoặc OAuth 1.0a (ví dụ) thậm chí còn tốt hơn. Hình thức này xác định cũng đã được tán thành trong URI trong RFC 3986.
Les Hazlewood

Không sử dụng Basic Auth nghe có vẻ như là một số lời khuyên tồi. Xác thực cơ bản yêu cầu bảo mật truyền tải hoặc nó hoàn toàn không an toàn, vâng. Nhưng xác thực cơ bản với bảo mật truyền tải là cách xác thực Digest an toàn hơn. Và OAuth 1 là một con quái vật hoàn toàn khác với các vấn đề bảo mật hoàn toàn trực giao.
rich remer

@LesHazlewood Không công bằng khi nói rằng các ứng dụng khách bị xâm nhập có thể để lộ mật khẩu. Khách hàng được thỏa thuận đơn giản có nghĩa là tất cả các cược đã tắt. Tuy nhiên, cảnh báo không dùng nữa của bạn là hợp lý.
nurettin 14/09/18

10

đối với những gì nó đáng giá, tôi đang sử dụng node.js 0.6.7 trên OSX và tôi không thể nhận được 'Ủy quyền': auth để hoạt động với proxy của chúng tôi, nó cần được đặt thành 'Ủy quyền proxy': auth mã thử nghiệm của tôi là :

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
Đối với việc chỉnh sửa độc giả trong tương lai: Đó là vì bạn đang xác thực bằng máy chủ proxy của mình thay vì xác thực bằng máy chủ web đích (google). Nếu bạn cần xác thực với máy chủ đích thì tiêu đề Ủy quyền sẽ là thứ bạn muốn sử dụng.
Maks

Có, nhưng thường bạn cần phải làm cả hai vì vậy đây là một câu trả lời rắn
Mond Raymond

Buffer () không được dùng nữa do các vấn đề về bảo mật và khả năng sử dụng. Vui lòng sử dụng các phương thức Buffer.alloc (), Buffer.allocUnsafe () hoặc Buffer.from () để thay thế
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

Tôi đã xem qua điều này gần đây. Cái nào trong số các tiêu đề Ủy quyềnỦy quyền proxy để đặt tùy thuộc vào máy chủ mà máy khách đang nói chuyện. Nếu đó là một Máy chủ web, bạn cần đặt Ủy quyền và nếu đó là một proxy, bạn phải đặt tiêu đề Cấp quyền cho proxy


1

Mã này hoạt động trong trường hợp của tôi, sau rất nhiều nghiên cứu. Bạn sẽ yêu cầu cài đặt gói npm yêu cầu .

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 () không được dùng nữa do các vấn đề về bảo mật và khả năng sử dụng. Vui lòng sử dụng các phương thức Buffer.alloc (), Buffer.allocUnsafe () hoặc Buffer.from () để thay thế
Sourabh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.