import { byuAuthConfig, generateCodeVerifier, generateCodeChallenge } from '@server/utils/auth.ts' import { getQuery, setCookie } from 'h3' export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const { redirect } = getQuery(event) as { redirect?: string } const state = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15) const codeVerifier = generateCodeVerifier() const codeChallenge = await generateCodeChallenge(codeVerifier) setCookie(event, 'oauth_state', state, { httpOnly: true, secure: config.baseUrl !== 'http://localhost:3000', maxAge: 600, sameSite: 'lax' }) setCookie(event, 'code_verifier', codeVerifier, { httpOnly: true, secure: config.baseUrl !== 'http://localhost:3000', maxAge: 600, sameSite: 'lax' }) if (redirect) { // Store redirect URL in cookie to read it later in the callback setCookie(event, 'redirect_after_login', redirect, { httpOnly: true, secure: config.baseUrl !== 'http://localhost:3000', maxAge: 600, sameSite: 'lax' }) } const authUrl = new URL(byuAuthConfig.authorizationUrl) authUrl.searchParams.set('client_id', byuAuthConfig.clientId) authUrl.searchParams.set('redirect_uri', byuAuthConfig.redirectUri) authUrl.searchParams.set('response_type', 'code') authUrl.searchParams.set('scope', byuAuthConfig.scopes.join(' ')) authUrl.searchParams.set('state', state) authUrl.searchParams.set('code_challenge', codeChallenge) authUrl.searchParams.set('code_challenge_method', 'S256') return sendRedirect(event, authUrl.toString()) })