Como usar http.client em Node.js se houver autorização básica

105

De acordo com o título, como faço isso?

Aqui está o meu código:

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
fonte
12
http.createClient está obsoleto. Use 'http.request'.
thomas-peter

Respostas:

271

Você deve definir o Authorizationcampo no cabeçalho.

Ele contém o tipo de autenticação Basicneste caso e a username:passwordcombinação que é codificada em 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);
Ivo Wetzel
fonte
4
É assim que tudo funciona. O servidor espera que os dados sejam codificados em Base64.
Ivo Wetzel
3
O que é 'cliente' neste exemplo?
Steven Soroka
1
oh .. está na questão. duh. nm.
Steven Soroka
Uau que ótimo, realmente me ajudou!
Chris Allinson,
61

Em Node.js http.request API Docs, você poderia usar algo semelhante a

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();
Sujay
fonte
8
Esta é a resposta moderna.
David Jones de
2
Você precisa fazer "usuário: senha" ou "Usuário básico: senha"?
Katie
2
@kayvar Não, você não precisa prefixá-lo com Basic.
Sujay
@MarceloFilho Isso é o que vejo na documentação ainda auth <string> Autenticação básica, ou seja, 'usuário: senha' para calcular um cabeçalho de autorização.
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);
  } );
Hamidreza Sadegh
fonte
1
Buffer () está obsoleto devido a problemas de segurança e usabilidade. Use os métodos Buffer.alloc (), Buffer.allocUnsafe () ou Buffer.from () no lugar
Sourabh
13

Uma solução mais fácil é usar o formato user: pass @ host diretamente na URL.

Usando a biblioteca de solicitações :

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

Eu escrevi uma pequena postagem no blog sobre isso também.

Husky
fonte
18
Este não é o conselho ideal: qualquer registro de URLs no lado do cliente ou do servidor pode expor os valores da senha - este é um vetor de ataque de segurança amplamente conhecido. Eu recomendo fortemente que ninguém faça isso. Os valores de cabeçalho são melhores e não usam autenticação básica - em favor da autenticação Digest ou OAuth 1.0a (por exemplo) é ainda melhor. Esta forma de identificação também foi descontinuada em URIs no RFC 3986.
Les Hazlewood
Não usar o Basic Auth soa como um conselho ruim. A autenticação básica requer segurança de transporte ou é completamente insegura, sim. Mas a autenticação básica com segurança de transporte é muito mais segura que a autenticação Digest. E o OAuth 1 é uma besta completamente diferente, com problemas de segurança totalmente ortogonais.
rico lembrete de
@LesHazlewood Não é justo dizer que clientes comprometidos podem expor senhas. Cliente comprometido significa simplesmente que todas as apostas estão canceladas. No entanto, seu aviso de suspensão de uso é justo.
nurettin
10

pelo que vale a pena, estou usando node.js 0.6.7 no OSX e não consegui 'Authorization': auth para funcionar com nosso proxy, ele precisava ser definido como 'Proxy-Authorization': auth meu código de teste é :

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
fonte
3
Para a edificação de futuros leitores: Isso porque você está autenticando com seu servidor proxy em vez de autenticar com o servidor web de destino (google). Se você tivesse que se autenticar no servidor de destino, o cabeçalho de autorização seria o que você deseja usar.
Maks
Sim, mas frequentemente você precisa fazer os dois, então esta é uma resposta sólida
Mond Raymond
Buffer () está obsoleto devido a problemas de segurança e usabilidade. Em vez disso, use os métodos Buffer.alloc (), Buffer.allocUnsafe () ou 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);
    });
});
Manish Kumar
fonte
2

Eu me deparei com isso recentemente. Qual entre os cabeçalhos Proxy-Authorization e Authorization definir depende do servidor com o qual o cliente está se comunicando. Se for um servidor da Web, você precisa definir a autorização e se for um proxy, você deve definir o cabeçalho Proxy-Authorization

sdqali
fonte
1

Esse código funciona no meu caso, depois de muita pesquisa. Você precisará instalar o pacote npm de solicitação .

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
fonte
Buffer () está obsoleto devido a problemas de segurança e usabilidade. Use os métodos Buffer.alloc (), Buffer.allocUnsafe () ou Buffer.from () no lugar
Sourabh