Parece que implementar la autenticación HTTP básica con Express v3 fue trivial:
app.use(express.basicAuth('username', 'password'));
Sin basicAuthembargo, 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.authorizationcontiene 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, elBufferES6 -> ES5
constesvar... más(x, y) => {...}o menosfunction(x, y) {...}const [login, password] = ...split()es solo dosvartareas 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.routerlugar.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 stringsoBuffer.alloc() // for numberscomoBuffer()está en desuso debido a problemas de seguridad.TL; DR:
☒
express.basicAuthse ha ido☒
basic-auth-connectestá en desuso☒
basic-authno tiene ninguna lógica☒
http-authes una exageración☑
express-basic-authes lo que quieresMás información:
Como está utilizando Express, puede utilizar el
express-basic-authmiddleware.Ver los documentos:
Ejemplo:
fuente
challenge: trueopció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-authbiblioteca en esta respuestaUsé el código del original
basicAuthpara 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
authmiddleware en el lugar correcto, cualquier middleware anterior no será autenticado.fuente
implementel 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:passo, en este caso,aladdin:opensesameque es igual aYWxhZGRpbjpvcGVuc2VzYW1lSu solicitud de curl se verá así:
fuente
fuente