Cara menggunakan http.client di Node.js jika ada otorisasi dasar


105

Sesuai judul, bagaimana cara melakukannya?

Ini kode saya:

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 tidak digunakan lagi. Gunakan 'http.request' sebagai gantinya.
thomas-peter

Jawaban:


271

Anda harus mengatur Authorizationbidang di header.

Ini berisi jenis otentikasi Basicdalam kasus ini dan username:passwordkombinasi yang akan dikodekan di 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
Begitulah cara semuanya bekerja. Server mengharapkan data dikodekan di Base64.
Ivo Wetzel

3
Apa 'klien' dalam contoh ini?
Steven Soroka

1
oh .. itu yang dimaksud. duh. nm.
Steven Soroka

Wow luar biasa, sangat membantu saya!
Chris Allinson

61

Dari Node.js http.request API Docs, Anda dapat menggunakan sesuatu yang mirip dengan

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
Ini adalah jawaban zaman modern.
David Jones

2
Apakah Anda perlu melakukan "user: password" atau "Basic user: password"?
Katie

2
@kayvar Tidak, Anda tidak perlu mengawali dengan Basic.
Sujay

@MarceloFilho Inilah yang saya lihat di dokumen masih auth <string> Otentikasi dasar yaitu 'user: password' untuk menghitung header Otorisasi.
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 () tidak digunakan lagi karena masalah keamanan dan kegunaan. Silakan gunakan metode Buffer.alloc (), Buffer.allocUnsafe (), atau Buffer.from () sebagai gantinya
Sourabh

13

Solusi yang lebih mudah adalah dengan menggunakan format user: pass @ host langsung di URL.

Menggunakan pustaka permintaan :

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

Saya telah menulis sedikit posting blog tentang ini juga.


18
Ini bukan saran yang ideal: pencatatan URL apa pun di sisi klien atau server dapat mengungkap nilai kata sandi - ini adalah vektor serangan keamanan yang dikenal luas. Saya sangat menyarankan agar tidak ada yang melakukan ini. Nilai header lebih baik, dan tidak menggunakan otentikasi Dasar - mendukung otentikasi Digest atau OAuth 1.0a (misalnya) bahkan lebih baik. Bentuk identifikasi ini juga tidak digunakan lagi dalam URI di RFC 3986.
Les Hazlewood

Tidak menggunakan Basic Auth terdengar seperti saran yang buruk. Autentikasi dasar memerlukan keamanan pengangkutan atau sama sekali tidak aman, ya. Tetapi autentikasi dasar dengan keamanan transport jauh lebih aman daripada autentikasi Digest. Dan OAuth 1 adalah binatang yang sama sekali berbeda dengan masalah keamanan ortogonal sepenuhnya.
rich remer

@LesHazlewood Tidaklah adil untuk mengatakan klien yang disusupi dapat mengekspos kata sandi. Klien yang disusupi berarti semua taruhan dibatalkan. Namun, peringatan penghentian Anda adil.
nurettin

10

untuk apa nilainya saya menggunakan node.js 0.6.7 di OSX dan saya tidak bisa mendapatkan 'Otorisasi': auth untuk bekerja dengan proxy kami, itu perlu disetel ke 'Proxy-Authorization': auth kode uji saya adalah :

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
Untuk membangun pembaca di masa mendatang: Itu karena Anda mengautentikasi dengan server proxy Anda alih-alih mengautentikasi dengan server web tujuan (google). Jika Anda perlu mengautentikasi dengan server tujuan, maka header Otorisasi adalah yang ingin Anda gunakan.
Maks

Ya, tetapi sering kali Anda perlu melakukan keduanya, jadi ini adalah jawaban yang solid
Mond Raymond

Buffer () tidak digunakan lagi karena masalah keamanan dan kegunaan. Silakan gunakan metode Buffer.alloc (), Buffer.allocUnsafe (), atau Buffer.from () sebagai gantinya
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

Saya menemukan ini baru-baru ini. Manakah di antara header Proxy-Authorization dan Authorization yang akan disetel bergantung pada server yang digunakan klien. Jika ini adalah server Web, Anda perlu menyetel Otorisasi dan jika itu proxy, Anda harus menyetel header Proxy-Authorization


1

Kode ini berfungsi dalam kasus saya, setelah banyak penelitian. Anda perlu menginstal permintaan paket 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 () tidak digunakan lagi karena masalah keamanan dan kegunaan. Silakan gunakan metode Buffer.alloc (), Buffer.allocUnsafe (), atau Buffer.from () sebagai gantinya
Sourabh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.