Temel yetkilendirme varsa, Node.js'de http.client nasıl kullanılır?


105

Başlığa göre, bunu nasıl yaparım?

İşte kodum:

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 kullanımdan kaldırıldı. Bunun yerine 'http.request' kullanın.
thomas-peter

Yanıtlar:


271

Başlıktaki Authorizationalanı ayarlamalısınız .

BasicBu durumda kimlik doğrulama türünü ve username:passwordBase64'te kodlanan kombinasyonu içerir:

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
Her şey böyle yürüyor. Sunucu, verilerin Base64'te kodlanmasını bekler.
Ivo Wetzel

3
Bu örnekte 'müşteri' nedir?
Steven Soroka

1
oh .. söz konusu. duh. nm.
Steven Soroka

Vay be harika, gerçekten bana yardımcı oldu!
Chris Allinson

61

Gönderen node.js http.request API Dokümanlar Eğer benzer bir şey kullanabilirsiniz

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
Bu, günümüzün modern cevabıdır.
David Jones

2
"Kullanıcı: şifre" veya "Temel kullanıcı: şifre" yapmanız gerekiyor mu?
Katie

2
@kayvar Hayır, Basic'in önüne koymanıza gerek yok.
Sujay

@MarceloFilho Dokümanlarda gördüğüm şey hala <string> Temel kimlik doğrulamasını yani bir Yetkilendirme başlığını hesaplamak için 'kullanıcı: parola'.
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 (), güvenlik ve kullanılabilirlik sorunları nedeniyle kullanımdan kaldırıldı. Yerine Buffer.alloc (), Buffer.allocUnsafe () veya Buffer.from () yöntemleri kullanın
Sourabh

13

Daha kolay bir çözüm, user: pass @ host formatını doğrudan URL'de kullanmaktır.

İstek kitaplığını kullanarak :

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

Bununla ilgili küçük bir blog yazısı da yazdım .


18
Bu ideal bir tavsiye değildir: İstemci veya sunucu tarafında herhangi bir URL kaydı şifre değerlerini açığa çıkarabilir - bu, yaygın olarak bilinen bir güvenlik saldırısı vektörüdür. Bunu kimsenin yapmamasını şiddetle tavsiye ederim. Üstbilgi değerleri daha iyidir ve Temel kimlik doğrulamasını kullanmamak - Özet kimlik doğrulaması veya OAuth 1.0a (örneğin) lehine daha da iyidir. Bu tanımlama biçimi, RFC 3986'daki URI'lerde de kullanımdan kaldırılmıştır.
Les Hazlewood

Temel Yetkilendirmeyi kullanmamak bazı kötü bir tavsiye gibi geliyor. Temel kimlik doğrulama, aktarım güvenliğini gerektirir veya tamamen güvensizdir, evet. Ancak aktarım güvenliği ile temel kimlik doğrulama, Özet kimlik doğrulamasından çok daha güvenlidir. Ve OAuth 1, tamamen ortogonal güvenlik sorunları olan tamamen farklı bir canavar.
zengin remer

@LesHazlewood Güvenliği ihlal edilen müşterilerin şifreleri ifşa edebileceğini söylemek doğru değil. Güvenliği ihlal edilmiş müşteri, tüm bahislerin kapalı olduğu anlamına gelir. Ancak, kullanımdan kaldırma uyarınız adil.
nurettin

10

ne olursa olsun OSX'te node.js 0.6.7 kullanıyorum ve 'Yetkilendirme' alamadım: proxy'mizle çalışmak için yetkilendirme, 'Proxy-Yetkilendirme' olarak ayarlanması gerekiyor: yetkilendirme test kodum :

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
Gelecekteki okuyucuların düzenlenmesi için: Bunun nedeni, hedef web sunucusuyla (google) kimlik doğrulaması yapmak yerine proxy sunucunuzla kimlik doğrulaması yapmanızdır. Hedef sunucuyla kimlik doğrulaması yapmanız gerekiyorsa, kullanmak istediğiniz Yetkilendirme başlığı olacaktır.
Maks

Evet, ancak çoğu zaman ikisini de yapmanız gerekir, bu yüzden bu sağlam bir cevap
Mond Raymond

Buffer (), güvenlik ve kullanılabilirlik sorunları nedeniyle kullanımdan kaldırıldı. Yerine Buffer.alloc (), Buffer.allocUnsafe () veya Buffer.from () yöntemleri kullanın
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

Buna yakın zamanda rastladım. Arasında hangi Vekil-Yetki ve Yetki kümesine başlıklarına istemci konuşuyor sunucusuna bağlıdır. Bu bir Web sunucusuysa, Yetkilendirmeyi ayarlamanız ve bir proxy ise Proxy-Yetkilendirme başlığını ayarlamanız gerekir.


1

Bu kod, birçok araştırmadan sonra benim durumumda çalışıyor. İstek npm paketini kurmanız gerekecektir .

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 (), güvenlik ve kullanılabilirlik sorunları nedeniyle kullanımdan kaldırıldı. Yerine Buffer.alloc (), Buffer.allocUnsafe () veya Buffer.from () yöntemleri kullanın
Sourabh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.