Parece que implementar la autenticación HTTP básica con Express v3 fue trivial:
app.use(express.basicAuth('username', 'password'));
Sin basicAuth
embargo, la versión 4 (estoy usando 4.2) eliminó el middleware, así que estoy un poco atascado. Tengo el siguiente código, pero no hace que el navegador solicite al usuario las credenciales, que es lo que me gustaría (y lo que imagino que hizo el método anterior):
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();
}
});
Respuestas:
Autenticación básica simple con JavaScript vainilla (ES6)
nota: este "middleware" se puede utilizar en cualquier controlador. Simplemente elimine
next()
e invierta la lógica. Vea el ejemplo de 1 declaración a continuación o el historial de edición de esta respuesta.¿Por qué?
req.headers.authorization
contiene el valor "Basic <base64 string>
", pero también puede estar vacío y no queremos que falle, de ahí la extraña combinación de|| ''
atob()
ybtoa()
, por lo tanto, elBuffer
ES6 -> ES5
const
esvar
... más(x, y) => {...}
o menosfunction(x, y) {...}
const [login, password] = ...split()
es solo dosvar
tareas en unafuente de inspiración (usa paquetes)
El anterior es un ejemplo súper simple que estaba destinado a ser súper corto y rápidamente implementable en su servidor de juegos. Pero como se señaló en los comentarios, las contraseñas también pueden contener dos puntos
:
. Para extraerlo correctamente de b64auth , puede usar esto.Autenticación básica en una declaración
... por otro lado, si solo usa uno o muy pocos inicios de sesión, este es el mínimo que necesita: (ni siquiera necesita analizar las credenciales)
PD: ¿necesita tener rutas "seguras" y "públicas"? Considere usar en su
express.router
lugar.fuente
.split(':')
porque se ahogará con contraseñas que contengan al menos dos puntos. Dichas contraseñas son válidas de acuerdo con RFC 2617 .const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
para la parte de los dos puntos.!==
para comparar contraseñas lo deja vulnerable a los ataques de tiempo. en.wikipedia.org/wiki/Timing_attack asegúrese de utilizar una comparación de cadenas de tiempo constante.Buffer.from() // for strings
oBuffer.alloc() // for numbers
comoBuffer()
está en desuso debido a problemas de seguridad.TL; DR:
☒
express.basicAuth
se ha ido☒
basic-auth-connect
está en desuso☒
basic-auth
no tiene ninguna lógica☒
http-auth
es una exageración☑
express-basic-auth
es lo que quieresMás información:
Como está utilizando Express, puede utilizar el
express-basic-auth
middleware.Ver los documentos:
Ejemplo:
fuente
challenge: true
opciónGran parte del middleware se extrajo del núcleo Express en v4 y se colocó en módulos separados. El módulo de autenticación básico está aquí: https://github.com/expressjs/basic-auth-connect
Su ejemplo solo necesitaría cambiar a esto:
fuente
basic-auth
biblioteca en esta respuestaUsé el código del original
basicAuth
para encontrar la respuesta:fuente
Cambié en express 4.0 la autenticación básica con http-auth , el código es:
fuente
Parece que hay varios módulos para hacer eso, algunos están en desuso.
Este parece activo:
https://github.com/jshttp/basic-auth
Aquí hay un ejemplo de uso:
Asegúrese de colocar el
auth
middleware en el lugar correcto, cualquier middleware anterior no será autenticado.fuente
implement
el protocolo usted mismo (también conocido como enviar el encabezado correcto)Podemos implementar la autorización básica sin necesidad de ningún módulo
Fuente: - http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
fuente
Express ha eliminado esta funcionalidad y ahora le recomienda utilizar la biblioteca de autenticación básica .
Aquí hay un ejemplo de cómo usarlo:
Para enviar una solicitud a esta ruta, debe incluir un encabezado de autorización con el formato de autenticación básica.
Al enviar una solicitud curl primero, debe tomar la codificación base64 de
name:pass
o, en este caso,aladdin:opensesame
que es igual aYWxhZGRpbjpvcGVuc2VzYW1l
Su solicitud de curl se verá así:
fuente
fuente