diff --git a/apps/web/app/auth/confirm/route.ts b/apps/web/app/auth/confirm/route.ts new file mode 100644 index 000000000..534f71d15 --- /dev/null +++ b/apps/web/app/auth/confirm/route.ts @@ -0,0 +1,33 @@ +import { NextRequest, NextResponse } from 'next/server'; + +import { type EmailOtpType } from '@supabase/supabase-js'; + +import { getSupabaseRouteHandlerClient } from '@kit/supabase/route-handler-client'; + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const token_hash = searchParams.get('token_hash'); + const type = searchParams.get('type') as EmailOtpType | null; + const next = searchParams.get('next') ?? '/'; + const redirectTo = request.nextUrl.clone(); + + redirectTo.pathname = next; + + if (token_hash && type) { + const supabase = getSupabaseRouteHandlerClient(); + + const { error } = await supabase.auth.verifyOtp({ + type, + token_hash, + }); + + if (!error) { + return NextResponse.redirect(redirectTo); + } + } + + // return the user to an error page with some instructions + redirectTo.pathname = '/auth/callback/error'; + + return NextResponse.redirect(redirectTo); +}