diff --git a/src/app/api/auth/callback/route.ts b/src/app/api/auth/callback/route.ts index 33620dc..38cbbdf 100644 --- a/src/app/api/auth/callback/route.ts +++ b/src/app/api/auth/callback/route.ts @@ -12,26 +12,45 @@ export async function GET(request: NextRequest) { const error = request.nextUrl.searchParams.get('error'); if (error || !code) { - const errorDesc = request.nextUrl.searchParams.get('error_description') || 'Login cancelled'; + const errorDesc = + request.nextUrl.searchParams.get('error_description') || 'Login cancelled'; + return NextResponse.redirect( new URL(`/login?error=${encodeURIComponent(errorDesc)}`, request.url) ); } const settings = getSettings(); - const appId = settings.metaAppId || process.env.META_APP_ID; - const appSecret = settings.metaAppSecret || process.env.META_APP_SECRET; - const redirectUri = process.env.META_REDIRECT_URI || 'http://localhost:3000/api/auth/callback'; + + const appId = + settings.metaAppId || + process.env.META_APP_ID; + + const appSecret = + settings.metaAppSecret || + process.env.META_APP_SECRET; + + const redirectUri = + process.env.META_REDIRECT_URI || + 'https://admanager.seureview.com.br/api/auth/callback'; if (!appId || !appSecret) { return NextResponse.redirect( - new URL(`/login?error=${encodeURIComponent('Credenciais Meta não configuradas no sistema.')}`, request.url) + new URL( + `/login?error=${encodeURIComponent( + 'Credenciais Meta não configuradas no sistema.' + )}`, + request.url + ) ); } try { // 1. Exchange code for short-lived token - const tokenUrl = new URL('https://graph.facebook.com/v20.0/oauth/access_token'); + const tokenUrl = new URL( + 'https://graph.facebook.com/v20.0/oauth/access_token' + ); + tokenUrl.searchParams.set('client_id', appId); tokenUrl.searchParams.set('client_secret', appSecret); tokenUrl.searchParams.set('redirect_uri', redirectUri); @@ -47,7 +66,10 @@ export async function GET(request: NextRequest) { const shortToken = tokenData.access_token; // 2. Exchange for long-lived token (60 days) - const longTokenUrl = new URL('https://graph.facebook.com/v20.0/oauth/access_token'); + const longTokenUrl = new URL( + 'https://graph.facebook.com/v20.0/oauth/access_token' + ); + longTokenUrl.searchParams.set('grant_type', 'fb_exchange_token'); longTokenUrl.searchParams.set('client_id', appId); longTokenUrl.searchParams.set('client_secret', appSecret); @@ -55,16 +77,19 @@ export async function GET(request: NextRequest) { const longRes = await fetch(longTokenUrl.toString()); const longData = await longRes.json(); + const accessToken = longData.access_token || shortToken; // 3. Get user info const meRes = await fetch( `https://graph.facebook.com/v20.0/me?fields=name,picture.type(large)&access_token=${accessToken}` ); + const meData = await meRes.json(); // 4. Save session const cookieStore = await cookies(); + setSessionCookies(cookieStore, accessToken, { name: meData.name || 'User', picture: meData.picture?.data?.url || '', @@ -74,8 +99,12 @@ export async function GET(request: NextRequest) { return NextResponse.redirect(new URL('/dashboard', request.url)); } catch (err) { console.error('[Auth] OAuth error:', err); + return NextResponse.redirect( - new URL(`/login?error=${encodeURIComponent('Erro na autenticação')}`, request.url) + new URL( + `/login?error=${encodeURIComponent('Erro na autenticação')}`, + request.url + ) ); } -} +} \ No newline at end of file