Autenticación de usuario
Configura Google OAuth y login con email paso a paso
Autenticación de usuario
Configura login con Google OAuth y email/password en tu SaaS. Al terminar tendrás:
- Login con Google (un click)
- Registro con email y password
- Verificación de email automatica
- Sesiónes persistentes de 30 dias
EmpiezaTuSaaS usa Better Auth como framework de autenticación. Consulta su documentacion oficial para opciones avanzadas como 2FA, magic links o passkeys.
Prerequisito: tener la base de datos configurada y el proyecto funcionando (npm run dev).
Paso 1: Crea un proyecto en Google Cloud
Accede a Google Cloud Console
- Ve a console.cloud.google.com
- Inicia sesión con tu cuenta de Google
- Click en Select a project > New Project
- Nombre:
Mi SaaS(o el nombre de tu app) - Click Create
Configura la pantalla de consentimiento OAuth
- Ve a APIs & Services > OAuth consent screen
- Selecciona External y click Create
- Rellena los campos obligatorios:
- App name: El nombre de tu SaaS
- User support email: Tu email
- Developer contact: Tu email
- Click Save and Continue
- En Scopes, click Add or Remove Scopes
- Selecciona
emailyprofile, luego Update - Click Save and Continue hasta terminar
Mientras tu app este en modo Testing, solo los emails que anadiste como test users pueden iniciar sesión. Para permitir cualquier cuenta de Google, publica la app.
Crea las credenciales OAuth
- Ve a APIs & Services > Credentials
- Click Create Credentials > OAuth client ID
- Tipo de aplicación: Web application
- Nombre:
Mi SaaS Web - Configura las URLs:
Authorized JavaScript origins:
http://localhost:3000
Authorized redirect URIs:
http://localhost:3000/api/auth/callback/google- Click Create
- Copia el Client ID y Client Secret
Guarda estas credenciales en un lugar seguro. Las necesitarás en el siguiente paso.
Paso 2: Configura las variables de entorno
Añade las credenciales de Google a tu archivo .env:
# Google OAuth
GOOGLE_CLIENT_ID="tu-client-id.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET="GOCSPX-tu-client-secret"Estas variables las consume lib/auth/index.ts, que ya viene configurado con el proveedor de Google:
socialProviders: {
google: {
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
},
},Paso 3: Entiende la configuración de Better Auth
El archivo lib/auth/index.ts configura toda la autenticación del boilerplate. Consulta las opciones de configuración de Better Auth para ver todas las posibilidades.
import { betterAuth } from "better-auth";
import { prismaAdapter } from "@better-auth/prisma-adapter";
import { multiSession, admin } from "better-auth/plugins";
import { db } from "@/lib/db";
export const auth = betterAuth({
database: prismaAdapter(db, {
provider: "postgresql",
}),
baseURL: process.env.BETTER_AUTH_URL || siteConfig.url,
secret: process.env.BETTER_AUTH_SECRET!,
emailAndPassword: {
enabled: true,
requireEmailVerification: true,
},
socialProviders: {
google: {
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
},
},
plugins: [
multiSession({ maximumSessions: 5 }),
admin({ defaultRole: "user", adminRoles: ["admin"] }),
],
session: {
expiresIn: 60 * 60 * 24 * 30, // 30 dias
updateAge: 60 * 60 * 24, // Refresh cada 24h
},
});Que incluye:
| Funcionalidad | Descripción |
|---|---|
emailAndPassword | Login con email y password, con verificación obligatoria |
socialProviders.google | Login con Google OAuth |
multiSession | Hasta 5 sesiónes simultáneas por usuario |
admin | Sistema de roles (user / admin) |
session | Sesiónes de 30 dias con refresh automatico |
Paso 4: El cliente de autenticación
En el frontend, el archivo lib/auth/client.ts exporta los hooks y funciones que necesitas. Consulta la referencia del cliente para ver todos los métodos disponibles.
import { createAuthClient } from "better-auth/react";
import { multiSessionClient, adminClient } from "better-auth/client/plugins";
export const authClient = createAuthClient({
baseURL: process.env.NEXT_PUBLIC_APP_URL || siteConfig.url,
plugins: [multiSessionClient(), adminClient()],
});
export const {
signIn,
signOut,
signUp,
useSession,
getSession,
} = authClient;Usar en componentes
import { signIn } from "@/lib/auth/client";
// Login con Google (redirige al flujo OAuth)
await signIn.social({
provider: "google",
callbackURL: "/dashboard",
});import { signIn } from "@/lib/auth/client";
await signIn.email({
email: "usuario@ejemplo.com",
password: "password123",
callbackURL: "/dashboard",
});"use client";
import { useSession } from "@/lib/auth/client";
export function UserGreeting() {
const { data: session, isPending } = useSession();
if (isPending) return <p>Cargando...</p>;
if (!session) return <p>No has iniciado sesión</p>;
return <p>Hola, {session.user.name}!</p>;
}import { signOut } from "@/lib/auth/client";
await signOut({
fetchOptions: {
onSuccess: () => {
window.location.href = "/";
},
},
});Paso 5: Prueba el flujo completo
Arranca el servidor
npm run devPrueba Google OAuth
- Abre http://localhost:3000
- Click en "Iniciar sesión"
- Click en "Continuar con Google"
- Selecciona tu cuenta de Google
- Deberías ser redirigido al Dashboard
Prueba email/password
- Ve a http://localhost:3000/register
- Rellena nombre, email y password
- Revisa tu bandeja de entrada para el email de verificación
- Click en el enlace de verificación
- Inicia sesión con tus credenciales
Paso 6: Verifica el usuario en la base de datos
Abre Prisma Studio para confirmar que el usuario se creo correctamente:
npx prisma studioNavega a la tabla users. Deberías ver:
| Campo | Valor esperado |
|---|---|
name | Tu nombre de Google |
email | Tu email de Google |
emailVerified | true (si usaste Google OAuth) |
role | user |
image | URL de tu foto de perfil |
En la tabla accounts veras el registro del proveedor:
| Campo | Valor esperado |
|---|---|
providerId | google |
accountId | Tu Google ID |
URLs de producción
Cuando despliegues a producción, añade las URLs de tu dominio en Google Cloud Console:
Authorized JavaScript origins:
https://tu-dominio.com
Authorized redirect URIs:
https://tu-dominio.com/api/auth/callback/googleY actualiza la variable de entorno:
BETTER_AUTH_URL=https://tu-dominio.comResumen
Has configurado:
- Google OAuth con credenciales de Google Cloud
- Login con email y password con verificación
- Sesiónes persistentes de 30 dias
- Cliente de autenticación con hooks para React
Siguiente paso
- Crear endpoints de API - Crea un endpoint protegido que requiera autenticación