Einfache Basisauthentifizierung mit Vanille-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
// -----------------------------------------------------------------------
})
Hinweis: Diese "Middleware" kann in jedem Handler verwendet werden. Entfernen Sie einfach next()
die Logik und kehren Sie sie um. Siehe das folgende Beispiel mit 1 Anweisung oder den Bearbeitungsverlauf dieser Antwort.
Warum?
req.headers.authorization
enthält den Wert " Basic <base64 string>
", kann aber auch leer sein und wir möchten nicht, dass er fehlschlägt, daher die seltsame Kombination von|| ''
- Knoten weiß es nicht
atob()
und btoa()
daher derBuffer
ES6 -> ES5
const
ist nur var
.. Art
(x, y) => {...}
ist nur function(x, y) {...}
const [login, password] = ...split()
ist nur zwei var
Aufgaben in einer
Inspirationsquelle (verwendet Pakete)
Das obige ist
super einfach sollte sehr
kurz sein und schnell auf Ihrem Spielplatzserver bereitgestellt werden können. Wie in den Kommentaren erwähnt, können Passwörter auch Doppelpunktzeichen enthalten
:
. Um es korrekt aus dem
b64auth zu extrahieren , können Sie dies verwenden.
// 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(/(.*?):(.*)/) || []
Grundlegende Authentifizierung in einer Anweisung
... auf der anderen Seite, wenn Sie immer nur eine oder sehr wenige Anmeldungen verwenden, ist dies das absolute Minimum, das Sie benötigen: (Sie müssen die Anmeldeinformationen überhaupt nicht analysieren)
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: Müssen Sie sowohl "sichere" als auch "öffentliche" Pfade haben? Verwenden Sie express.router
stattdessen.
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