2010-10-11 3 views
73

Wie laute ich, wie mache ich das? Hier ist mein Code:Wie man http.client in Node.js benutzt, wenn es eine grundlegende Autorisierung gibt

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 ist veraltet. Verwenden Sie stattdessen "http.request". –

Antwort

202

Sie müssen das Feld Authorization in der Kopfzeile festlegen.

Es enthält den Authentifizierungstyp Basic in diesem Fall, und die Kombination, die in username:password Base64 codiert wird:

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

danke ... aber ich weiß nicht, warum die Zeichenfolge zu base64 codieren muss ... –

+2

Das ist nur, wie die ganze Sache funktioniert. Der Server erwartet, dass die Daten in Base64 codiert werden. –

+40

Dies sollte akzeptiert werden. – Till

11

Eine einfachere Lösung ist es, den Benutzer zu verwenden: pass @ host-Format direkt in der URL.

Mit der request Bibliothek:

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

ich auch ein wenig blogpost darüber geschrieben habe.

+13

Dies ist kein idealer Hinweis: Jede Protokollierung von URLs auf der Client- oder Serverseite könnte Kennwortwerte offenlegen - dies ist ein weithin bekannter Sicherheitsangriffsvektor. Ich empfehle dringend, dass niemand dies tut. Header-Werte sind besser, und keine Basic-Authentifizierung - zugunsten der Digest-Authentifizierung oder OAuth 1.0a (zum Beispiel) ist noch besser. Diese Form der Identifizierung ist auch in URIs in RFC 3986 veraltet. –

+0

Nicht mit Basic Auth klingt wie einige schlechte Ratschläge. Basic Auth erfordert Transportsicherheit oder ist völlig unsicher, ja. Die Basisauthentifizierung mit Transportsicherheit ist jedoch weitaus sicherer als die Digestauthentifizierung. Und OAuth 1 ist ein völlig anderes Biest mit völlig orthogonalen Sicherheitsproblemen. –

7

für was es wert ist Ich benutze node.js 0.6.7 auf OSX und ich konnte nicht bekommen "Authorization": auth mit unserem Proxy zu arbeiten, musste es auf "Proxy-Authorization": auth mein Testcode ist:

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

Für die Erschaffung zukünftiger Leser: Das liegt daran, dass Sie sich mit Ihrem Proxy-Server authentifizieren, anstatt sich mit dem Ziel-Webserver (google) zu authentifizieren.Wenn Sie sich mit dem Zielserver authentifizieren müssen, ist der Berechtigungsheader das, was Sie verwenden möchten. – Maks

+0

Ja, aber oft müssen Sie beides tun, also ist dies eine solide Antwort –

2

ich über dieses vor kurzem kam. Welche unter Proxy-Authorization und Authorization Header, die festgelegt werden, hängt von dem Server ab, mit dem der Client kommuniziert. Wenn es ein Webserver ist, müssen Sie Authorization setzen und wenn es ein Proxy, haben Sie die Proxy-Authorization Header setzen

48

Von Node.js http.request API Docs Sie etwas Ähnliches wie

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

Dies ist die heutige Antwort. –

+2

Müssen Sie "user: password" oder "Basic user: password" eingeben? – Kayvar

+2

@kayvar Nein, Sie müssen es nicht mit Basic voranstellen. – Sujay

6
verwenden könnte
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

Dieser Code funktioniert in meinem Fall, nach einer Menge Forschung. Sie müssen die request npm package installieren.

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

    });  
}