Як використовувати http.client в Node.js, якщо є основна авторизація


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

Відповіді:


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.
Іво Ветцель

3
Що таке "клієнт" у цьому прикладі?
Стівен Сорока

1
о .. це в питанні. дух. нм.
Стівен Сорока

Нічого чудово, мені дуже допомогли!
Кріс Аллінсон

61

З Документів API 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
Це відповідь сучасності.
Девід Джонс

2
Чи потрібно робити "user: password" або "Basic user: password"?
Кеті

2
@kayvar Ні, вам не потрібно буде префіксувати базовим.
Суджай

@MarceloFilho Це те, що я бачу в документах досі auth <string> Основна автентифікація, тобто "user: password" для обчислення заголовка авторизації.
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.alloc (), Buffer.allocUnsafe () або Buffer.from () методи замість
Sourabh

13

Простішим рішенням є використання користувача: передайте формат @ хост безпосередньо в URL.

Використання бібліотеки запитів :

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-адрес на стороні клієнта чи сервера може виявити значення пароля - це широко відомий вектор атаки безпеки. Я настійно рекомендую нікому цього не робити. Значення заголовків є кращими, а не за допомогою базової автентифікації - на користь Digest аутентифікації або OAuth 1.0a (наприклад) ще краще. Ця форма ідентифікації була також застаріла в URI в RFC 3986.
Les Hazlewood

Не використовувати Basic Auth звучить як погана порада. Базовий аутентифікатор вимагає безпеки транспорту або він є абсолютно незахищеним, так. Але основний аутентифікатор із захистом транспорту є набагато безпечнішим, ніж дайджест аутентифікації. А OAuth 1 - це зовсім інший звір із абсолютно ортогональними питаннями безпеки.
багатий ремер

@LesHazlewood Неправильно говорити, що компрометовані клієнти можуть виставляти паролі. Компрометований клієнт просто означає, що всі ставки зняті. Однак ваше попередження про депресію справедливе.
Нуреттін

10

для чого це варто, я використовую node.js 0.6.7 на OSX, і я не зміг отримати «Авторизацію»: auth для роботи з нашим проксі-сервером, його потрібно було встановити на «Проксі-авторизація»: 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). Якщо вам потрібно було пройти автентифікацію на сервері призначення, то заголовком авторизації буде те, що ви хочете використовувати.
Макс

Так, але часто потрібно робити і те, і інше, і це справжня відповідь
Монд Реймонд,

Буфер () застарів через проблеми безпеки та зручності використання. Будь ласка, використовуйте замість методу 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

Я натрапив на це нещодавно. Які з заголовків проксі-авторизації та авторизації потрібно встановити, залежить від того, на якому сервері спілкується клієнт. Якщо це веб-сервер, вам потрібно встановити Авторизацію, а якщо він є проксі, потрібно встановити заголовок проксі-авторизації.


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.alloc (), Buffer.allocUnsafe () або Buffer.from () методи замість
Sourabh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.