# 9.1 Json Web Tokens

Un Json Web Token es una cadena codificada en base64 formada por 3 partes las cuales están separadas por un punto:

1. **Header**: Indica el algoritmo y tipo de token
2. **Payload**: Datos del usuario, caducidad del token, roles del usuario
3. **Signature**: Incluye una llave secreta para validar el token

Para poder generar los tokens necesitamos:

* **LLave secreta**: Es una llave que permite validar la información del token
* **Issuer**: Es quien genera el token, por lo general es la URL del servidor que contiene los servicios
* **Audience**: Sirve para identificar quienes pueden conectarse a tus servicios, por ejemplo quieres que tus servicios solo sean accesibles con la audiencia www.tusistema.com

La información adicional que guardas en el token como el id del usuario se conoce como Claims, la lista de claims disponibles es:

Los principales claims son los siguientes: [https://learn.microsoft.com/es-es/dotnet/api/system.identitymodel.claims.claimtypes?view=netframework-4.7.2](https://learn.microsoft.com/es-es/dotnet/api/system.identitymodel.claims.claimtypes?view=netframework-4.7.2)

| Tipo                                                                                                                                                                                     | Descripción                                             |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| [DateOfBirth](https://docs.microsoft.com/es-es/dotnet/api/system.identitymodel.claims.claimtypes.dateofbirth?view=netframework-4.7.2#System_IdentityModel_Claims_ClaimTypes_DateOfBirth) | Fecha de Nacimiento del usuario                         |
| [Email](https://docs.microsoft.com/es-es/dotnet/api/system.identitymodel.claims.claimtypes.email?view=netframework-4.7.2#System_IdentityModel_Claims_ClaimTypes_Email)                   | Correo electrónico del usuario                          |
| [Country](https://docs.microsoft.com/es-es/dotnet/api/system.identitymodel.claims.claimtypes.country?view=netframework-4.7.2#System_IdentityModel_Claims_ClaimTypes_Country)             | País del usuario si deseas restringir opciones por país |
| [Sid](https://docs.microsoft.com/es-es/dotnet/api/system.identitymodel.claims.claimtypes.sid?view=netframework-4.7.2#System_IdentityModel_Claims_ClaimTypes_Sid)                         | Puede guardar un id de seguridad                        |

Adicional a estos claims puedes agregar los tuyos, como por ejemplo clave del cliente.

Puedes ver la documentación sobre los JWT Tokens aquí

{% embed url="https://jwt.io" %}

### Tipos de seguridad

.Net cuenta con diversas maneras para validar tus tokens los principales son los siguientes:

* **Basada en roles**: Permite validar el acceso a tus servicios de acuerdo al tipo de usuario, por ejemplo vendedor, administrador, cliente cada uno tiene acceso a diferente información.
* **Basada en directivas**: Se valida de acuerdo a alguna regla de negocio propia, como por ejemplo que debe ser mayor a 18 años para acceder al servicio.
* **Personalizada**: Puedes agregar tus propias reglas. Por ejemplo si tu aplicación permite cargar documentos, los documentos solo deben estar disponibles para el usuario que subió el archivo.

Puedes ver la documentación oficial de Microsoft&#x20;

[https://learn.microsoft.com/es-es/aspnet/core/security/authorization/introduction?view=aspnetcore-9.0](https://learn.microsoft.com/es-es/aspnet/core/security/authorization/introduction?view=aspnetcore-9.0)

Puedes ver también el video del evento build 2017 de Microsoft en inglés donde explican los diferentes tipos de seguridad

{% embed url="https://www.youtube.com/watch?v=6LzmEOvzt1A" %}
