Cómo usar http.client en Node.js si hay una autorización básica

105

Según el título, ¿cómo lo hago?

Aquí está mi 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
fuente
12
http.createClient está en desuso. Utilice 'http.request' en su lugar.
thomas-peter

Respuestas:

271

Tienes que configurar el Authorizationcampo en el encabezado.

Contiene el tipo de autenticación Basicen este caso y la username:passwordcombinación que se codifica en 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
fuente
4
Así es como funciona todo. El servidor espera que los datos estén codificados en Base64.
Ivo Wetzel
3
¿Qué es 'cliente' en este ejemplo?
Steven Soroka
1
oh .. está en la pregunta. duh. Nuevo Méjico.
Steven Soroka
¡Qué bien, realmente me ayudó!
Chris Allinson
61

Desde Node.js http.request API Docs , podría usar algo similar 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
fuente
8
Esta es la respuesta actual.
David Jones
2
¿Necesita hacer "usuario: contraseña" o "Usuario básico: contraseña"?
Katie
2
@kayvar No, no es necesario que le anteponga Basic.
Sujay
@MarceloFilho Esto es lo que veo en los documentos todavía auth <string> Autenticación básica, es decir, 'usuario: contraseña' para calcular un encabezado de autorizació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);
  } );
Hamidreza Sadegh
fuente
1
Buffer () está en desuso debido a problemas de seguridad y usabilidad. Utilice los métodos Buffer.alloc (), Buffer.allocUnsafe () o Buffer.from () en su lugar
Sourabh
13

Una solución más sencilla es utilizar el formato user: pass @ host directamente en la URL.

Usando la biblioteca de solicitudes :

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

También escribí una pequeña entrada de blog sobre esto.

Fornido
fuente
18
Este no es un consejo ideal: cualquier registro de URL en el lado del cliente o del servidor podría exponer los valores de contraseña; este es un vector de ataque de seguridad ampliamente conocido. Recomiendo encarecidamente que nadie haga esto. Los valores de encabezado son mejores y no usar la autenticación básica, a favor de la autenticación implícita o OAuth 1.0a (por ejemplo) es incluso mejor. Esta forma de identificación también se ha desaprobado en los URI en RFC 3986.
Les Hazlewood
No utilizar la autenticación básica parece un mal consejo. La autenticación básica requiere seguridad en el transporte o es completamente insegura, sí. Pero la autenticación básica con seguridad de transporte es mucho más segura que la autenticación implícita. Y OAuth 1 es una bestia completamente diferente con problemas de seguridad completamente ortogonales.
rich remer
@LesHazlewood No es justo decir que los clientes comprometidos pueden exponer contraseñas. Cliente comprometido simplemente significa que todas las apuestas están canceladas. Sin embargo, su advertencia de desaprobación es justa.
nurettin
10

por lo que vale, estoy usando node.js 0.6.7 en OSX y no pude obtener 'Autorización': auth para trabajar con nuestro proxy, tenía que estar configurado en 'Proxy-Autorización': auth mi código de prueba es :

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
fuente
3
Para la edificación de futuros lectores: Eso es porque se está autenticando con su servidor proxy en lugar de autenticarse con el servidor web de destino (google). Si hubiera tenido que autenticarse con el servidor de destino, entonces el encabezado de Autorización sería lo que desea usar.
Hace
Sí, pero a menudo es necesario hacer ambas cosas, por lo que esta es una respuesta sólida
Mond Raymond
Buffer () está en desuso debido a problemas de seguridad y usabilidad. Utilice los métodos Buffer.alloc (), Buffer.allocUnsafe () o Buffer.from () en su lugar
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
fuente
2

Me encontré con esto recientemente. Cuál de los encabezados Proxy-Authorization y Authorization a configurar depende del servidor con el que está hablando el cliente. Si es un servidor web, debe configurar la autorización y si es un proxy, debe configurar el encabezado de autorización de proxy

sdqali
fuente
1

Este código funciona en mi caso, después de mucha investigación. Deberá instalar el paquete 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);      

    });    
}
Nimish goel
fuente
Buffer () está en desuso debido a problemas de seguridad y usabilidad. Utilice los métodos Buffer.alloc (), Buffer.allocUnsafe () o Buffer.from () en su lugar
Sourabh