Autenticación social moderna paso a paso
OAuth 2.0 es un protocolo de autorización
Usamos la autorización para obtener datos y autenticar
Next.js (3000) → Strapi (1337) → GitHub
/api/connect/github// src/app/page.tsx
const backendUrl = process.env.NEXT_PUBLIC_BACKEND_URL;
const url = new URL(backendUrl + "/api/connect/github");
<Link href={url.href}>
Sign in with GitHub
</Link>
Redirigimos a Strapi, no directamente a GitHub
// src/app/connect/[provider]/redirect/route.ts
export async function GET(request, { params }) {
const token = searchParams.get("access_token");
// Intercambiar por JWT de Strapi
const res = await fetch(
`${backendUrl}/api/auth/${provider}/callback?access_token=${token}`
);
const data = await res.json();
// Guardar en cookie segura
cookieStore.set("jwt", data.jwt, config);
return NextResponse.redirect("/dashboard");
}
const config = {
maxAge: 60 * 60 * 24 * 7, // 1 semana
httpOnly: true, // No JS access
secure: true, // Solo HTTPS
path: "/",
domain: "localhost"
};
httpOnly previene robo de tokens vía XSS
// src/middleware.ts
export async function middleware(request) {
const user = await getUserMeLoader();
if (request.nextUrl.pathname.startsWith("/dashboard")
&& user.ok === false) {
return NextResponse.redirect("/");
}
return NextResponse.next();
}
La cookie podría existir pero...
Strapi es la fuente de verdad
async function logoutAction() {
"use server";
const cookieStore = await cookies();
cookieStore.set("jwt", "", { ...config, maxAge: 0 });
redirect("/");
}
Sin API routes adicionales
Redirect: http://localhost:3000/connect/github/redirect
Settings → Developer Settings → OAuth Apps
El callback apunta a Strapi, no al frontend
El segmento dinámico [provider] permite:
Solo configura el provider en Strapi
frontend/src/
├── app/
│ ├── page.tsx # Login
│ ├── dashboard/ # Protected
│ └── connect/[provider]/redirect/
├── components/
│ └── LogoutButton.tsx
├── services/
│ └── user-me-loader.ts
└── middleware.ts
Frontend: http://localhost:3000
Backend: http://localhost:1337
¿Preguntas?
github.com/tu-usuario/social-strapi