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

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

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

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

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 .


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

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

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


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

    });    
}

Buffer () ist aufgrund von Sicherheits- und Usability-Problemen veraltet. Bitte verwenden Sie stattdessen die Methoden Buffer.alloc (), Buffer.allocUnsafe () oder Buffer.from ()
Sourabh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.