Funciones · Inicio de sesión y correo

Inicio de sesión sin Google Cloud.

“Continuar con Google” e inicio de sesión con correo para las personas que usan tu app, sin proyecto de Google Cloud, sin cliente de OAuth y sin claves. Su correo de creación de cuenta sale con el nombre de tu app, desde tu propio dominio en cuanto este se verifica.

Leer la documentaciónConfiguración con un agente

Lo que llama tu agente

  • appAuthConfigure
  • appAuthStatus
  • appAuthEmailConnect
  • appAuthEmailStatus
claude · ~/franks-kitchenejemplo

Let staff sign in with Google

Update(app/login/page.tsx)

1 line · Google button → TOFU_SIGN_IN_URL

Write(app/auth/confirm/route.ts)

new route · verifyOtp for the email link

tofu · appAuthConfigure confirmed: true

configured · Google sign-in, and email sign-in as well

Cómo funciona el inicio de sesión con Google

Tofu habla con Google, para que tu app no tenga que hacerlo.

El intermediario de Tofu en oauth.trytofu.ai tiene un solo cliente de Google y una URL de retorno permanente. Tu app envía el navegador allí; el intermediario inicia la sesión de la persona en el servicio de autenticación de tu propia app: el proyecto de Supabase que está detrás de su base de datos administrada.

Correo de registro

Correo de registro, con el nombre de tu app.

El inicio de sesión con correo se activa en el mismo paso, así que una cuenta siempre tiene una forma de volver a entrar si algún inicio de sesión de terceros deja de estar disponible.

El servicio de autenticación de tu app envía sus correos (confirmation, magic-link, password-reset, invitation, address-change y reauthentication) a través de la configuración de correo de Tofu, con el nombre de tu app como remitente. Sin contraseña SMTP ni proveedor de correo al que registrarse.

Cada mensaje incluye un código de un solo uso además de un enlace, porque los escáneres de correo que abren primero los enlaces gastarían el token antes de que tu usuario pueda usarlo.

Desde tu dominio

Seis registros DNS, ninguno en la raíz de tu dominio.

Cuando tu dominio esté conectado, appAuthEmailConnect crea una identidad de envío para send.frankskitchen.com y publica sus registros, todos bajo send., así que el correo que tu dominio ya recibe no se modifica. Si los eliminas, el dominio queda exactamente como estaba.

TipoNombre, dentro de frankskitchen.comValor
CNAME‹token 1›._domainkey.send‹token 1›.dkim.amazonses.com
CNAME‹token 2›._domainkey.send‹token 2›.dkim.amazonses.com
CNAME‹token 3›._domainkey.send‹token 3›.dkim.amazonses.com
MX 10bounce.sendfeedback-smtp.‹region›.amazonses.com
TXTbounce.sendv=spf1 include:amazonses.com ~all
TXT_dmarc.sendv=DMARC1; p=none; rua=mailto:…

Si la conexión de tu dominio ya tiene la aprobación de Cloudflare, Tofu escribe los registros por su cuenta, sin una segunda aprobación. En cualquier otro caso, los enumera para que los agregues y pide al proveedor de correo que los verifique.

Hasta que el proveedor de correo informe que el dominio está verificado, el correo sigue saliendo desde notify.trytofu.app: la creación de cuentas nunca se detiene mientras esperas.

La única ruta propia de tu app

Un enlace que un escáner no puede gastar.

Cada mensaje enlaza a /auth/confirm en la dirección propia de tu app, y el token solo se gasta cuando tu app llama a verifyOtp. Así, un escáner que abre el enlace primero llega a tu app, no al servicio de inicio de sesión.

Una app nueva creada con la skill /tofu incluye esta ruta; tu agente la escribe. Una app desplegada sin esta ruta permite iniciar sesión de todos modos con el código de cada mensaje.

app/auth/confirm/route.tsnext.js
import { createClient } from '@/lib/supabase/server';
import { NextResponse } from 'next/server';

export async function GET(request) {
  const { searchParams, origin } = new URL(request.url);
  const token_hash = searchParams.get('token_hash');
  const type = searchParams.get('type');
  if (token_hash && type) {
    const supabase = await createClient();
    const { error } =
      await supabase.auth.verifyOtp({ type, token_hash });
    if (!error) return NextResponse.redirect(`${origin}/`);
  }
  return NextResponse.redirect(`${origin}/login?error=link`);
}

Próximamente.

  • La pantalla de consentimiento muestra el nombre de Tofu. Google muestra el nombre verificado del cliente de Tofu con el que se inicia sesión, así que las personas ven “Continuar a Tofu”. Para tener tu propio nombre ahí necesitas un cliente de Google propio, que todavía no está implementado.

  • Solo con una base de datos administrada por Tofu. El inicio de sesión se escribe en el servicio de autenticación que está detrás de la base de datos administrada de tu app. Una app con Clerk, Auth0 o un proyecto de Supabase propio queda exactamente como está.

  • Google y correo, nada más. Los usuarios de tu app no pueden iniciar sesión con GitHub ni con Apple.

  • Correo de inicio de sesión, no los demás correos de tu app. Tofu envía los mensajes de inicio de sesión y de registro; los recibos, las notificaciones y todo lo demás que envíe tu app no pasan por Tofu.

  • Para usar tu propio remitente necesitas tu propio dominio. Primero hay que conectar el dominio a la app; hasta que se verifique, el correo sale desde noreply@notify.trytofu.app.

  • El remitente con tu propio dominio es la parte más reciente. Sus registros, su verificación y el cambio de remitente ya funcionaron de principio a fin en el proyecto de prueba de Tofu, pero todavía no en la app de un cliente.

Pega un prompt. En línea en 10 minutos.

Tu app, su base de datos, tu dominio y tu inicio de sesión: desde el agente que ya usas, en unos 10 minutos.

Empezar gratis