2010-10-11 9 views
73

Como por título, ¿cómo puedo hacer eso? Aquí está mi código:Cómo utilizar http.client en Node.js si hay autorización básica

var http = require('http'); 
var client = http.createClient(80, 'www.example.com'); // to access this url i need to put basic auth. 

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

http.createClient está en desuso. Use 'http.request' en su lugar. –

Respuesta

202

Debe establecer el campo Authorization en el encabezado.

Contiene el tipo de autenticación Basic en este caso y la combinación username:password que consigue codificado en base 64:

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); 
+1

gracias ... pero no sé por qué la cadena necesita para codificar a base 64 ... –

+2

Eso es sólo cómo funciona todo el asunto. El servidor espera que los datos se codifiquen en Base64. –

+40

Esto debe ser aceptado. – Till

11

Una solución más fácil es utilizar el usuario: Formato @ host pase directamente en la URL.

Uso de la biblioteca 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 
    } 
); 

He escrito un poco blogpost sobre esto así.

+13

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 utilizan 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 ha quedado obsoleta en los URI en RFC 3986. –

+0

No usar Basic Auth suena como un mal consejo. La autenticación básica requiere seguridad de 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. –

7

por lo que vale Estoy usando node.js 0.6.7 en OSX y no pude obtener 'Authorization': auth para trabajar con nuestro proxy, tenía que estar configurado en 'Proxy-Authorization': 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); 
}); 
+1

para la edificación de los futuros lectores: Eso es porque se autentifica con su servidor proxy en lugar de la autenticación con el servidor web de destino (Google).Si hubiera necesitado autenticarse con el servidor de destino, el encabezado de Autorización sería lo que desea usar. – Maks

+0

Sí, pero a menudo necesita hacer ambas cosas, por lo que esta es una respuesta sólida –

2

me encontré con este recientemente. ¿Cuál de entre Proxy-Authorization y Autorización encabezados para establecer depende del servidor con el que el cliente está hablando. Si se trata de un servidor web, es necesario establecer Autorización y si un proxy, hay que establecer el Autorización proxy cabecera

48

De Node.js http.request API Docs usted podría utilizar 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(); 
+7

Esta es la respuesta de hoy en día. –

+2

¿Necesita hacer "usuario: contraseña" o "Usuario básico: contraseña"? – Kayvar

+2

@kayvar No, no es necesario que lo prefijas con Basic. – Sujay

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

Este código funciona en mi caso, después de mucha investigación. Deberá instalar el request npm package.

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

    });  
} 
Cuestiones relacionadas