Il semble que l'implémentation de l'authentification HTTP de base avec Express v3 était triviale:
app.use(express.basicAuth('username', 'password'));
La version 4 (j'utilise 4.2) a supprimé le basicAuth
middleware, donc je suis un peu coincé. J'ai le code suivant, mais cela n'oblige pas le navigateur à demander à l'utilisateur ses informations d'identification, ce que j'aimerais (et ce que j'imagine que l'ancienne méthode faisait):
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') {
res.writeHead(401, 'Access invalid for user', {'Content-Type' : 'text/plain'});
res.end('Invalid credentials');
} else {
next();
}
});
Réponses:
Authentification simple de base avec JavaScript vanille (ES6)
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|| ''
atob()
etbtoa()
, par conséquentBuffer
ES6 -> ES5
const
est justevar
.. sorte(x, y) => {...}
est justefunction(x, y) {...}
const [login, password] = ...split()
est juste deuxvar
missions dans unsource 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.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)
PS: avez-vous besoin d'avoir à la fois des chemins "sécurisés" et "publics"? Pensez à utiliser à la
express.router
place.la source
.split(':')
car il s'étouffera avec les mots de passe contenant au moins un deux-points. Ces mots de passe sont valides selon la RFC 2617 .const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
pour la partie deux-points.!==
pour comparer les mots de passe vous rend vulnérable aux attaques de synchronisation. fr.wikipedia.org/wiki/Timing_attack assurez-vous d'utiliser une comparaison de chaîne à temps constant.Buffer.from() // for strings
ouBuffer.alloc() // for numbers
telBuffer()
quel en raison de problèmes de sécurité.TL; DR:
☒
express.basicAuth
est parti☒
basic-auth-connect
est obsolète☒
basic-auth
n'a aucune logique☒
http-auth
est exagéré☑
express-basic-auth
est ce que vous voulezPlus d'informations:
Puisque vous utilisez Express, vous pouvez utiliser le
express-basic-auth
middleware.Voir la documentation:
Exemple:
la source
challenge: true
Une grande partie du middleware a été retirée du cœur d'Express dans la v4 et placée dans des modules séparés. Le module d'authentification de base est ici: https://github.com/expressjs/basic-auth-connect
Votre exemple devrait simplement changer pour ceci:
la source
basic-auth
bibliothèque dans cette réponseJ'ai utilisé le code de l'original
basicAuth
pour trouver la réponse:la source
J'ai changé dans express 4.0 l'authentification de base avec http-auth , le code est:
la source
Il semble y avoir plusieurs modules pour faire cela, certains sont obsolètes.
Celui-ci a l'air actif:
https://github.com/jshttp/basic-auth
Voici un exemple d'utilisation:
Assurez-vous de placer le
auth
middleware au bon endroit, tout middleware antérieur ne sera pas authentifié.la source
implement
le protocole vous-même (alias envoyer un en-tête correct)Nous pouvons implémenter l'autorisation de base sans avoir besoin d'aucun module
Source: - http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
la source
Express a supprimé cette fonctionnalité et vous recommande maintenant d'utiliser la bibliothèque de base-auth .
Voici un exemple d'utilisation:
Pour envoyer une demande à cette route, vous devez inclure un en- tête d'autorisation formaté pour l'authentification de base.
En envoyant d'abord une requête curl, vous devez prendre le codage base64 de
name:pass
ou dans ce casaladdin:opensesame
qui est égal àYWxhZGRpbjpvcGVuc2VzYW1l
Votre demande de curl ressemblera alors à:
la source
la source