Как использовать 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);
  });
});
de_3
источник
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 http.request для Node.js вы можете использовать что-то похожее на

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
Вам нужно ввести «пользователь: пароль» или «Базовый пользователь: пароль»?
Кэти,
2
@kayvar Нет, вам не нужно ставить префикс Basic.
Суджай
@MarceloFilho Это то, что я вижу в документах, все еще auth <string> Обычная проверка подлинности, то есть «пользователь: пароль» для вычисления заголовка авторизации.
Суджай
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 ()
Сураб,
13

Более простое решение - использовать формат user: pass @ host непосредственно в 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-адресов на стороне клиента или сервера может раскрыть значения паролей - это широко известный вектор атаки на безопасность. Я настоятельно рекомендую никому этого не делать. Значения заголовков лучше, и без обычной проверки подлинности - в пользу дайджест-проверки подлинности или OAuth 1.0a (например) еще лучше. Эта форма идентификации также устарела в URI в RFC 3986.
Les Hazlewood,
Не использовать базовую аутентификацию - плохой совет. Базовая аутентификация требует транспортной безопасности или она полностью небезопасна, да. Но базовая аутентификация с транспортной безопасностью намного безопаснее, чем дайджест-аутентификация. А OAuth 1 - это совершенно другой зверь с полностью ортогональными проблемами безопасности.
Rich Remer
@LesHazlewood Несправедливо говорить, что взломанные клиенты могут раскрывать пароли. Скомпрометированный клиент просто означает, что все ставки отключены. Однако ваше предупреждение об устаревании справедливо.
nurettin
10

для чего я использую node.js 0.6.7 в OSX, и мне не удалось получить '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);
});
vrtis
источник
3
В назидание будущим читателям: это потому, что вы аутентифицируетесь на своем прокси-сервере, а не на целевом веб-сервере (Google). Если вам нужно было пройти аутентификацию на целевом сервере, то вы захотите использовать заголовок авторизации.
Макс
Да, но часто вам нужно делать и то, и другое, так что это твердый ответ
Монд Раймонд
Buffer () устарел из-за проблем с безопасностью и удобством использования. Пожалуйста, используйте вместо этого методы Buffer.alloc (), Buffer.allocUnsafe () или Buffer.from ()
Сураб,
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-Authorization и Authorization установить, зависит от сервера, с которым разговаривает клиент. Если это веб- сервер , вам необходимо установить авторизацию, а если это прокси, вы должны установить заголовок 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);      

    });    
}
Nimish Goel
источник
Buffer () устарел из-за проблем с безопасностью и удобством использования. Пожалуйста, используйте вместо этого методы Buffer.alloc (), Buffer.allocUnsafe () или Buffer.from ()
Сураб,