import NextAuth, { NextAuthOptions } from "next-auth"; import DiscordProvider from "next-auth/providers/discord"; // 환경변수 부팅 시점 검증 — 누락 시 즉시 실패 const DISCORD_CLIENT_ID = process.env.DISCORD_CLIENT_ID?.trim(); const DISCORD_CLIENT_SECRET = process.env.DISCORD_CLIENT_SECRET?.trim(); const NEXTAUTH_SECRET = process.env.NEXTAUTH_SECRET?.trim(); if (!DISCORD_CLIENT_ID || !DISCORD_CLIENT_SECRET) { throw new Error("[NextAuth] DISCORD_CLIENT_ID/DISCORD_CLIENT_SECRET 환경변수가 설정되지 않았습니다."); } if (!NEXTAUTH_SECRET) { throw new Error("[NextAuth] NEXTAUTH_SECRET 환경변수가 설정되지 않았습니다."); } interface DiscordProfile { id?: string; username?: string; email?: string; } export const authOptions: NextAuthOptions = { secret: NEXTAUTH_SECRET, providers: [ DiscordProvider({ clientId: DISCORD_CLIENT_ID, clientSecret: DISCORD_CLIENT_SECRET, // 🌟 핵심: 로그인할 때 유저의 기본 정보(identify)와 서버 목록(guilds) 권한을 같이 가져옵니다! authorization: { params: { scope: "identify email guilds" } }, }), ], session: { strategy: "jwt", }, callbacks: { // 디스코드에서 받은 토큰(accessToken)을 우리 세션에 저장해두는 로직 async jwt({ token, account, profile }) { const discordProfile = profile as DiscordProfile | undefined; if (account && discordProfile?.id) { token.id = discordProfile.id; token.accessToken = account.access_token; } return token; }, async session({ session, token }) { if (token.id) session.user.id = token.id; if (token.accessToken) session.accessToken = token.accessToken; return session; }, }, }; const handler = NextAuth(authOptions); // App Router 환경에서는 GET과 POST 메서드를 둘 다 내보내야 합니다. export { handler as GET, handler as POST };