import { NextResponse } from 'next/server'; /** * Exchange GitHub OAuth code for access token * This must be done server-side to keep client secret secure */ export async function POST(request: Request) { try { const { code } = await request.json(); if (!code) { return NextResponse.json( { error: 'Authorization code is required' }, { status: 400 } ); } const clientId = process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID; const clientSecret = process.env.GITHUB_CLIENT_SECRET; if (!clientId || !clientSecret) { return NextResponse.json( { error: 'GitHub OAuth not configured' }, { status: 500 } ); } // Exchange code for token const tokenResponse = await fetch('https://github.com/login/oauth/access_token', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json', }, body: JSON.stringify({ client_id: clientId, client_secret: clientSecret, code, }), }); if (!tokenResponse.ok) { throw new Error('Failed to exchange code for token'); } const tokenData = await tokenResponse.json(); if (tokenData.error) { return NextResponse.json( { error: tokenData.error_description || tokenData.error }, { status: 400 } ); } return NextResponse.json({ access_token: tokenData.access_token, token_type: tokenData.token_type, scope: tokenData.scope, }); } catch (error) { console.error('[GitHub OAuth] Error:', error); return NextResponse.json( { error: 'Failed to exchange code for token' }, { status: 500 } ); } }