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);
  });
});
de_3
la source
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);
Ivo Wetzel
la source
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();
Sujay
la source
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);
  } );
Hamidreza Sadegh
la source
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.

Rauque
la source
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);
});
vrtis
la source
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);
    });
});
Manish Kumar
la source
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

sdqali
la source
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);      

    });    
}
Goel Nimish
la source
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