Come utilizzare http.client in Node.js se esiste un'autorizzazione di base


105

Come da titolo, come lo faccio?

Ecco il mio codice:

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 è deprecato. Utilizza invece "http.request".
thomas-peter

Risposte:


271

Devi impostare il Authorizationcampo nell'intestazione.

Contiene il tipo di autenticazione Basicin questo caso e la username:passwordcombinazione che viene codificata in 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);

4
È così che funziona l'intera cosa. Il server si aspetta che i dati siano codificati in Base64.
Ivo Wetzel

3
Che cos'è "client" in questo esempio?
Steven Soroka

1
oh .. è nella domanda. duh. nm.
Steven Soroka

Wow così grande, mi ha davvero aiutato!
Chris Allinson

61

Da Node.js http.request API Docs potresti usare qualcosa di simile 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();

8
Questa è la risposta moderna.
David Jones

2
Hai bisogno di "utente: password" o "utente di base: password"?
Katie

2
@kayvar No, non è necessario aggiungere il prefisso Basic.
Sujay

@MarceloFilho Questo è ciò che vedo sui documenti ancora auth <string> Autenticazione di base cioè "utente: password" per calcolare un'intestazione di autorizzazione.
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 () è deprecato a causa di problemi di sicurezza e usabilità. Utilizza invece i metodi Buffer.alloc (), Buffer.allocUnsafe () o Buffer.from ()
Sourabh

13

Una soluzione più semplice è utilizzare il formato user: pass @ host direttamente nell'URL.

Utilizzando la libreria delle richieste :

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

Ho anche scritto un post sul blog su questo argomento .


18
Questo non è un consiglio ideale: qualsiasi registrazione di URL sul lato client o lato server potrebbe esporre i valori delle password: questo è un vettore di attacco alla sicurezza ampiamente noto. Consiglio vivamente a nessuno di farlo. I valori di intestazione sono migliori e non si utilizza l'autenticazione di base: a favore dell'autenticazione del digest o OAuth 1.0a (ad esempio) è ancora migliore. Questa forma di identificazione è stata inoltre deprecata negli URI nella RFC 3986.
Les Hazlewood

Non usare l'autenticazione di base sembra un cattivo consiglio. L'autenticazione di base richiede la sicurezza del trasporto o è completamente insicura, sì. Ma l'autenticazione di base con la sicurezza del trasporto è molto più sicura dell'autenticazione Digest. E OAuth 1 è una bestia completamente diversa con problemi di sicurezza completamente ortogonali.
Rich Remer

@LesHazlewood Non è corretto affermare che i client compromessi possono esporre le password. Il cliente compromesso significa semplicemente che tutte le scommesse sono annullate. Tuttavia, il tuo avviso di deprecazione è corretto.
Nurettin

10

per quello che vale sto usando node.js 0.6.7 su OSX e non sono riuscito a ottenere 'Authorization': auth per funzionare con il nostro proxy, doveva essere impostato su 'Proxy-Authorization': auth il mio codice di test è :

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
Per l'edificazione dei futuri lettori: questo perché ti stai autenticando con il tuo server proxy invece di autenticarti con il server web di destinazione (google). Se avessi bisogno di autenticarti con il server di destinazione, l'intestazione di autorizzazione sarebbe ciò che desideri utilizzare.
Maks

Sì, ma spesso devi fare entrambe le cose, quindi questa è una risposta solida
Mond Raymond

Buffer () è deprecato a causa di problemi di sicurezza e usabilità. Utilizzare invece i metodi Buffer.alloc (), Buffer.allocUnsafe () o 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

Mi sono imbattuto in questo di recente. Quale tra le intestazioni Proxy-Authorization e Authorization da impostare dipende dal server con cui il client sta parlando. Se si tratta di un server Web, è necessario impostare l' autorizzazione e se è un proxy, è necessario impostare l' intestazione Proxy-Authorization


1

Questo codice funziona nel mio caso, dopo molte ricerche. Sarà necessario installare il pacchetto npm di richiesta .

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 () è deprecato a causa di problemi di sicurezza e usabilità. Utilizza invece i metodi Buffer.alloc (), Buffer.allocUnsafe () o Buffer.from ()
Sourabh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.