การตรวจสอบสิทธิ์พื้นฐานอย่างง่ายด้วย 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
// -----------------------------------------------------------------------
})
หมายเหตุ: "มิดเดิลแวร์" นี้สามารถใช้ในเครื่องจัดการใดก็ได้ เพียงแค่ลบnext()
และย้อนกลับตรรกะ ดูตัวอย่างคำสั่ง 1ด้านล่างหรือประวัติการแก้ไขของคำตอบนี้
ทำไม?
req.headers.authorization
มีค่า "Basic <base64 string>
" แต่ก็สามารถว่างได้และเราไม่ต้องการให้มันล้มเหลวดังนั้นคำสั่งผสมแปลก ๆ ของ|| ''
- โหนดไม่ทราบ
atob()
และbtoa()
ด้วยเหตุนี้Buffer
ES6 -> ES5
const
เป็นเพียงvar
.. การเรียงลำดับ
(x, y) => {...}
เป็นเพียงfunction(x, y) {...}
const [login, password] = ...split()
แค่สองvar
ที่ได้รับมอบหมายในหนึ่ง
แหล่งที่มาของแรงบันดาลใจ (ใช้แพ็คเกจ)
ข้างต้นเป็นตัวอย่าง
ง่ายๆสุด ๆที่ตั้งใจให้
สั้นมากและปรับใช้กับเซิร์ฟเวอร์สนามเด็กเล่นของคุณได้อย่างรวดเร็ว แต่ตามที่ระบุไว้ในความคิดเห็นรหัสผ่านยังสามารถมีอักขระโคลอน
:
ได้ หากต้องการดึงข้อมูลจาก
b64authอย่างถูกต้องคุณสามารถใช้สิ่งนี้
// 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(/(.*?):(.*)/) || []
การตรวจสอบสิทธิ์พื้นฐานในคำสั่งเดียว
... ในทางกลับกันหากคุณเคยใช้การเข้าสู่ระบบเพียงครั้งเดียวหรือน้อยมากนี่คือขั้นต่ำที่คุณต้องการ: (คุณไม่จำเป็นต้องแยกวิเคราะห์ข้อมูลรับรองเลย)
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)
}
PS: คุณจำเป็นต้องมีทั้งเส้นทางที่ "ปลอดภัย" และ "สาธารณะ" หรือไม่? ลองใช้express.router
แทน
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