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 de regalo para probarlo.
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.
Le pasas tu configuración a Claude Code y vuelve con el login puesto.
No es una promesa de marketing sobre inteligencia artificial: son dos cosas concretas que el servidor genera y que tu agente lee sin que tú traduzcas nada.
Tu configuración real, no un ejemplo
- ✓El bloque de instrucciones de TU aplicaciónEmisor,
client_id, métodos de entrada activos hoy, framework y URIs de retorno declaradas. Generado de tu tenant, no copiado de una guía. - ✓Un paso de verificación que el agente corre soloTermina comprobando que el login funciona de verdad, en vez de dejarte una pantalla que compila y no entra.
- ✓Sin el secreto adentroEl bloque nunca lleva tu
client_secret: eso lo pones tú en tus variables de entorno, no en el contexto de un agente. - ✓Y un
llms.txtgenerado del esquema vivoLa superficie de integración descrita para un agente, sacada del OpenAPI que corre. No se desactualiza porque no está escrita a mano.
La parte que sale mal sola
- +Leer la documentación de OIDCSi integrar exige entender el protocolo, el diseño falló. Tu agente tampoco tiene que entenderlo.
- +Adivinar la URI de retornoLa causa número uno de «me da
invalid_redirect_uriy no sé por qué». Viene declarada en el bloque. - +Descubrir a mano qué métodos tienes prendidosEl bloque dice los que están activos HOY en tu tenant, no los que el producto ofrece.
- +Pegar un ejemplo de otra versiónLo que se genera sale del servicio que estás usando, no de un blog de hace dos años.
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. El cliente 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. El ingeniero que trabaja solo no necesita SAML, y la empresa de 200 no acepta otra cosa.
Trae tu servidor, o usa el nuestro y paga por mensaje.
Tu producto va a mandar correos de verificación, códigos por SMS y avisos por WhatsApp. Las dos formas de resolverlo están soportadas, y la elección no es para siempre: se cambia declarando credenciales, o quitándolas.
Declaras tus credenciales
- ✓Tu SMTP, tu cuenta de Twilio, tu número de WhatsAppLos mensajes salen con tu remitente y tu reputación de envío, no la nuestra.
- ✓Le pagas a tu proveedor, no a nosotrosEse mensaje no pasa por nuestro medidor: no aparece en tu cuenta de stwrd.
- ✓Y puedes hacerlo por organizaciónUn cliente grande manda con su propio dominio y el resto sigue con el tuyo. Se configura por nivel, no todo o nada.
No declaras nada y se cobra por unidad
- +Funciona desde el primer minutoSin verificar un dominio, sin abrir cuenta en Twilio, sin esperar la aprobación de Meta para WhatsApp.
- +Precio por mensaje, a la vistaEl SMS y el WhatsApp cuestan distinto según el país de destino, y eso se ve antes de enviar, no en la factura.
- +En flex se descuenta del saldoComo todo lo demás: en el instante, sin cuenta a fin de mes.
Todos parten en flex. Te cambias cuando la cuota fija te salga más barata.
Precios en pesos chilenos y netos: al cliente en Chile se le suma el IVA de 19%, y la venta al exterior es exportación y no lo lleva. Sin costo de instalación, sin mínimo de asientos, sin contrato anual obligatorio.
- Saldo prepago, descontado en el instante
- CLP 10.000 de regalo para probar, 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 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.
Tu login, en veintitrés líneas.
Ésas son las de la aplicación de ejemplo entera, contadas por un test que corre en cada compilación. Creas el tenant, le pasas la configuración a tu agente y tu login anda. Sin tarjeta, sin RUT y con CLP 10.000 de saldo para probarlo.