यदि मूल प्राधिकरण है तो Node.js में http.client का उपयोग कैसे करें


105

शीर्षक के अनुसार, मैं ऐसा कैसे करूं?

यहाँ मेरा कोड है:

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 पदावनत है। इसके बजाय 'http.request' का उपयोग करें।
थोमस-पीटर

जवाबों:


271

आपको Authorizationहेडर में फ़ील्ड सेट करना होगा ।

Basicइस मामले में प्रमाणीकरण प्रकार शामिल है और username:passwordसंयोजन जो 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
बस इतना ही काम पूरा हुआ। सर्वर को बेस 64 में डेटा को इनकोड करने की उम्मीद है।
इवो ​​वेटजेल

3
इस उदाहरण में 'ग्राहक' क्या है?
स्टीवन सोरोका

1
ओह .. यह सवाल में है। ओह। एनएम।
स्टीवन सोरोका

वाह इतना बढ़िया, सच में मेरी मदद की!
क्रिस एलिन्सन

61

से Node.js http.request एपीआई डॉक्स आप के लिए कुछ इसी तरह इस्तेमाल कर सकते हैं

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
यह आधुनिक समय का उत्तर है।
डेविड जोन्स

2
क्या आपको "उपयोगकर्ता: पासवर्ड" या "मूल उपयोगकर्ता: पासवर्ड" करने की आवश्यकता है?
केटी

2
@kayvar नहीं, आपको इसे मूल के साथ उपसर्ग करने की आवश्यकता नहीं है।
सुजय

@MarceloFilho यह वही है जो मैं डॉक्स पर अभी भी देख रहा हूं <string> बेसिक ऑथेंटिकेशन यानी 'यूजर: पासवर्ड' एक ऑथराइजेशन हेडर की गणना करने के लिए।
सुजय

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
सुरक्षा और प्रयोज्य मुद्दों के कारण बफर () को हटा दिया गया है। कृपया बफ़र .alloc (), बफ़र .allocUnsafe (), या बफ़र .from () विधियों का उपयोग करें
Sourabh

13

उपयोगकर्ता का उपयोग करने के लिए एक आसान समाधान है: URL में सीधे @ होस्ट प्रारूप पास करें।

अनुरोध लाइब्रेरी का उपयोग करना :

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

मैंने इस बारे में थोड़ा ब्लॉगपोस्ट भी लिखा है ।


18
यह आदर्श सलाह नहीं है: किसी भी क्लाइंट या सर्वर साइड पर URL का लॉगिंग पासवर्ड मानों को उजागर कर सकता है - यह एक व्यापक रूप से ज्ञात कंप्यूटर रिपोर्ट वेक्टर है। मैं दृढ़ता से सलाह देता हूं कि कोई भी ऐसा न करे। हैडर मान बेहतर हैं, और बेसिक प्रमाणीकरण का उपयोग नहीं करना - डाइजेस्ट प्रमाणीकरण या OAuth 1.0a (उदाहरण के लिए) के पक्ष में और भी बेहतर है। RFC 3986 में URI में पहचान के इस रूप को भी चित्रित किया गया है।
लेस हेजलवुड

कुछ खराब सलाह की तरह बेसिक ऑथ ध्वनियों का उपयोग नहीं करना। बुनियादी स्थिति में परिवहन सुरक्षा की आवश्यकता होती है या यह पूरी तरह असुरक्षित है, हाँ। लेकिन ट्रांसपोर्ट सिक्योरिटी के साथ बेसिक ऑर्टिफिकेशन डाइजेस्ट ऑथेंटिकेशन की तरह सुरक्षित है। और OAuth 1 पूरी तरह से ऑर्थोगोनल सुरक्षा मुद्दों के साथ एक पूरी तरह से अलग जानवर है।
अमीर रेमर

@LesHazlewood यह कहना उचित नहीं है कि समझौता किए गए ग्राहक पासवर्ड का खुलासा कर सकते हैं। संकलित ग्राहक का मतलब है कि सभी दांव बंद हैं। हालाँकि, आपकी पदावनति चेतावनी उचित है।
nurettin

10

मैं OSX पर नोड.जेएस 0.6.7 का उपयोग कर रहा हूं, इसके लिए मैं 'प्राधिकरण' नहीं प्राप्त कर सका: हमारे प्रॉक्सी के साथ काम करने के लिए, इसे 'प्रॉक्सी-प्राधिकरण' पर सेट करने की आवश्यकता है: मेरा परीक्षण कोड :

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
भविष्य के पाठकों के संपादन के लिए: थॉट्स क्योंकि आप गंतव्य वेबसर्वर (Google) के साथ प्रमाणीकरण करने के बजाय अपने प्रॉक्सी सर्वर के साथ प्रमाणीकरण कर रहे हैं। यदि आपको गंतव्य सर्वर के साथ प्रमाणित करने की आवश्यकता थी, तो प्राधिकरण शीर्षलेख वह होगा जो आप उपयोग करना चाहते हैं।
मैक्स

हां, लेकिन अक्सर आपको दोनों करने की ज़रूरत होती है, तो यह एक ठोस जवाब है
मोंड रेमंड

सुरक्षा और प्रयोज्य मुद्दों के कारण बफर () को हटा दिया गया है। कृपया बफ़र .alloc (), बफ़र .allocUnsafe (), या बफ़र.फ्रॉम () के बजाय तरीकों का उपयोग करें
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

मुझे यह हाल ही में पता चला। प्रॉक्सी-प्राधिकरण और प्राधिकरण हेडर में से कौन सा सर्वर जिस क्लाइंट से बात कर रहा है, उस पर निर्भर करता है। यदि यह एक वेबसर्वर है, तो आपको प्राधिकरण सेट करने की आवश्यकता है और यदि यह प्रॉक्सी है, तो आपको प्रॉक्सी-प्राधिकरण शीर्षक सेट करना होगा


1

यह कोड मेरे मामले में बहुत शोध के बाद काम करता है। आपको अनुरोध एनपीएम पैकेज स्थापित करना होगा ।

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

    });    
}

सुरक्षा और प्रयोज्य मुद्दों के कारण बफर () को हटा दिया गया है। कृपया बफ़र .alloc (), बफ़र .allocUnsafe (), या बफ़र .from () विधियों का उपयोग करें
Sourabh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.