Comment utiliser http.client dans Node.js s'il existe une autorisation de base


105

Selon le titre, comment puis-je faire cela?

Voici mon 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 est obsolète. Utilisez plutôt 'http.request'.
thomas-peter

Réponses:


271

Vous devez définir le Authorizationchamp dans l'en-tête.

Il contient le type d'authentification Basicdans ce cas et la username:passwordcombinaison qui est encodée en 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
C'est comme ça que tout fonctionne. Le serveur s'attend à ce que les données soient encodées en Base64.
Ivo Wetzel

3
Qu'est-ce que «client» dans cet exemple?
Steven Soroka

1
oh .. c'est dans la question. duh. nm.
Steven Soroka

Wow tellement génial, m'a vraiment aidé!
Chris Allinson

61

À partir de la documentation de l'API Node.js http.request, vous pouvez utiliser quelque chose de similaire à

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
Telle est la réponse moderne.
David Jones

2
Avez-vous besoin de faire "utilisateur: mot de passe" ou "Utilisateur de base: mot de passe"?
Katie

2
@kayvar Non, vous n'avez pas besoin de le préfixer avec Basic.
Sujay

@MarceloFilho C'est ce que je vois sur la documentation auth encore <chaîne> Authentification de base c'est-à-dire «utilisateur: mot de passe» pour calculer un en-tête d'autorisation.
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 () est obsolète en raison de problèmes de sécurité et d'utilisabilité. Veuillez utiliser les méthodes Buffer.alloc (), Buffer.allocUnsafe () ou Buffer.from () à la place
Sourabh

13

Une solution plus simple consiste à utiliser le format user: pass @ host directement dans l'URL.

Utilisation de la bibliothèque de requêtes :

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

J'ai également écrit un petit article de blog à ce sujet.


18
Ce n'est pas un conseil idéal: toute journalisation des URL du côté client ou du côté serveur peut exposer les valeurs de mot de passe - il s'agit d'un vecteur d'attaque de sécurité largement connu. Je recommande fortement que personne ne fasse cela. Les valeurs d'en-tête sont meilleures, et ne pas utiliser l'authentification de base - en faveur de l'authentification Digest ou OAuth 1.0a (par exemple) est encore mieux. Cette forme d'identification a également été déconseillée dans les URI de la RFC 3986.
Les Hazlewood

Ne pas utiliser Basic Auth semble être un mauvais conseil. L'authentification de base nécessite une sécurité de transport ou elle est complètement non sécurisée, oui. Mais l'authentification de base avec sécurité de transport est bien plus sûre que l'authentification Digest. Et OAuth 1 est une bête complètement différente avec des problèmes de sécurité complètement orthogonaux.
riche remer

@LesHazlewood Il n'est pas juste de dire que les clients compromis peuvent exposer les mots de passe. Un client compromis signifie simplement que tous les paris sont ouverts. Cependant, votre avertissement de désapprobation est juste.
nurettin le

10

pour ce que ça vaut, j'utilise node.js 0.6.7 sur OSX et je n'ai pas pu obtenir 'Authorization': auth pour fonctionner avec notre proxy, il devait être réglé sur 'Proxy-Authorization': auth mon code de test est :

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
Pour l'édification des futurs lecteurs: c'est parce que vous vous authentifiez avec votre serveur proxy au lieu de vous authentifier avec le serveur Web de destination (google). Si vous aviez besoin de vous authentifier auprès du serveur de destination, l'en-tête Authorization serait celui que vous souhaitez utiliser.
Maks

Oui, mais souvent vous devez faire les deux, c'est donc une réponse solide
Mond Raymond

Buffer () est obsolète en raison de problèmes de sécurité et d'utilisabilité. Veuillez utiliser plutôt les méthodes Buffer.alloc (), Buffer.allocUnsafe () ou 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

Je suis tombé sur ça récemment. Lequel parmi les en - têtes Proxy-Authorization et Authorization à définir dépend du serveur avec lequel le client parle. S'il s'agit d'un serveur Web, vous devez définir l' autorisation et s'il s'agit d'un proxy, vous devez définir l'en - tête Proxy-Authorization


1

Ce code fonctionne dans mon cas, après de nombreuses recherches. Vous devrez installer le package request npm .

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 () est obsolète en raison de problèmes de sécurité et d'utilisabilité. Veuillez utiliser les méthodes Buffer.alloc (), Buffer.allocUnsafe () ou Buffer.from () à la place
Sourabh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.