Saltar al contenido
Payment Emulator LabDocumentaciónEntrar a la consola

Funcionamiento interno

Identidad, roles y alcance

Quién pregunta decide qué contiene la respuesta. Ésa es la regla sobre la queestá construido el plano de control, y se aplica en la capa de servicio en vez deruta por ruta, para qu

4 min de lectura

Índice / Index · English

Traducción de docs/en/runtime/identity.md, que es el original. Si discrepan, manda el inglés.

Quién pregunta decide qué contiene la respuesta. Ésa es la regla sobre la que está construido el plano de control, y se aplica en la capa de servicio en vez de ruta por ruta, para que añadir una ruta no pueda ser una forma de olvidarla.

Las superficies de proveedor no entran aquí. Una integración se autentica con la credencial de su propia aplicación; nada de lo de abajo le aplica.

#Dos credenciales, y no son lo mismo

El token de operador Un token de sesión
De dónde sale ADMIN_TOKEN POST /auth/login
Actúa como admin el rol de esa persona
¿Es una persona? No
Para Arranque, CI, la semilla, el servidor de la consola antes de que exista nadie Todo lo que hace un humano

El token de operador actúa como administrador porque es la forma en que llega a existir la primera administradora — pero no es nadie, y todo lo que tiene que pertenecer a una persona lo rechaza. Registrar una aplicación o abrir una cuenta bancaria con él falla con owner_required salvo que diga de quién es.

No hay token de operador por defecto. La API se niega a arrancar sin uno de al menos dieciséis caracteres, porque un emulador que se distribuye con una contraseña conocida es un emulador sin contraseña.

La primera administradora se crea con POST /auth/bootstrap, que abre el token de operador. Alguien tiene que existir antes de que nadie pueda entrar a crear a nadie. npm run setup hace esa llamada como último paso, y npm run admin:create la hace por su cuenta; las dos van por la superficie HTTP y no por la base, así que ninguna puede crear una cuenta que la API habría rechazado.

#Los tres roles

Rol Es Ve
admin Quien opera esta instalación Todo
merchant Un negocio Sus aplicaciones, su dinero, sus cuentas
customer Un comprador Su cartera y sus cuentas — en el checkout, no en la consola

Una persona lleva dos claves opcionales que la atan al libro mayor: walletKey (de dónde sale su dinero cuando paga con saldo) y merchantKey (con qué nombre se le paga). Una clave que no corresponde al rol se rechaza, porque es una clave que nada leería.

#Cómo se guarda una ruta

RolesGuard resuelve la credencial y luego compara el rol de quien llama con el @Roles(...) de la ruta. Ausente significa sólo administradores: el valor por defecto del plano de control tiene que ser el cerrado.

Un @Roles en el método pisa al del controlador, que es como el catálogo de bancos lo puede leer todo el mundo y escribirlo sólo una administradora — elegir dónde está tu cuenta significa ver la lista.

#Cómo se acotan las filas

Guardar una ruta dice quién puede llamarla. No dice nada sobre qué filas vuelven. Eso es una sola expresión por módulo, escrita una vez:

ts
visible(caller): FilterQuery<Entity> {
  if (caller.role === 'admin') return {}
  if (!isPerson(caller)) return {}
  return { owner: caller.user.id }
}

Todo listado y toda lectura de una fila la intersecan. Dos consecuencias que vale la pena decir en voz alta:

  • Un identificador que quien llama no puede ver responde 404, nunca 403. Un 403 sobre un identificador real confirma que es real, y eso convierte un código de error en una forma de enumerar los registros de otros.
  • Un filtro puede estrechar el alcance y nunca ensancharlo. El alcance propio del endpoint se interseca con los filtros de quien llama; no se fusiona con ellos.

#Sesiones

Una sesión es una fila con un token en hash y una caducidad. Presentar una caducada la borra y responde como si nunca hubiera existido, lo que además evita que la tabla críe una cola de filas muertas que nadie barre. Cambiar la contraseña cierra todas las sesiones abiertas con la anterior.

La consola nunca tiene un token de sesión en el navegador: Nitro lo sella en una cookie, y cada petición reenviada se hace como la persona que entró. El token de operador es el respaldo y nada más. Ver la consola.

#Relacionado

Payment Emulator Lab · RonuSoftwareMIT