diff --git a/app/api/oauth/callback/route.ts b/app/api/oauth/callback/route.ts index b030faf..92799bb 100644 --- a/app/api/oauth/callback/route.ts +++ b/app/api/oauth/callback/route.ts @@ -4,7 +4,10 @@ export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams; const code = searchParams.get('code'); + console.log('[OAuth Callback] Received callback with code:', code ? 'exists' : 'missing'); + if (!code) { + console.error('[OAuth Callback] No code provided'); return NextResponse.redirect(new URL('/settings?error=no_code', request.url)); } @@ -13,11 +16,13 @@ export async function GET(request: NextRequest) { const REDIRECT_URI = `${process.env.NEXT_PUBLIC_APP_URL}/api/oauth/callback`; if (!CLIENT_ID || !CLIENT_SECRET || !process.env.NEXT_PUBLIC_APP_URL) { + console.error('[OAuth Callback] Missing configuration'); return NextResponse.redirect(new URL('/settings?error=config_missing', request.url)); } try { // 1. Exchange code for token + console.log('[OAuth Callback] Exchanging code for token...'); const tokenResponse = await fetch('https://connect.linux.do/oauth2/token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -31,17 +36,23 @@ export async function GET(request: NextRequest) { }); const tokenData = await tokenResponse.json(); + console.log('[OAuth Callback] Token response status:', tokenResponse.status); + console.log('[OAuth Callback] Token data:', { hasToken: !!tokenData.access_token }); if (!tokenData.access_token) { + console.error('[OAuth Callback] No access token in response:', tokenData); throw new Error('Failed to get access token'); } // 2. Get User Info + console.log('[OAuth Callback] Fetching user info...'); const userResponse = await fetch('https://connect.linux.do/api/user', { headers: { Authorization: `Bearer ${tokenData.access_token}` }, }); const userData = await userResponse.json(); + console.log('[OAuth Callback] User response status:', userResponse.status); + console.log('[OAuth Callback] User data:', { id: userData.id, username: userData.username }); // 3. Redirect with data const redirectUrl = new URL('/settings', request.url); @@ -49,9 +60,10 @@ export async function GET(request: NextRequest) { redirectUrl.searchParams.set('token', tokenData.access_token); redirectUrl.searchParams.set('user', JSON.stringify(userData)); + console.log('[OAuth Callback] Redirecting to settings with auth data'); return NextResponse.redirect(redirectUrl); } catch (error) { - console.error('OAuth Error:', error); + console.error('[OAuth Callback] Error:', error); return NextResponse.redirect(new URL('/settings?error=auth_failed', request.url)); } } diff --git a/components/settings/AccountSettings.tsx b/components/settings/AccountSettings.tsx index eacad76..8a0894a 100644 --- a/components/settings/AccountSettings.tsx +++ b/components/settings/AccountSettings.tsx @@ -24,15 +24,28 @@ export function AccountSettings() { const token = searchParams.get('token'); const userStr = searchParams.get('user'); + console.log('[AccountSettings] Checking URL params:', { + authSuccess, + hasToken: !!token, + hasUser: !!userStr, + }); + if (authSuccess && token && userStr) { try { const userData = JSON.parse(userStr) as LinuxDoUser; + console.log('[AccountSettings] Parsed user data:', { + id: userData.id, + username: userData.username, + }); + clearHistory(); clearSearchHistory(); login(userData, token); + + console.log('[AccountSettings] Login complete, redirecting...'); router.replace('/settings'); } catch (e) { - console.error('Failed to parse user data', e); + console.error('[AccountSettings] Failed to parse user data:', e); } } }, [searchParams, login, clearHistory, clearSearchHistory, router]);