Simple Basic Auth dengan vanilla JavaScript (ES6)
app.use((req, res, next) => {
// -----------------------------------------------------------------------
// authentication middleware
const auth = {login: 'yourlogin', password: 'yourpassword'} // change this
// parse login and password from headers
const b64auth = (req.headers.authorization || '').split(' ')[1] || ''
const [login, password] = Buffer.from(b64auth, 'base64').toString().split(':')
// Verify login and password are set and correct
if (login && password && login === auth.login && password === auth.password) {
// Access granted...
return next()
}
// Access denied...
res.set('WWW-Authenticate', 'Basic realm="401"') // change this
res.status(401).send('Authentication required.') // custom message
// -----------------------------------------------------------------------
})
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|| ''
- Node tidak tahu
atob()
dan btoa()
, karenanyaBuffer
ES6 -> ES5
const
hanya var
.. semacam
(x, y) => {...}
ini hanya function(x, y) {...}
const [login, password] = ...split()
hanya duavar
tugas dalam satu
sumber 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.
// parse login and password from headers
const b64auth = (req.headers.authorization || '').split(' ')[1] || ''
const strauth = Buffer.from(b64auth, 'base64').toString()
const splitIndex = strauth.indexOf(':')
const login = strauth.substring(0, splitIndex)
const password = strauth.substring(splitIndex + 1)
// using shorter regex by @adabru
// const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
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)
function (req, res) {
//btoa('yourlogin:yourpassword') -> "eW91cmxvZ2luOnlvdXJwYXNzd29yZA=="
//btoa('otherlogin:otherpassword') -> "b3RoZXJsb2dpbjpvdGhlcnBhc3N3b3Jk"
// Verify credentials
if ( req.headers.authorization !== 'Basic eW91cmxvZ2luOnlvdXJwYXNzd29yZA=='
&& req.headers.authorization !== 'Basic b3RoZXJsb2dpbjpvdGhlcnBhc3N3b3Jk')
return res.status(401).send('Authentication required.') // Access denied.
// Access granted...
res.send('hello world')
// or call next() if you use it as middleware (as snippet #1)
}
NB: apakah Anda perlu memiliki jalur "aman" dan "publik"? Pertimbangkan untuk menggunakan express.router
sebagai gantinya.
var securedRoutes = require('express').Router()
securedRoutes.use(/* auth-middleware from above */)
securedRoutes.get('path1', /* ... */)
app.use('/secure', securedRoutes)
app.get('public', /* ... */)
// example.com/public // no-auth
// example.com/secure/path1 // requires auth