# 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.



