Authentification simple de base avec JavaScript vanille (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
// -----------------------------------------------------------------------
})
note: ce "middleware" peut être utilisé dans n'importe quel gestionnaire. Retirez simplement next()
et inversez la logique. Voir l' exemple à 1 instruction ci-dessous ou l' historique des modifications de cette réponse.
Pourquoi?
req.headers.authorization
contient la valeur " Basic <base64 string>
", mais elle peut aussi être vide et nous ne voulons pas qu'elle échoue, d'où l'étrange combo de|| ''
- Node ne sait pas
atob()
et btoa()
, par conséquentBuffer
ES6 -> ES5
const
est juste var
.. sorte
(x, y) => {...}
est juste function(x, y) {...}
const [login, password] = ...split()
est juste deux var
missions dans un
source d'inspiration (utilise des packages)
Ce qui précède est un exemple
super simple qui devait être
super court et rapidement déployable sur votre serveur de terrain de jeu. Mais comme cela a été souligné dans les commentaires, les mots de passe peuvent également contenir des caractères deux-points
:
. Pour l'extraire correctement du
b64auth , vous pouvez l'utiliser.
// 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(/(.*?):(.*)/) || []
Authentification de base en une seule instruction
... d'un autre côté, si vous n'utilisez qu'une ou très peu de connexions, c'est le strict minimum dont vous avez besoin: (vous n'avez même pas besoin d'analyser les informations d'identification du tout)
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: avez-vous besoin d'avoir à la fois des chemins "sécurisés" et "publics"? Pensez à utiliser à la express.router
place.
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