Autorización y Autenticación
Según el sujeto que queremos autorizar y autenticar para las peticiones se puede realizar de dos formas parecidas.
Como gRPC por debajo es HTTP al fin y al cabo ambas integraciones utilizan los mismos métodos de autorización y autenticación.
Autenticación de usuarios finales
Se realiza para autenticar usuarios humanos que están interactuando a través de la web. Se utiliza una integración con Azure Active Directory para iniciar sesión con la cuenta de Microsoft y generar un ID token clásico. Con ese token se puede acceder a las llamadas de la API según los permisos que tenga asignados el usuario final.
Los pasos a realizar son los siguientes:
Interactuar con Azure Active Directory para obtener un token JWT de autenticación del usuario. En este paso tendrá que existir algún tipo de aplicación de AAD o cualquier otro método que nos permita redireccionar al inicio de sesión y comprobar los credenciales del usuario.
Llamar a
users.users.Users.Loginpara intercambiar el access token obtenido desde Azure por un token JWT propio de nuestra autenticación. Esta llamada es de las pocas que no necesita autenticación para realizarla. El token de Azure se introduce dentro del cuerpo de la petición y devuelve el token JWT igualmente en el cuerpo de la respuesta.Llamar al resto de APIs utilizando el token Bearer:
Authorization: Bearer TOKEN_JWT_DEL_PASO_2
Autenticación Machine-to-Machine (M2M)
Para autenticar un backend haciendo llamadas automatizadas a otro backend utilizamos unos tokens diferentes. Estos tokens no están relacionados con Azure Active Directory puesto que no hay nada en su protocolo que pueda implementar este tipo de autorizaciones.
Los tokens no van en nombre de ningún usuario sino que por sí mismos tienen asociados unos permisos muy concretos y permiten acceder a dichos recursos exclusivamente. Los sujetos que autentica se denominan "cuentas de servicio" internamente.
Son tokens JWT estáticos, que no varían con el tiempo. Deben por tanto mantenerse en secreto y son solo aptos para la comunicación entre servidores, nunca con un cliente Javascript.
El único paso a realizar para utilizarlo es mandarlo en la cabecera como un token Bearer:
Authorization: Bearer TOKEN_JWT_GENERADO
El token debe generarlo alguien con los permisos adecuados de desarrollador, y una vez generado puede utilizarlo cualquie persona o generalmente máquina que lo posea para acceder a los recursos autorizados libremente desde cualquier parte.
Autorización
Todos los usuarios tienen asignados grupos y dentro de ellos roles que les conceden en conjunto una serie de permisos. Igualmente en el caso de M2M cada token tiene asignados directamente los permisos concretos. En ambos escenarios terminamos teniendo un listado de permisos que son códigos que conceden permiso a llamadas concretas.
Cada llamada de la API tiene un permiso, y solo uno, para poder realizarla. En el caso de que varios sean necesarios como por ejemplo en el caso de editar que por debajo consulta se entiende que el permiso "mayor" de edición ya cubre al de consultar. El acceso a editar una entidad no concede necesariamente permisos de consultar todos sus datos, son permisos separados que se conceden por separado.
En resumen los permisos son cadenas como webinterna.sociedades.view, webinterna.sociedades.edit o webinterna.sociedades.validate que conceden acceso a los recursos.
Hay dos formas sencillas de consultar los permisos que se necesitan para cada llamada:
- Realizar la llamada y consultar el motivo del fallo para ver el error del permiso que falta.
- Consultar el fichero
acl.ymldentro de cada aplicación de backend para ver a qué está asociada cada llamada.
Consultar los permisos de un sujeto
Existen dos llamadas parecidas que permiten consultar los permisos que se utilizan en diferentes necesidades y escenarios.
users.users.Users.Profile
Devuelve información general sobre el sujeto que realiza la llamada, como su nombre de usuario, correo o en este caso lo que nos interesa que es el listado de permisos.
Esta suele ser la llamada que queremos utilizar en la mayor parte de los casos.
users.users.Users.CheckPermissions
Si tenemos ya previamente el identificador de un usuario o de un token M2M podemos utilizarlo para devolver el listado de permisos realizando esta llamada.