Sepertinya menerapkan otentikasi HTTP dasar dengan Express v3 itu sepele:
app.use(express.basicAuth('username', 'password'));
Versi 4 (saya menggunakan 4.2) menghapus basicAuth
middleware, jadi saya sedikit buntu. Saya memiliki kode berikut, tetapi tidak menyebabkan browser meminta kredensial pengguna, yang saya inginkan (dan apa yang saya bayangkan dilakukan metode lama):
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') {
res.writeHead(401, 'Access invalid for user', {'Content-Type' : 'text/plain'});
res.end('Invalid credentials');
} else {
next();
}
});
Jawaban:
Simple Basic Auth dengan vanilla JavaScript (ES6)
catatan: "Middleware" ini dapat digunakan di semua handler. Hapus saja
next()
dan balikkan logikanya. Lihat contoh 1 pernyataan di bawah ini, atau riwayat edit jawaban ini.Mengapa?
req.headers.authorization
berisi nilai "Basic <base64 string>
", tetapi juga bisa kosong dan kami tidak ingin gagal, karenanya kombo aneh dari|| ''
atob()
danbtoa()
, karenanyaBuffer
ES6 -> ES5
const
hanyavar
.. semacam(x, y) => {...}
ini hanyafunction(x, y) {...}
const [login, password] = ...split()
hanya duavar
tugas dalam satusumber inspirasi (menggunakan paket)
Di atas adalah contoh super sederhana yang dimaksudkan agar sangat pendek dan dapat diterapkan dengan cepat ke server taman bermain Anda. Tetapi seperti yang ditunjukkan di komentar, kata sandi juga dapat berisi karakter titik dua
:
. Untuk mengekstraknya dengan benar dari b64auth , Anda dapat menggunakan ini.Otorisasi dasar dalam satu pernyataan
... di sisi lain, jika Anda hanya pernah menggunakan satu atau sangat sedikit login, ini adalah kebutuhan minimum yang Anda butuhkan: (Anda bahkan tidak perlu mengurai kredensial sama sekali)
NB: apakah Anda perlu memiliki jalur "aman" dan "publik"? Pertimbangkan untuk menggunakan
express.router
sebagai gantinya.sumber
.split(':')
karena akan mencekik sandi yang mengandung setidaknya satu titik dua. Kata sandi tersebut valid menurut RFC 2617 .const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
untuk bagian titik dua.!==
untuk membandingkan kata sandi membuat Anda rentan terhadap serangan waktu. en.wikipedia.org/wiki/Timing_attack pastikan Anda menggunakan perbandingan string waktu yang konstan.Buffer.from() // for strings
atauBuffer.alloc() // for numbers
seperti yangBuffer()
tidak digunakan lagi karena masalah keamanan.TL; DR:
☒
express.basicAuth
hilang☒
basic-auth-connect
tidak digunakan lagi☒
basic-auth
tidak memiliki logika☒
http-auth
berlebihan☑
express-basic-auth
adalah yang Anda inginkanInfo lebih lanjut:
Karena Anda menggunakan Express, maka Anda dapat menggunakan
express-basic-auth
middleware.Lihat dokumennya:
Contoh:
sumber
challenge: true
opsiBanyak middleware ditarik keluar dari inti Express di v4, dan dimasukkan ke modul terpisah. Modul autentikasi dasar ada di sini: https://github.com/expressjs/basic-auth-connect
Contoh Anda hanya perlu diubah menjadi ini:
sumber
basic-auth
perpustakaan dalam jawaban iniSaya menggunakan kode untuk aslinya
basicAuth
untuk menemukan jawabannya:sumber
Saya mengubah express 4.0 otentikasi dasar dengan http-auth , kodenya adalah:
sumber
Tampaknya ada beberapa modul untuk melakukannya, beberapa tidak digunakan lagi.
Yang ini terlihat aktif:
https://github.com/jshttp/basic-auth
Berikut adalah contoh penggunaan:
Pastikan Anda meletakkan
auth
middleware di tempat yang benar, middleware apa pun sebelumnya tidak akan diautentikasi.sumber
implement
menggunakan protokolnya sendiri (alias mengirim header yang benar)Kami dapat menerapkan otorisasi dasar tanpa memerlukan modul apa pun
Sumber: - http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
sumber
Express telah menghapus fungsionalitas ini dan sekarang merekomendasikan Anda menggunakan pustaka autentikasi dasar .
Berikut contoh cara menggunakan:
Untuk mengirim permintaan ke rute ini, Anda perlu menyertakan header Otorisasi yang diformat untuk autentikasi dasar.
Mengirim permintaan curl terlebih dahulu, Anda harus mengambil pengkodean base64
name:pass
atau dalam halaladdin:opensesame
ini sama denganYWxhZGRpbjpvcGVuc2VzYW1l
Permintaan curl Anda akan terlihat seperti:
sumber
sumber