# Devkron Basic Web Layer (BWL)
Habilita un modelo coherente de acceso a los recursos del sitio Web.
Se basa en el Resourse Access Authorization Model (RAAM) de Induxsoft
## Componentes
* Proveedor de identidades (IDP). Verifica la validez de un identificador (token) de sesión y recupera información del usuario.
* API de Operaciones del Sistema de Archivos (FSO API). Proporciona un mecanismo para gestionar privilegios y metadatos, así como realizar operaciones sobre los archivos y carpetas del sitio Web.
* Controlador de autorizaciones (auth.dk). Autoriza el acceso a los recursos y reúne información de sesión apoyándose en el IDP y la API de FSO.
## Flujo de autorización
Aprovechando el modelo del flujo de la solicitud HTTP de Devkron, el programa auth.dk provisto en la BWL agrega el miembro ```session``` al objeto ```@http_context``` con información del usuario y el recurso solicitado.
auth.dk cargará el programa del IDP que deberá agregar al miembro ```session``` el campo ```user``` si es posible recuperar un token de sesión válido.
De manera predeterminada, auth.dk buscará el programa del IDP en ```/_protected/idp/default.dk```
Luego, auth.dk con el apoyo de FSO recuperará información del archivo o carpeta indicada (por el URI) y la pondrá a disposición a través del campo ```resource``` de ```session```
Si no hay un token de sesión disponible en la solicitud o éste no es válido, no existirá el campo ```user``` en ```session```.
Si el token recibido ha podido comprobarse, además del miembro ```user``` en session, se agregará el campo ```authforuser``` al miembro ```resource``` de ```session``` con la lista de privilegios del recurso que han podido verificarse que tiene disponibles el usuario sobre el recurso.
El siguiente bloque en JSON ilustra el contenido del objeto ```@http_context``` con el miembro ```session``` anexado:
```
{
"request":{...},
"response":{...},
"session": {
"user": {
"ids": "ce59246a401441af8d1735bbb2764ec6",
"uid": "C248E9BAF92411E5AA35C04A000418D7",
"name": "ADMIN",
"multifactor": 0,
"verified_email": 0,
"verified_mobile": 1,
"memberships": {
"workspaces": [
"0f251c4fa95c4a579ed1c2f8e75e1a4c"
],
"teams": [
"87b65838ecde4ce4b88c5328d27ad4e5"
],
"roles": [
"a200c6efd6654d7d91c545400e9f4267"
]
}
},
"resource": {
"type": "folder",
"fullpath": "/",
"path": null,
"name": "",
"creation": "2022-04-01T06:06:03",
"lastaccess": "2022-04-16T08:56:17",
"lastwrite": "2022-04-16T08:56:17",
"privileges": {
"admin": [
{
"user": "C248E9BAF92411E5AA35C04A000418D7"
}
]
},
"priv_inherited": 0,
"authforuser": [
"admin"
]
}
}
}
```
## Acerca de los 4 Privilegios básicos
BWL prevé la existencia de 4 privilegios básicos:
* read - Solo lectura, este es el único privilegio que NO DEBE establecer explícitamente para que se permita al servidor responder contenido sin requerir autenticación.
* write - Escritura
* plus - Propósito general, usualmente empleado para elevar a otro privilegio, por ejemplo read+plus sería "casi" equivalente a write
* admin - Administrador del sistema (sin restricciones).
auth.dk únicamente verifica el privilegio 'read', la validación de los demás corre a cargo de la API FSO o se deja bajo la responsabilidad de otras capas de aplicación.
Por convención impuesta por la BWL y compatibilidad, si se definen privilegios adicionales para operaciones específicas, debe proporcionarse un *Mapa de resolución de privilegios* para poder resolver siempre cualquier privilegio personalizado definido por capas superiores en términos de los 4 privilegios básicos. Un ejemplo es FSO API que define privilegios propios, pero también a la función ```dklfso.authOp``` que contiene la lógica del mapa de resolución de privilegios.