Validar los tokens de acceso para MFA
- Verificar la firma del token, que se usa para comprobar que el remitente del token es quien dice ser y para garantizar que el mensaje no se haya modificado durante la transmisión.
- Validar los claims estándar:
| Claim | Descripción |
|---|---|
exp | Vencimiento del token |
iss | Emisor del token |
aud | Destinatario previsto del token |
Escenario: Transacciones bancarias con notificaciones push
view:balance) o transferir fondos (scope transfer:funds). Cuando la aplicación solicita a la API que obtenga el saldo del usuario, el token de acceso debe contener el scope view:balance. Para transferir dinero a otra cuenta, el token de acceso debe contener el scope transfer:funds.
Flujo de trabajo
- El usuario inicia sesión en la aplicación mediante autenticación con username y contraseña. El inicio de sesión estándar permite a este usuario interactuar con la API y consultar su saldo. Esto significa que el token de acceso que recibe la aplicación después de que el usuario se autentica contiene el scope
view:balance. - La aplicación envía una solicitud a la API para recuperar el saldo, usando el token de acceso como credenciales.
- La API valida el token y envía la información del saldo a la aplicación para que el usuario pueda verla.
- El usuario quiere transferir fondos de una cuenta a otra, lo que se considera una transacción de alto valor que requiere el scope
transfer:funds. La aplicación envía una solicitud a la API usando el mismo token de acceso. - La API valida el token y deniega el acceso porque al token le falta el scope
transfer:fundsrequerido. - La aplicación redirige a Auth0, donde se usa una Action para exigir que el usuario se autentique con MFA, ya que se solicitó un scope de alto valor. Una vez que el usuario se autentica correctamente con MFA, se genera un nuevo token de acceso que incluye el scope correcto y se envía a la aplicación como parte de la respuesta.
- La aplicación envía otra solicitud de transferencia de fondos usando el nuevo token de acceso, que esta vez sí incluye el scope
transfer:funds. - La API valida el token, lo descarta y continúa con la operación.
Requisitos previos
- Registrar una aplicación web de página única.
- Crear una conexión de base de datos.
- Registrar la API. Cree dos alcances:
view:balanceytransfer:funds. - Habilitar MFA para usar notificaciones push.
Crear una Action
transfer:funds. Vaya a Dashboard > Actions > Flujos y cree una Action con el siguiente contenido:
- La variable
CLIENTS_WITH_MFAcontiene los de las aplicaciones a las que quiere aplicar esta Action. Puede quitar esto (y la condiciónifque aparece a continuación) si no lo necesita. - La propiedad
event.transaction.requested_scopescontiene todos los alcances solicitados en la petición de autenticación. Si incluye el valortransfer:funds, solicitamos MFA estableciendo la propiedadcontext.multifactorcon el valor adecuado. En este caso, solicitamos MFA mediante push.
Configurar la aplicación
-
Con MFA:
export const codeExample1 =
https://{yourDomain}/authorize? audience=https://my-banking-api& scope=openid%20view:balance%20transfer:funds& response_type=id_token%20token& client_id={yourClientId}& redirect_uri={https://yourApp/callback}& nonce=NONCE& state=OPAQUE_VALUE;
-
Sin MFA:
export const codeExample2 =
https://{yourDomain}/authorize? audience=https://my-banking-api& scope=openid%20view:balance& response_type=id_token%20token& client_id={yourClientId}& redirect_uri={https://yourApp/callback}& nonce=NONCE& state=OPAQUE_VALUE;
| Parámetro | Configuración |
|---|---|
audience | Establézcalo en el Identificador de su API (encuéntrelo en Configuración de la API). En este ejemplo, se establece en https://my-banking-api. |
response_type | Establézcalo en id_token token para obtener tanto un ID Token como un token de acceso en la respuesta. |
client_id | Establézcalo en el ID de cliente de su aplicación (encuéntrelo en configuración de la aplicación). |
redirect_uri | Establézcalo en una URL de su aplicación a la que Auth0 deba redirigir al usuario tras la autenticación (encuéntrela en configuración de la aplicación). |
nonce | Establézcalo en una cadena segura que se incluirá en la respuesta de Auth0. Esto se usa para prevenir ataques de repetición de tokens y es obligatorio para response_type=id_token token. |
state | Establézcalo en un valor opaco que Auth0 incluye al redirigir de vuelta a la aplicación. La aplicación debe usar este valor para prevenir ataques CSRF. |
Configurar la API
-
Configure dos endpoints para nuestra API:
GET /balance: para obtener el saldo actualPOST /transfer: para transferir fondos -
Use
Node.jsy varios módulos:- express: agrega el framework web Express.
- jwks-rsa: recupera claves de firma RSA desde un endpoint de JWKS (conjunto de claves web JSON). Con
expressJwtSecret, podemos generar un proveedor que entregue la clave de firma correcta aexpress-jwtsegún elkiddel encabezado del JWT. - express-jwt: permite autenticar solicitudes HTTP mediante tokens JWT en sus aplicaciones de Node.js. Proporciona varias funciones que facilitan el trabajo con JWT.
- express-jwt-authz: comprueba si el token de acceso contiene un scope específico.
-
Instale las dependencias:
npm install express express-jwt jwks-rsa express-jwt-authz --save -
Defina los endpoints de la API, cree una función de middleware para validar el token de acceso y proteja los endpoints con ese middleware. El código de su archivo
server.jsdebería verse como en el siguiente script de ejemplo:
- El endpoint invoca el middleware
checkJwt. 2.express-jwtdecodifica el token y pasa la solicitud, el encabezado y la carga útil ajwksRsa.expressJwtSecret. 3.jwks-rsadescarga todas las claves de firma del endpoint JWKS y comprueba si alguna de ellas coincide con elkiddel encabezado del token de acceso. Si ninguna clave de firma coincide con elkidrecibido, se genera un error. Si hay coincidencia, se pasa la clave de firma correcta aexpress-jwt. 4.express-jwtcontinúa con su propia lógica para validar la firma del token, la expiración, la audiencia y el emisor. 5.jwtAuthzcomprueba si el scope que requiere el endpoint forma parte del token de acceso. Si en el token de acceso faltan los alcances especificados, la solicitud se rechaza con un mensaje de error 403.