Как использовать http.client в Node.js, если есть базовая авторизация

Согласно названию, как мне это сделать?

Вот мой код:

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

person de_3    schedule 11.10.2010    source источник
comment
http.createClient устарел. Вместо этого используйте «http.request».   -  person thomas-peter    schedule 07.09.2012


Ответы (8)


Вы должны установить поле 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);
person Ivo Wetzel    schedule 11.10.2010
comment
Вот как все это работает. Сервер ожидает, что данные будут закодированы в Base64. - person Ivo Wetzel; 12.10.2010
comment
Что такое «клиент» в этом примере? - person Steven Soroka; 19.07.2012
comment
о.. это в вопросе. дух. нм. - person Steven Soroka; 19.07.2012
comment
Вау, как здорово, мне очень помогло! - person Chris Allinson; 09.04.2018

Из http://nodejs.org/api/http.html#http_http_request_options_callback вы можете использовать что-то похожее на

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();
person Sujay    schedule 07.08.2012
comment
Это современный ответ. - person David Jones; 15.08.2013
comment
Вам нужно сделать user:password или Basic user:password? - person Katie; 27.03.2015
comment
@kayvar Нет, вам не нужно ставить префикс Basic. - person Sujay; 27.03.2015
comment
@MarceloFilho Это то, что я вижу в документах все еще auth ‹string› Базовая аутентификация, т. Е. «Пользователь: пароль» для вычисления заголовка авторизации. - person Sujay; 09.02.2018

Более простое решение — использовать формат user:pass@host непосредственно в URL-адресе.

Используя библиотеку request:

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

Я написал небольшой пост в блоге об этом.

person Husky    schedule 22.06.2011
comment
Это не идеальный совет: любая регистрация URL-адресов как на стороне клиента, так и на стороне сервера может привести к раскрытию значений паролей — это широко известный вектор атаки на систему безопасности. Я настоятельно рекомендую никому не делать этого. Значения заголовков лучше, а не использование обычной аутентификации — в пользу дайджест-аутентификации или OAuth 1.0a (например) — еще лучше. Эта форма идентификации также устарела в URI в RFC 3986. - person Les Hazlewood; 14.01.2014
comment
Не использовать Basic Auth звучит как плохой совет. Базовая аутентификация требует безопасности транспорта или полностью небезопасна, да. Но базовая аутентификация с безопасностью транспорта намного безопаснее, чем дайджест-аутентификация. А OAuth 1 — совершенно другой зверь с полностью ортогональными проблемами безопасности. - person rich remer; 17.01.2017
comment
@LesHazlewood Несправедливо говорить, что скомпрометированные клиенты могут раскрывать пароли. Скомпрометированный клиент просто означает, что все ставки сняты. Однако ваше предупреждение об устаревании справедливо. - person nurettin; 14.09.2018

для чего это стоит, я использую node.js 0.6.7 на OSX, и я не мог заставить «Авторизацию»: 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);
});
person vrtis    schedule 19.01.2012
comment
В назидание будущим читателям: это потому, что вы аутентифицируетесь на своем прокси-сервере, а не на целевом веб-сервере (google). Если бы вам нужно было пройти аутентификацию на целевом сервере, вы бы хотели использовать заголовок авторизации. - person Maks; 02.07.2013
comment
Да, но часто вам нужно сделать и то, и другое, так что это надежный ответ. - person Mond Raymond; 24.02.2014
comment
Buffer() устарел из-за проблем с безопасностью и удобством использования. Вместо этого используйте методы Buffer.alloc(), Buffer.allocUnsafe() или Buffer.from(). - person Sourabh; 22.03.2019

Я столкнулся с этим недавно. Какой из заголовков Proxy-Authorization и Authorization установить, зависит от сервера, с которым взаимодействует клиент. Если это веб-сервер, вам нужно установить авторизацию, а если это прокси, вы должны установить заголовок Proxy-Authorization

person sdqali    schedule 22.02.2012

Этот код работает в моем случае после долгих исследований. Вам потребуется установить пакет request 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);      

    });    
}
person Nimish goel    schedule 18.07.2017
comment
Buffer() устарел из-за проблем с безопасностью и удобством использования. Вместо этого используйте методы Buffer.alloc(), Buffer.allocUnsafe() или Buffer.from(). - person Sourabh; 22.03.2019

Для тех, кто не использует DNS и нуждается в большей глубине (вы также можете использовать request вместо get, просто заменив get на request вот так: http.request({ ... })):

http.get({ 
    host: '127.0.0.1',
    port: 443,
    path: '/books?author=spongebob',
    auth: 'user:p@ssword#'
 }, resp => {
    let data;

    resp.on('data', chunk => {
        data += chunk;
    });

    resp.on('end', () => console.log(data));
}).on('error', err => console.log(err));
person Miko Chu    schedule 29.03.2021

person    schedule
comment
Buffer() устарел из-за проблем с безопасностью и удобством использования. Вместо этого используйте методы Buffer.alloc(), Buffer.allocUnsafe() или Buffer.from(). - person Sourabh; 22.03.2019