debug: Add detailed logging to the OAuth callback and account settings components.

This commit is contained in:
kuekhaoyang
2025-11-29 14:18:03 +08:00
parent 1a2bf662e6
commit 033ad8da01
2 changed files with 27 additions and 2 deletions
+13 -1
View File
@@ -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));
}
}
+14 -1
View File
@@ -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]);