Verwendung von http.client in Node.js bei grundlegender Berechtigung

105

Wie mache ich das laut Titel?

Hier ist mein Code:

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
quelle
12
http.createClient ist veraltet. Verwenden Sie stattdessen 'http.request'.
Thomas-Peter

Antworten:

271

Sie müssen das AuthorizationFeld in der Kopfzeile setzen.

Es enthält Basicin diesem Fall den Authentifizierungstyp und die username:passwordKombination, die in 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);
Ivo Wetzel
quelle
4
So funktioniert das Ganze. Der Server erwartet, dass die Daten in Base64 codiert werden.
Ivo Wetzel
3
Was ist "Client" in diesem Beispiel?
Steven Soroka
1
oh .. es ist in der Frage. duh. nm.
Steven Soroka
Wow so toll, hat mir wirklich geholfen!
Chris Allinson
61

In den http.request-API-Dokumenten von Node.js können Sie etwas Ähnliches verwenden

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
quelle
8
Dies ist die heutige Antwort.
David Jones
2
Müssen Sie "Benutzer: Passwort" oder "Basisbenutzer: Passwort" ausführen?
Katie
2
@kayvar Nein, Sie müssen Basic nicht voranstellen.
Sujay
@MarceloFilho Dies ist, was ich in den Dokumenten sehe, immer noch auth <string> Grundlegende Authentifizierung, dh 'Benutzer: Passwort', um einen Autorisierungsheader zu berechnen.
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
quelle
1
Buffer () ist aufgrund von Sicherheits- und Usability-Problemen veraltet. Bitte verwenden Sie stattdessen die Methoden Buffer.alloc (), Buffer.allocUnsafe () oder Buffer.from ()
Sourabh
13

Eine einfachere Lösung besteht darin, das Format user: pass @ host direkt in der URL zu verwenden.

Verwenden der Anforderungsbibliothek :

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 habe auch einen kleinen Blogpost darüber geschrieben .

Heiser
quelle
18
Dies ist kein idealer Rat: Jede Protokollierung von URLs auf Client- oder Serverseite kann Kennwortwerte offenlegen - dies ist ein weithin bekannter Sicherheitsangriffsvektor. Ich empfehle niemandem, dies zu tun. Header-Werte sind besser und verwenden keine Standardauthentifizierung - zugunsten der Digest-Authentifizierung oder OAuth 1.0a (zum Beispiel) ist dies sogar noch besser. Diese Form der Identifizierung wurde auch in URIs in RFC 3986 veraltet.
Les Hazlewood
Die Nichtverwendung von Basic Auth klingt nach einem schlechten Rat. Die Basisauthentifizierung erfordert Transportsicherheit oder ist völlig unsicher, ja. Die grundlegende Authentifizierung mit Transportsicherheit ist jedoch weitaus sicherer als die Digest-Authentifizierung. Und OAuth 1 ist ein völlig anderes Tier mit völlig orthogonalen Sicherheitsproblemen.
Rich Remer
@LesHazlewood Es ist nicht fair zu sagen, dass kompromittierte Clients Passwörter offenlegen können. Kompromittierter Kunde bedeutet einfach, dass alle Wetten geschlossen sind. Ihre Abwertungswarnung ist jedoch fair.
Nurettin
10

Für das, was es wert ist, verwende ich node.js 0.6.7 unter OSX und konnte 'Authorization': auth nicht für die Arbeit mit unserem Proxy erhalten. Es musste auf 'Proxy-Authorization' gesetzt werden: 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);
});
vrtis
quelle
3
Zur Erbauung zukünftiger Leser: Das liegt daran, dass Sie sich bei Ihrem Proxyserver authentifizieren, anstatt sich beim Zielwebserver (Google) zu authentifizieren. Wenn Sie sich beim Zielserver authentifizieren müssten, wäre der Autorisierungsheader genau das, was Sie verwenden möchten.
Macht
Ja, aber oft müssen Sie beides tun, damit dies eine solide Antwort ist
Mond Raymond
Buffer () ist aufgrund von Sicherheits- und Usability-Problemen veraltet. Bitte verwenden Sie stattdessen die Methoden Buffer.alloc (), Buffer.allocUnsafe () oder 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
quelle
2

Ich bin kürzlich darauf gestoßen. Welcher der Proxy-Authorization- und Authorization- Header festgelegt werden soll, hängt vom Server ab, mit dem der Client spricht. Wenn es ein Webserver ist, müssen Sie festlegen , Authorization und wenn es ein Proxy, haben Sie die festlegen Proxy-Authorization - Header

sdqali
quelle
1

Dieser Code funktioniert in meinem Fall nach viel Recherche. Sie müssen das Anforderungspaket npm 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);      

    });    
}
Nimish Goel
quelle
Buffer () ist aufgrund von Sicherheits- und Usability-Problemen veraltet. Bitte verwenden Sie stattdessen die Methoden Buffer.alloc (), Buffer.allocUnsafe () oder Buffer.from ()
Sourabh