webauth.dkl
Esta biblioteca de funciones incluida en dkl-web ayuda a realizar tareas comunes relacionadas con la autenticación y autorización.
Recuperar el identificador (token) de sesión
La estructura:
using @http_token_locations
{
@"get":"ids,token"
@"cookie":"__induxsoft_token"
@"form":"session_id"
@"json":"ids,token"
@"bearer":@true
@"header":""
@"custom_auth":@true
}
Permite configurar la ubicación, secuencia de búsqueda y ubicaciones donde puede encontrarse el id de una sesión al invocar a la función auth.token::
.
De manera predeterminada, el código siguiente:
#include "dkli.dkh"
#!
program
{
#include "functions.dkh"
#include "serialize.dkh"
#include "cookies.dkl"
#include "webauth.dkl"
t=auth.token()
}
Asignará a la variable t el token de una sesión que se encuentre disponible según el siguiente orden de búsqueda:
- Se buscará el parámetro de la url (GET) ids, luego
- Se buscará el parámetro de la url (GET) token, luego
- En una cooki denominada '__induxsoft_token', luego
- En un campo en el cuerpo de la solicitud codificado como 'x-www-form-urlencoded' llamado 'session_id', luego
- En el miembro 'ids' del cuerpo de la solicitud si está codificado en JSON, luego
- En el miembro 'token' del cuerpo de la solicitud si está codificado en JSON, luego
- En el encabezado HTTP 'Authorization' según la RFC 6750, luego
- En el encabezado HTTP 'Authorization' todo el texto que haya, si es que lo hay
Si todas las búsquedas anteriores fallan, auth.token se devuelve una cadena vacía
El miembro 'json' de @http_token_locations
puede indicar un campo de un objeto JSON recibido en el cuerpo de una solicitud, así como el miembro 'header' indica un nombre de encabezado http para buscar.
Obtención de privilegios disponibles
La función auth.checkPrivs::&login, &manifest
devuelve una lista de cadenas que representan los privilegios de la estructura de
información de sesión de usuario (parámetro login) que coinciden con los requeridos por el Manifiesto de privilegios en el parámetro de referencia manifest.
Buscar una cadena en una lista
auth.findStrInList::&lista, valor
Devuelve @true, si la cadena indicada en valor está en la lista de cadenas (parámetro lista).
Ejemplo de uso:
#include "dkli.dkh"
#!
program
{
#include "functions.dkh"
#include "serialize.dkh"
#include "cookies.dkl"
#include "webauth.dkl"
ref manifiesto=from.json('
{
"read":[{"user":"admin"}],
"write":[{"team":"administradores"}, {"user":"juan"}]
"other":[{"user":"pedro"}]
}
')
ref login=from.json('
{
"uid":"pedro",
"memberships":
{
"teams":["administradores","gerentes"]
}
}
')
ref privs=auth.checkPrivs(login, maniefiesto)
//privs contendrá la lista de cadenas: 'write' y 'other'
can_write=auth.findStrInList(privs,"write") // can_write=@true
}