46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
// src/pages/api/auth/login.ts
|
|
import type { APIRoute } from 'astro';
|
|
import { generateAuthUrl, generateState, logAuthEvent } from '../../../utils/auth.js';
|
|
import { serialize } from 'cookie';
|
|
|
|
export const prerender = false;
|
|
|
|
export const GET: APIRoute = async ({ url, redirect }) => {
|
|
try {
|
|
const state = generateState();
|
|
const authUrl = generateAuthUrl(state);
|
|
|
|
console.log('[AUTH] Generated auth URL:', authUrl);
|
|
|
|
const returnTo = url.searchParams.get('returnTo') || '/';
|
|
|
|
logAuthEvent('Login initiated', { returnTo, authUrl });
|
|
|
|
const stateData = JSON.stringify({ state, returnTo });
|
|
|
|
const publicBaseUrl = process.env.PUBLIC_BASE_URL || '';
|
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
const isSecure = publicBaseUrl.startsWith('https://') || isProduction;
|
|
|
|
const stateCookie = serialize('auth_state', stateData, {
|
|
httpOnly: true,
|
|
secure: isSecure,
|
|
sameSite: 'lax',
|
|
maxAge: 600, // 10 minutes
|
|
path: '/'
|
|
});
|
|
|
|
console.log('[AUTH] Setting auth state cookie:', stateCookie.substring(0, 50) + '...');
|
|
|
|
return new Response(null, {
|
|
status: 302,
|
|
headers: {
|
|
'Location': authUrl,
|
|
'Set-Cookie': stateCookie
|
|
}
|
|
});
|
|
} catch (error) {
|
|
logAuthEvent('Login failed', { error: error instanceof Error ? error.message : 'Unknown error' });
|
|
return new Response('Authentication error', { status: 500 });
|
|
}
|
|
}; |