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

Serak
sumber
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);
});
vrtis
sumber
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);
    });
});
Manish Kumar
sumber
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

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

    });    
}
Nimish goel
sumber
Buffer () tidak digunakan lagi karena masalah keamanan dan kegunaan. Silakan gunakan metode Buffer.alloc (), Buffer.allocUnsafe (), atau Buffer.from () sebagai gantinya
Sourabh