Saltar a contenido

Autenticación con la base de datos

Los usuarios, los roles, los permisos y las reglas de RLS viven en un schema auth de tu propia base de datos, y los tokens los firma la API.

Montarla

pip install 'tai-api[database]'
tai-api auth init                    # elige Database
tai-sql push -s auth --with-feed     # crea el schema y el usuario admin
tai-api rbac push                    # lleva rbac/main.py a sus tablas

auth init pregunta:

Pregunta Clave del .taiapiproject Por defecto
Tiempo de expiración del token (minutos) auth.config.expiration 30
¿Habilitar control de sesiones? auth.config.session_management sí
¿Habilitar expiración de contraseñas? auth.config.password_expiration no
Días de validez de una contraseña auth.config.password_expiration_days 90

y crea schemas/auth.py en el proyecto de tai-sql. Ese fichero es tuyo a partir de ahí: una versión nueva de tai-sql no lo actualiza.

Lo que necesita en ejecución

Variable Qué es
SECRET_KEY La clave con la que se firman los tokens. Sin ella la API no arranca. El nombre se cambia con secret_key_name
MAIN_DATABASE_URL La base de datos, la del datasource() de schemas/auth.py
ADMIN_PWD La contraseña del usuario admin que crea el feed. Sin ella, admin

Cómo se comporta

  • Una sesión por usuario (session_management). Un login nuevo cierra la sesión anterior, y cada petición comprueba contra la base de datos que el token es de la sesión vigente y que el usuario sigue activo. Cuesta una consulta por petición, que es el precio de poder revocar un token; sin ella, el token vale hasta que caduca.
  • Cambiar la contraseña o desactivar a un usuario cierra sus sesiones.
  • Las credenciales incorrectas responden lo mismo para un usuario que no existe que para una contraseña mala: distinguirlo permitiría averiguar qué usuarios hay. La contraseña se verifica en el mismo tiempo exista o no el usuario.
  • Las contraseñas se guardan hasheadas (bcrypt): no se pueden leer, solo verificar.
  • La expiración de contraseñas: con ella activa, un usuario con la contraseña caducada no puede entrar hasta que un administrador se la cambie, y cambiarla la renueva.

Sin la sesión con cookie, el refresh token viaja en el cuerpo y dura cuatro veces lo que el access.

Los realms

Un realm es un espacio de usuarios y permisos: main por defecto. En modo Database son filas de la tabla realm; tai-api rbac push crea las que tienen su rbac/<realm>.py y no existen.