Autenticación
Tú firmas un JWT que dice quién es el visitante. Vatio lo verifica y se lo pasa a tus herramientas. Eso es toda la autenticación — hay un solo mecanismo, en todos los canales.
Vatio guarda solo tu clave pública, así que puede revisar un token pero nunca emitir uno. Tu backend sigue siendo lo único que puede decir quién es alguien.
Configúralo
Genera el par de claves:
vatio auth --new-keyEso escribe dos archivos, y van a lugares distintos.
identity.pub se queda en el workspace. Es una clave pública, así que se commitea como cualquier otro archivo y vatio.yml la nombra:
# vatio.yml
auth:
public_key: identity.pubidentity.pem va a tu propio backend, como secreto — una variable de entorno, o el almacén de credenciales que ya uses. Tu backend es lo que firma, así que es lo único que alguna vez la necesita. Cárgala y después borra el archivo del directorio del workspace; ahí no tiene ninguna función.
# variable de entorno
VATIO_IDENTITY_PRIVATE_KEY="$(cat identity.pem)"
# o credenciales de Rails
bin/rails credentials:edit # vatio: { identity_private_key: "..." }Nunca hagas vatio secrets set de la clave privada. Ese almacén lo lee Vatio, para que tus herramientas puedan llamar a tu API. Una clave privada ahí le permitiría a Vatio emitir tokens por tus usuarios en vez de solo revisarlos, que es precisamente lo único que este diseño existe para prevenir. Vatio guarda la mitad pública y nada más.
Marca cada herramienta que necesita un usuario con sesión:
# tools/my_bookings.yml
access: privateLas herramientas sin access: private son públicas y corren para cualquiera.
El token
Fírmalo con identity.pem usando RS256:
| Claim | Requerido | Valor |
|---|---|---|
sub | sí | El id de tu usuario. Se convierte en $auth.subject. |
aud | sí | El slug de tu workspace, exacto. |
exp | sí | Segundos Unix. Mantenlo corto — Vatio lo revisa en cada llamada a herramienta. |
name | no | Llena el nombre del contacto. |
email | no | Llena el email del contacto. |
phone_number | no | Llena el teléfono del contacto. |
Cualquier otro claim que agregues llega como $auth.claims.<name>.
# Ruby
JWT.encode(
{ sub: user.id.to_s, aud: "acme", exp: 1.hour.from_now.to_i,
name: user.name, email: user.email },
OpenSSL::PKey::RSA.new(ENV["VATIO_IDENTITY_PRIVATE_KEY"]), "RS256"
)// Node (jsonwebtoken)
jwt.sign(
{ sub: String(user.id), name: user.name, email: user.email },
process.env.VATIO_IDENTITY_PRIVATE_KEY,
{ algorithm: "RS256", audience: "acme", expiresIn: "1h" }
);# Python (PyJWT)
jwt.encode(
{"sub": str(user.id), "aud": "acme",
"exp": int(time.time()) + 3600, "name": user.name},
os.environ["VATIO_IDENTITY_PRIVATE_KEY"], algorithm="RS256",
)aud es requerido porque una firma prueba quién firmó, no para qué. Sin él, cualquier otro JWT que firmes con la misma clave — un reseteo de contraseña, un enlace de descarga — sería aceptado acá como identidad.
Sigue: cómo llega el token a Vatio en cada canal, y qué ve una herramienta privada cuando llega.
