Flujo de Autorización (Acceso a Recursos Protegidos)
Este flujo describe cómo la aplicación cliente (SPA JavaScript) utiliza los tokens obtenidos en el flujo de autenticación OIDC (específicamente, el access_token
) para acceder a la API protegida.
Asumimos que el usuario ha completado correctamente el flujo de autenticación y que el cliente ha obtenido y almacenado un access_token
válido y vigente (esto lo gestiona automáticamente oidc-client-ts
).
1. Preparación de la Solicitud en el Cliente
- El cliente, la aplicación JavaScript (SPA), debe realizar una llamada a un endpoint protegido en la API (el Servidor de Recursos).
- Antes de enviar la solicitud HTTP (GET, POST, PUT, DELETE, etc.) al endpoint de la API, el cliente recupera el
access_token
almacenado localmente. Esto se realiza generalmente llamando auserManager.getUser()
después de que el usuario se haya autenticado y cargado. 3. El cliente incluye elaccess_token
en la cabecera HTTPAuthorization
. El formato estándar es usar el esquemaBearer
seguido de un espacio y el token.
Ejemplo de cómo se vería la solicitud HTTP saliente del navegador (usando la API Fetch):
const user = await userManager.getUser(); // Obtener el usuario almacenado y sus tokens
if (user && user.access_token) {
const url = 'https://localhost:5001/api/protecteddata'; // URL del punto final de la API protegida
fetch(url, {
method: 'GET', // O POST, PUT, DELETE, etc.
headers: {
'Authorization': `Bearer ${user.access_token}`, // Incluir token de acceso
'Content-Type': 'application/json' // Si se envía un cuerpo JSON
}
})
.then(response => {
if (!response.ok) {
// Gestionar errores (p. ej., 401 No autorizado, 403 Prohibido)
console.error('Error al acceder a la API:', response.status);
if (response.status === 401) {
// El token podría haber expirado o no ser válido.
// oidc-client-ts con automaticSilentRenew debería gestionar esto,
// pero si falla, podría ser necesario redirigir al inicio de sesión.
}
throw new Error(`Error HTTP! estado: ${response.status}`);
}
devuelve response.json(); // O response.text() si no es JSON
})
.then(data => {
console.log('Datos de la API:', data);
// Procesar los datos recibidos de la API
})
.catch(error => {
console.error('Hubo un problema con la solicitud de obtención:', error);
// Gestionar errores de red u otros errores
});
} else {
console.warn('Usuario no autenticado o token de acceso no disponible.');
// Podría redirigir al inicio de sesión si no hay usuario
// userManager.signinRedirect();
}
La parte crucial es la cabecera Authorization: Bearer [obtained_access_token]
.
2. Recepción y validación en la API (Servidor de recursos)
- La API (
TFST.API
) recibe la solicitud HTTP entrante. - El middleware de autenticación y autorización configurado en la API intercepta la solicitud antes de que llegue a la lógica de negocio (controladores/endpoints específicos).
- Este middleware:
- Extrae el token del encabezado
Authorization
. - Realiza la validación
access_token
. Para un JWT (JSON Web Token) emitido por OpenIddict, esto generalmente implica: - Verificar la firma del token utilizando la clave pública o el certificado de AuthServer OpenIddict para garantizar que el token no haya sido manipulado.
- Verificar el emisor (notificación
iss
) para garantizar que el token provenga del AuthServer esperado. * Verificar la audiencia (declaraciónaud
) para garantizar que el token esté destinado a esta API específica (la declaraciónaud
del token debe coincidir con un identificador configurado para la API como recurso en OpenIddict). - Verificar la fecha de caducidad (declaración
exp
) para garantizar que el token siga siendo válido. - Otras validaciones como
nbf
(Not Before) eiat
(Issed At). - Si el token es válido, el middleware autentica al usuario asociado con él en el contexto de la solicitud HTTP actual. Las declaraciones del token (como
sub
,name
,email
,roles
, etc.) se convierten en las identidades y los principales del usuario, disponibles para la lógica de negocio de la API.
- Tras la autenticación (validación del token), el middleware de autorización de la API verifica si el usuario autenticado (según las declaraciones del token) tiene los permisos necesarios para acceder al endpoint solicitado. Esto podría basarse en ámbitos, roles o políticas de autorización más granulares definidas en la API (p. ej., usando los atributos
[Authorize(Roles = "Admin")]
o[Authorize(Policy = "RequiresApiAccess")]
en los controladores).
3. Resultado de la autorización
- Si el token es válido y el usuario está autorizado:
- La solicitud supera las comprobaciones de autenticación y autorización.
- La solicitud llega al controlador/método de acción de la API.
- La lógica de negocio de la API se ejecuta, procesa la solicitud y devuelve los datos o la respuesta correspondientes al cliente (p. ej., estado HTTP 200 OK).
- Si el token no es válido o el usuario no está autorizado:
- El middleware de autenticación o autorización intercepta la solicitud.
- La API rechaza la solicitud antes de que llegue a la lógica de negocio. * La API devuelve un código de estado HTTP de error al cliente:
401 No autorizado
: Generalmente indica que la autenticación falló (el token falta, no es válido, ha caducado, la firma es incorrecta, etc.).403 Prohibido
: Generalmente indica que el usuario está autenticado (el token es válido), pero no tiene los permisos necesarios (roles/ámbitos/reclamos) para acceder a este recurso en particular.
4. Renovación y reintento (Gestionado por el cliente OIDC TS)
- Si el cliente recibe un
401 No autorizado
(por ejemplo, porque elaccess_token
acaba de caducar),oidc-client-ts
(siautomaticSilentRenew
está habilitado) intentará renovar automáticamente elaccess_token
en segundo plano utilizando elrefresh_token
(si se obtuvo). - Si la renovación se realiza correctamente,
userManager
se actualizará con el nuevoaccess_token
. La aplicación cliente puede entonces reintentar la llamada a la API con el nuevo token. - Si la renovación falla (por ejemplo, si el token
refresh_token
ha expirado o ha sido revocado),oidc-client-ts
puede activar un evento (accessTokenExpiring
,accessTokenExpired
) y la aplicación cliente deberá redirigir al usuario para que se vuelva a autenticar por completo (regrese al paso 2.1 del flujo de autenticación).
Este flujo de autorización es la forma estándar en que las SPA acceden a las API protegidas mediante JWT emitidos por un servidor OAuth 2.0/OIDC.