Auth cơ bản đơn giản với JavaScript vani (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
// -----------------------------------------------------------------------
})
lưu ý: "Phần mềm trung gian" này có thể được sử dụng trong bất kỳ trình xử lý nào. Chỉ cần loại bỏ next()
và đảo ngược logic. Xem ví dụ 1 câu bên dưới hoặc lịch sử chỉnh sửa của câu trả lời này.
Tại sao?
req.headers.authorization
chứa giá trị " Basic <base64 string>
", nhưng nó cũng có thể trống và chúng tôi không muốn nó bị lỗi, do đó, kết hợp kỳ lạ của|| ''
- Node không biết
atob()
và btoa()
do đóBuffer
ES6 -> ES5
const
chỉ là var
.. đại loại
(x, y) => {...}
là chỉ function(x, y) {...}
const [login, password] = ...split()
là hai var
nhiệm vụ trong một
nguồn cảm hứng (sử dụng các gói)
Trên đây là một ví dụ
siêu đơn giản nhằm mục đích
siêu ngắn và có thể triển khai nhanh chóng cho máy chủ sân chơi của bạn. Nhưng như đã được chỉ ra trong các nhận xét, mật khẩu cũng có thể chứa các ký tự dấu hai chấm
:
. Để giải nén chính xác nó từ
b64auth , bạn có thể sử dụng điều này.
// 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(/(.*?):(.*)/) || []
Xác thực cơ bản trong một câu lệnh
... mặt khác, nếu bạn chỉ sử dụng một hoặc rất ít thông tin đăng nhập, đây là mức tối thiểu bạn cần: (bạn thậm chí không cần phải phân tích cú pháp thông tin đăng nhập)
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)
}
Tái bút: bạn có cần phải có cả hai đường dẫn "an toàn" và "công khai" không? Cân nhắc sử dụng express.router
thay thế.
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