วิธีใช้ http.client ใน Node.js หากมีการอนุญาตพื้นฐาน


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" แทน
thomas-peter

คำตอบ:


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
นั่นเป็นเพียงวิธีการทำงานทั้งหมด เซิร์ฟเวอร์คาดว่าข้อมูลจะถูกเข้ารหัสใน Base64
Ivo Wetzel

3
"ลูกค้า" ในตัวอย่างนี้คืออะไร
Steven Soroka

1
โอ้ .. มันอยู่ในคำถาม duh. นาโนเมตร
Steven Soroka

ว้าวเยี่ยมมากช่วยฉันด้วย!
Chris Allinson

61

จากNode.js http.request API Docs คุณสามารถใช้สิ่งที่คล้ายกับ

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
นี่คือคำตอบในยุคปัจจุบัน
David Jones

2
คุณต้องทำ "user: password" หรือ "Basic user: password" หรือไม่?
Katie

2
@kayvar ไม่คุณไม่จำเป็นต้องนำหน้าด้วย Basic
Sujay

@MarceloFilho นี่คือสิ่งที่ฉันเห็นในเอกสารที่ยังคง auth <string> การรับรองความถูกต้องขั้นพื้นฐานเช่น 'ผู้ใช้: รหัสผ่าน' เพื่อคำนวณส่วนหัวการอนุญาต
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 () เลิกใช้งานเนื่องจากปัญหาด้านความปลอดภัยและการใช้งาน โปรดใช้วิธี Buffer.alloc (), Buffer.allocUnsafe () หรือ Buffer.from () แทน
Sourabh

13

วิธีแก้ปัญหาที่ง่ายกว่าคือการใช้ user: pass @ host format โดยตรงใน 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 (เป็นต้น) จะดีกว่า รูปแบบการระบุตัวตนนี้ได้เลิกใช้แล้วใน URI ใน RFC 3986
Les Hazlewood

การไม่ใช้ Basic Auth ดูเหมือนคำแนะนำที่ไม่ดี การรับรองความถูกต้องขั้นพื้นฐานต้องการความปลอดภัยในการขนส่งหรือไม่ปลอดภัยอย่างสมบูรณ์ใช่ แต่การรับรองความถูกต้องขั้นพื้นฐานด้วยการรักษาความปลอดภัยการขนส่งเป็นวิธีที่ปลอดภัยกว่าการตรวจสอบความถูกต้องของ Digest และ OAuth 1 เป็นสัตว์ร้ายที่แตกต่างกันโดยสิ้นเชิงกับปัญหาด้านความปลอดภัยที่ตั้งฉากกันโดยสิ้นเชิง
rich remer

@LesHazlewood ไม่ยุติธรรมที่จะบอกว่าลูกค้าที่ถูกบุกรุกสามารถเปิดเผยรหัสผ่านได้ ลูกค้าที่ถูกบุกรุกหมายความว่าการเดิมพันทั้งหมดถูกปิด อย่างไรก็ตามคำเตือนการเลิกใช้งานของคุณมีความยุติธรรม
nurettin

10

สำหรับสิ่งที่คุ้มค่าฉันใช้ node.js 0.6.7 บน OSX และฉันไม่ได้รับ 'Authorization': auth เพื่อทำงานกับพร็อกซีของเราจำเป็นต้องตั้งค่าเป็น 'Proxy-Authorization': รับรองรหัสทดสอบของฉันคือ :

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) หากคุณจำเป็นต้องตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ปลายทางส่วนหัวการอนุญาตจะเป็นสิ่งที่คุณต้องการใช้
Maks

ใช่ แต่บ่อยครั้งที่คุณต้องทำทั้งสองอย่างนี้จึงเป็นคำตอบที่มั่นคง
Mond Raymond

Buffer () เลิกใช้งานเนื่องจากปัญหาด้านความปลอดภัยและการใช้งาน โปรดใช้วิธี Buffer.alloc (), Buffer.allocUnsafe () หรือ 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

ฉันเจอเมื่อไม่นานมานี้ ซึ่งระหว่างส่วนหัวProxy-AuthorizationและAuthorization ที่จะตั้งขึ้นอยู่กับเซิร์ฟเวอร์ที่ไคลเอ็นต์กำลังคุยด้วย หากเป็นเว็บเซิร์ฟเวอร์คุณต้องตั้งค่าการอนุญาตและหากเป็นพร็อกซีคุณต้องตั้งค่าส่วนหัวProxy-Authorization


1

รหัสนี้ใช้ได้ในกรณีของฉันหลังจากการวิจัยจำนวนมาก คุณจะต้องมีการติดตั้งแพคเกจ 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 () เลิกใช้งานเนื่องจากปัญหาด้านความปลอดภัยและการใช้งาน โปรดใช้วิธี Buffer.alloc (), Buffer.allocUnsafe () หรือ Buffer.from () แทน
Sourabh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.