वेनिला जावास्क्रिप्ट (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
ईएस 6 -> ईएस 5
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)
}
पुनश्च: क्या आपको "सुरक्षित" और "सार्वजनिक" दोनों रास्ते होने चाहिए? 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