Esa tabla users con password_hash ya es un producto aparte.
stwrd te da la entrada completa —OIDC, passkeys, organizaciones, roles, SSO y bitácora— detrás de seis rutas y un SDK. Empiezas sin tarjeta: el plan flex no tiene cuota fija y cuesta CLP 12 por usuario que vuelve.
Sin tarjeta. Sin RUT. CLP 10.000 de saldo para probar esta noche.
import { Stwrd, requirePermission } from "@stwrd/node"; const stwrd = Stwrd.fromEnv(); // resuelve la sesión una vez por petición app.use(stwrd.attach()); // entrada, callback, salida, webhooks… app.use(stwrd.authRouter()); app.get("/facturacion", requirePermission(stwrd, "billing:read"), (req, res) => res.json(req.stwrd.user)); // El permiso vino de la organización a la que // entró la persona: nunca escribiste roles.
- Seis rutas
- La sesión vive en tu servidor; el token nunca toca el navegador
- Estándares
- OIDC con PKCE, rotación de refresh, JWKS por tenant
- Tres SDK
- Python, Node y React. Mismas rutas, mismas respuestas
- Sin sorpresas
- Toda fila lleva su tenant. No es convención: es restricción
Nadie decide construir un IdP. Se llega igual, un ticket a la vez.
La primera versión son dos horas: una tabla, un hash, una cookie. El problema es lo que viene después, que nunca aparece en la estimación y siempre aparece en el sprint.
Lo que le crece a la tabla users
- +Recuperar la contraseñaToken de un solo uso, que expira, que no se puede reusar aunque lleguen dos peticiones a la vez.
- +«¿Ese correo existe?»El registro y la recuperación tienen que responder idéntico exista o no la cuenta. Byte a byte.
- +Segundo factorTOTP con su ventana, códigos de respaldo de un solo uso, y la ceremonia WebAuthn si quieres passkeys.
- +Cerrar sesión de verdadRevocar la sesión, su familia de refresh y avisarle a las otras aplicaciones. Hoy borras una cookie.
- +Organizaciones e invitacionesEl día que un cliente tenga dos personas: miembros, roles, invitación que caduca, quién puede invitar.
- +SAMLMetadata, firma, ACS, relojes desfasados. Aparece en la reunión donde estabas cerrando el contrato.
- +Bitácora que aguante una auditoríaAppend-only de verdad, no un
INSERTque alguien puede olvidar en la ruta nueva.
Lo que escribes en cambio
- ✓Dos líneas para montar
/auth/*Entrada, callback, salida, sesión y webhooks. La sesión se resuelve una vez por petición. - ✓Un guard por ruta
requirePermission(stwrd, "billing:read"). El permiso viaja en el token. - ✓Cero pantallas de auth en tu repoEntrar, registrarse, recuperar, enrolar factor y administrar la cuenta ya están hechas y traducidas.
- ✓Passkeys sin tocar WebAuthnY sin costo: el segundo factor es gratis en los tres planes, porque cobrarlo es regalar el plan de entrada al atacante.
- ✓El SSO llega cuando lo pidenSe enciende por organización el día de la reunión, no el trimestre siguiente.
- ✓La bitácora la escribe un middlewareNinguna ruta puede olvidarse de registrar: no es disciplina, es dónde vive el código.
- ✓Y si te arrepientes, exportasUsuarios, hashes, organizaciones, roles y membresías, documentado, con lo que no se puede llevar dicho de frente.
Prepago, sin registrar tu tarjeta y sin sorpresas a final de mes.
Cargas saldo, el consumo se descuenta en el instante en que ocurre y nunca te llega una cuenta a fin de mes por algo que no viste venir. Y si el saldo se está acabando te avisamos antes — cuando quedan siete días de autonomía al ritmo que vienes gastando, y otra vez cuando quedan dos. Si aun así llega a cero, se dejan de crear cuentas nuevas pero quien ya tiene la suya sigue entrando, y tienes treinta días para recargar antes de que el servicio se corte. Recargar revierte todo en el acto.
| Tu marca: logo, colores y sin el pie de stwrd | CLP 600 / día |
|---|---|
| Roles y permisos propios | CLP 250 / día |
| Exigir segundo factor | CLP 250 / día |
| Sesiones configurables | CLP 150 / día |
| Bitácora de 30 días | CLP 150 / día |
| Bitácora de 90 días | CLP 400 / día |
| Conexión SAML, cada una | CLP 1.500 / día |
El cruce está en 2.000 usuarios retenidos. Te lo decimos nosotros.
Es aritmética, no una conversación de ventas: por debajo de dos mil, flex cuesta menos que pro; exactamente en dos mil cuestan lo mismo; por encima, pro es más barato. El cruce de pro a max está en seis mil.
Quédate en flex. Estás pagando dos tercios de la cuota fija que ni siquiera contrataste.
El punto de indiferencia. Desde acá, pro trae incluido lo que en flex venías comprando por día.
El segundo cruce. Max además trae una conexión SAML y bitácora de 90 días.
Tu primer cliente grande manda siempre las mismas seis preguntas.
Nunca son sobre tu producto: son sobre si su gente de TI y de cumplimiento puede convivir con él. Y llegan después de que la demo salió bien, cuando lo único que falta es firmar. Las seis vienen resueltas.
«Entramos con nuestro propio proveedor de identidad.»
SAML por organización, no por tenant: su conexión, su certificado, su metadata. La clínica de al lado sigue entrando con contraseña.
«Nuestros administradores manejan a nuestra gente.»
Una consola delegada en /my-org: miembros, invitaciones, roles, dominios y su propia bitácora. Su administrador deja de ser un ticket en tu soporte.
«Muéstrennos quién accedió a qué.»
Un registro que solo agrega, escrito por un middleware y nunca por un endpoint que alguien pueda olvidar. Se lee por API en los tres planes; el plan cambia cuántos días dura.
«Cuando desvinculamos a alguien, queda fuera.»
El cierre de sesión llega por canal trasero hasta tu aplicación, no solo a la pestaña del navegador. La sesión y su familia de refresh mueren juntas, en una sola sentencia.
«Nuestros roles no son los suyos.»
Roles y permisos definidos por organización y transportados en el token: tu código pregunta requirePermission y no vuelve a escribir una tabla de roles.
«¿Qué pasa si nos vamos?»
Una exportación documentada —usuarios, hashes de contraseña, organizaciones, roles, membresías— con la lista honesta de lo que no se puede llevar: passkeys, secretos TOTP y sesiones vivas.
Un tenant. Tantas organizaciones como clientes tengas.
Si tu producto se le vende a empresas, cada cliente de tu cliente es una organización: sus miembros, sus roles, su marca en la pantalla de entrada, su SSO si lo tiene. Ilimitadas en los tres planes — le sacamos el medidor, porque cobrar por organización es ponerle impuesto justo al crecimiento que quieres.
Una persona puede pertenecer a varias. El token dice a cuál entró, y los permisos viajan con él.
Tres clientes, tres formas de entrar, una sola integración. La consulta de una persona no necesita SAML, y el hospital no acepta otra cosa.
Todos parten en flex. Te cambias cuando la cuota fija te salga más barata.
Precios en pesos chilenos. Sin costo de instalación, sin mínimo de asientos, sin contrato anual obligatorio.
- Saldo prepago, descontado en el instante
- CLP 10.000 para empezar, sin tarjeta ni RUT
- Organizaciones y aplicaciones ilimitadas
- Passkeys, TOTP y códigos de respaldo
- Tu marca, roles propios, SAML y bitácora larga: por día, desde el saldo
- Todo lo de flex, incluido en vez de por día
- Tu marca en las pantallas, y el pie de stwrd apagable
- Tus propios roles y permisos
- Bitácora de 30 días
- Conexiones SAML a CLP 38.000 cada una
- Todo lo de pro
- Una conexión SAML incluida
- Bitácora de 90 días
- Soporte prioritario con SLA
- Conexiones SAML adicionales a CLP 28.000
Anual, si lo quieres: pagas diez meses en vez de doce, te llevas 25% de descuento en cada usuario retenido y congelas la lista de precios por un año. Sin cobro de salida de ningún tipo —ni multa, ni devolución del descuento—: si te vas en el mes tres, simplemente dejas de pagar.
Del clic a tu propia pantalla de entrada.
Sin llamada de ventas, sin formulario para pedir un sandbox, sin esperar a un ejecutivo de cuenta.
Creas tu tenant
Con GitHub, Google o un correo. El nombre de tu organización es lo que va a ver tu gente en la pantalla de entrada.
Aseguras la cuenta
Una passkey, códigos de respaldo que se muestran una sola vez y un correo de recuperación distinto del de la cuenta.
Te llevas las credenciales
Emisor, client id y secreto, más el fragmento para tu framework — e instrucciones que tu agente de código puede seguir solo.
Pruebas la entrada
Tu pantalla, en tu URL de retorno, con el saldo ya cargado. Subes de plan desde adentro el día que la aritmética lo pida.
Un jueves a las 20:00 alcanza.
Creas el tenant, pegas dos líneas, y tu login anda. Sin tarjeta, sin RUT y con CLP 10.000 de saldo: el primer usuario retenido te cuesta doce pesos.