La autenticación de los usuarios es un parte fundamental para cualquier aplicación o servicio en línea. La necesidad de garantizar tanto la seguridad como la privacidad de los usuarios ha llevado al desarrollo de estándares y protocolos para abordar los desafíos que presenta la autenticación en los entornos modernos, como son OAuth 2.0 y OpenID Connect (OIDC). Por lo tanto, saber cómo integrar estos estándares y protocolos en las aplicaciones es clave para la seguridad de estas. En esta entrada se va a explicar cómo integrar Auth0 en una aplicación Express, una plataforma de autenticación y autorización.
Tabla de contenidos
La autenticación de los usuarios de forma segura es un proceso complejo en las aplicaciones actuales. Por eso es tan habitual adaptar estándares como OAuth 2.0 y OpenID Connect (OIDC) ya que ofrecen múltiples ventajas tanto para los desarrolladores como los usuarios. Estos estándares permiten la implementación de Single Sign-On (SSO), que mejora la experiencia del usuario al permitirles iniciar sesión una vez y acceder a múltiples aplicaciones sin tener que volver a autenticarse. Lo que evita la necesidad de obligar a los usuarios a volverse a registrar en cada servicio. Eliminado la fricción que conlleva crear un nuevo usuario en cada servicio que se desea probar. Además, OAuth 2.0 y OIDC son altamente interoperables, lo que significa que funcionan bien con una amplia variedad de plataformas (Google, Microsoft, GitHub, …) y servicios, lo que facilita su implementación en diferentes entornos de desarrollo.
Sin embargo, trabajar con OAuth 2.0 y OIDC puede ser complejo y requiere un conocimiento profundo de los estándares y protocolos subyacentes. Es aquí donde entra en juego servicios como Auth0, una plataforma de autenticación y autorización que simplifica la gestión de identidades tanto para los desarrolladores y cómo las organizaciones. La plataforma ofrece características como la gestión de usuarios, SSO, autenticación multifactor (MFA), evitando la necesidad de implementar estas en las propias aplicaciones.
Para poder usar Auth0 es una aplicación Express es necesario crear una cuenta, la cual es gratuita para aplicaciones con pocos usuarios. Para esto solamente se deben seguir estos pasos:
Antes poder integrar Auth0 en una aplicación es necesario crear es necesario crear las credenciales para esta. Lo que se consigue creando una nueva aplicación en el panel de control de Auth0. Para esto solamente se deben seguir los siguientes pasos:
Una vez creada la aplicación en Auth0, se puede acceder a las páginas de la misma para obtener las credenciales y las configuraciones necesarias para usar en la aplicación. Estas credenciales incluyen el dominio de Auth0, el ID de cliente, el secreto de cliente y la URL de devolución de llamada, que se utilizarán para configurar la estrategia de autenticación en la aplicación Express.
Una vez que se tengan las credenciales de la aplicación ya se puede integrar Auth0 en una aplicación Express para facilitar la autenticación segura a los usuarios. Para lo que se deberá crear un proyecto Node.js con las dependencias necesarias. Creando una carpeta y ejecutando el siguiente comando en una terminal:
npm install express express-session passport passport-auth0 dotenv
Lo que instalara tanto Express como el resto de las librerías necesarias. En primer lugar, express-session permite gestionar las sesiones de los usuarios en la aplicación. Algo crucial para mantener el estado de autenticación del usuario durante su visita a la aplicación.
A continuación, Passport el middleware de autenticación para Node.js con el que se integrará la autenticación de los usuarios. Empleando en este caso la estrategia passport-auth0 que se corresponde con el servicio Auth0.
Finalmente, el módulo dotenv permite cargar variables de entorno desde un archivo .env. Lo que permite guardar las credenciales en este archivo y evitar la inclusión de estas en el código.
Una vez instaladas las dependencias necesarias, ya se puede crear una aplicación Express que se integre con Auth0. Por ejemplo, el siguiente código.
// Importa las dependencias necesarias
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const Auth0Strategy = require('passport-auth0');
// Importar la configuración del archivo .env
require("dotenv").config();
// Configura Express
const app = express();
const PORT = process.env.PORT || 3000;
// Configura la sesión
app.use(session({
secret: process.env.SESSION_SECRET,
cookie: {},
resave: false,
saveUninitialized: false
}));
// Inicializa Passport
app.use(passport.initialize());
app.use(passport.session());
// Configura la estrategia de autenticación de Auth0
const strategy = new Auth0Strategy({
domain: process.env.AUTH0_DOMAIN,
clientID: process.env.AUTH0_CLIENT_ID,
clientSecret: process.env.AUTH0_CLIENT_SECRET,
callbackURL: process.env.AUTH0_CALLBACK_URL
}, (accessToken, refreshToken, extraParams, profile, done) => {
// Aquí se pude hacer algo con el perfil del usuario, como guardarlo en la base de datos
return done(null, profile);
});
passport.use(strategy);
passport.serializeUser((user, done) => {
done(null, user);
});
passport.deserializeUser((user, done) => {
done(null, user);
});
// Define las rutas
app.get('/', (req, res) => {
if (req.isAuthenticated()) {
const userProfile = req.user;
res.send(`Bienvenido, ${userProfile.displayName}!`);
} else {
res.send('Inicia sesion para ver tu perfil');
}
});
// Inicia la autenticación
app.get("/login",
passport.authenticate("auth0", { scope: "openid email profile" }),
(req, res) => {
res.redirect("/");
}
);
// Maneja la respuesta de autenticación
app.get("/callback", (req, res, next) => {
passport.authenticate("auth0", (err, user, info) => {
if (err) {
return next(err);
}
if (!user) {
return res.redirect("/login");
}
req.logIn(user, (err) => {
if (err) {
return next(err);
}
res.redirect("/");
});
})(req, res, next);
});
// Gestiona el cierre de sesión
app.get("/logout", (req, res) => {
req.logout(() => { });
res.redirect('/');
});
// Inicia el servidor
app.listen(PORT, () => {
console.log(`Servidor en ejecución en http://localhost:${PORT}`);
}); En este programa, una vez importadas las dependencias, se llama a la función config() de dotenv para cargar las variables de entorno definidas en un archivo .env. En este archivo es donde se guardarán las credenciales de la aplicación.
Tras esto, se crea una instancia de la aplicación Express y se configura el middleware de sesión. Usando una clave secreta que está en el archivo .env para firmar las cookies de sesión. Posteriormente se inicia Passport y se configura para usar sesiones de Express.
Tras esto se configura la estrategia de autenticación de Passport para utilizar Auth0. Indicando las credenciales necesarias para conectarse con Auth0, como el dominio, el ID de cliente y el secreto de cliente. Además, se define una función de devolución de llamada para procesar la respuesta de autenticación de Auth0 y guardar el perfil del usuario. La URL de la devolución de llamada se deberá autorizar de forma explícita en el panel de Auth0, para ello se deberá ir a la aplicación y buscar la casilla “Allowed Callback URLs” en la que deberá incluirá http://localhost:3000/callback o la URL en la que se publica la ruta de callback. Para guardar los cambios se deberá pulsar sobre el botón “Save Changes”.
A continuación, se crean las funciones para serializar y deserializar usuarios, las rutas y se inicia el servidor.
En la aplicación se han creado 4 rutas:
Una vez hecho esto se puede lanzar el servicio con ejecutando en el proyecto el siguiente comando:
node index.js
Para acceder a la aplicación escribiendo en el navegador http://localhost:3000.
En este punto, como se ha iniciado sesión todavía, la aplicación nos invita a iniciar la sesión. Para ello, como, por simplicidad, no se ha creado una página web se debe escribir en el navegador la dirección para hacer login: http://localhost:3000/login. Apareciendo la página de Auth0 para iniciar la sesión.
Una vez iniciada la sesión, tanto sea con Google como una cuenta propia, la ventana nos devolverá a la página principal indicando el nombre del usuario.
Para salir solamente se deberá ir a ruta de logout http://localhost:3000/logout. Lo que cerrará la sesión y nos devolverá a la ruta raíz sin un usuario.
En esta entrada se han visto los pasos básicos para integrar Auth0 en una aplicación Express. Una forma sencilla para usar las mejores prácticas de autenticación en las aplicaciones creadas con Node.
Imagen de Gerd Altmann en Pixabay
En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…
En la serie Creación de una API REST con Express y TypeScript construimos una API…
Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…
En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…
Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…
En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…
This website uses cookies.