Implementación de la API en Node.js (SPAs + API)
Paso 1. Defina los endpoints de la API
Cree un archivo package.json
npm init. Esto configurará el archivo package.json.
Puede dejar la configuración predeterminada o cambiarla según prefiera.
El archivo package.json de nuestro ejemplo es el siguiente:
Instala las dependencias
- express: Este módulo agrega el framework web Express.
- cors: Este módulo agrega compatibilidad para habilitar CORS, lo cual es necesario porque la API se llamará desde una aplicación de una sola página que se ejecuta en un dominio distinto dentro de un navegador web.
- jwks-rsa: Esta biblioteca obtiene claves de firma RSA desde un endpoint de JWKS (JSON Web Key Set). Con
expressJwtSecret, podemos generar un proveedor de secretos que proporcionará la clave de firma correcta aexpress-jwtsegún elkiddel encabezado del . Para obtener más información, consulta el repositorio de GitHub de node-jwks-rsa. - express-jwt: Este módulo te permite autenticar solicitudes HTTP mediante tokens JWT en tus aplicaciones de Node.js. Proporciona varias funciones que facilitan el trabajo con JWT. Para obtener más información, consulta el repositorio de GitHub de express-jwt.
- body-parser: Este es un middleware de análisis del cuerpo para Node.js. Extrae toda la parte del cuerpo de un flujo de solicitud entrante y la expone en
req.bodyde una forma más fácil de usar. Para obtener más información y varias alternativas, consulta el repositorio de GitHub de body-parser.
Implementa los endpoints
server.js. Tu código debe:
- Importar las dependencias.
- Implementar los endpoints.
- Iniciar el servidor de la API.
node server y haga una solicitud HTTP POST a localhost:8080/timesheets. Debería ver una respuesta JSON con el mensaje This is the POST /timesheets endpoint.
Ahora ya tenemos nuestro endpoint, pero cualquiera puede llamarlo. Continúe con el siguiente párrafo para ver cómo podemos corregirlo.
Paso 2. Proteger los endpoints de la API
jwt, proporcionada por el middleware express-jwt, y jwks-rsa para obtener nuestro secreto. Las bibliotecas hacen lo siguiente:
express-jwtdecodificará el token y pasará la petición, el encabezado y la carga útil ajwksRsa.expressJwtSecret.jwks-rsadescargará todas las claves de firma desde el endpoint JWKS y comprobará si alguna coincide con elkiddel encabezado del JWT. Si ninguna de las claves de firma coincide con elkidrecibido, se generará un error. Si hay coincidencia, pasaremos la clave de firma correcta aexpress-jwt.express-jwtcontinuará con su propia lógica para validar la firma del token, la expiración,audienceyissuer.
- Crear la función de middleware para validar el .
- Habilitar el uso del middleware en nuestras rutas.
localhost:8080/timesheets deberíamos obtener el mensaje de error Missing or invalid token (lo cual es perfectamente normal, ya que no enviamos un token de acceso en la solicitud).
Para probar también el caso en que sí funciona, debemos hacer lo siguiente:
- Obtener un Token de acceso. Para ver más información sobre cómo hacerlo, consulta: Obtener un Token de acceso.
- Invocar la API agregando un encabezado
Authorizationa la solicitud con el valorBearer ACCESS_TOKEN(dondeACCESS_TOKENes el valor del token que recuperamos en el primer paso).
Paso 3. Verifique los permisos de la aplicación
scope) necesarios para usar nuestro endpoint y crear un registro de horas. En concreto, queremos asegurarnos de que el token tenga el scope correcto, que es batch:upload.
Para ello, utilizaremos el paquete de Node.js express-jwt-authz, así que añádalo a su proyecto:
jwtAuthz(...) en su middleware para garantizar que el JWT contenga un scope específico y así ejecutar un endpoint determinado.
Agregaremos una dependencia adicional. La biblioteca express-jwt-authz, que se utiliza junto con express-jwt, valida el JWT y garantiza que tenga los permisos correctos para llamar al endpoint deseado. Para obtener más información, consulte el repositorio de GitHub de express-jwt-authz.
Esta es nuestra implementación de ejemplo (se omite parte del código por brevedad):
403. Puede comprobarlo quitando este scope de su API.
Paso 4. Determinar la identidad del usuario
express-jwt, que se usa para validar el JWT, también asigna a req.auth la información contenida en el JWT. Si desea usar el claim sub para identificar al usuario de forma única, puede simplemente usar req.auth.sub.
Sin embargo, en el caso de la aplicación de registro de horas, queremos usar la dirección de correo electrónico del usuario como identificador único.
Lo primero que debemos hacer es escribir una Rule que agregue la dirección de correo electrónico del usuario al Token de acceso. Vaya a la sección Rules del Dashboard y haga clic en el botón Create Rule.
Puede darle a la Rule un nombre descriptivo, por ejemplo Add email to Access Token, y luego usar el siguiente código para la Rule:
namespace se usa para garantizar que el claim tenga un nombre único y no entre en conflicto con los nombres de ninguno de los claims estándar de OIDC. Sin embargo, Auth0 admite claims personalizados con y sin espacio de nombres. Para obtener más información sobre los claims personalizados, consulta Crear claims personalizados.
A continuación, en tu API, puedes recuperar el valor del claim desde req.auth y usarlo como la identidad única del usuario, que puedes asociar a las entradas del registro de horas.