UNPKG

faceit-visa

Version:

A lightweight OAuth2 authentication library for FACEIT integration

61 lines (50 loc) 2 kB
import { NextRequest } from 'next/server'; import { FaceitVisa } from 'faceit-visa'; import { cookies } from 'next/headers'; const visa = new FaceitVisa({ clientId: process.env.FACEIT_CLIENT_ID!, clientSecret: process.env.FACEIT_CLIENT_SECRET!, redirectUri: `${process.env.NEXTAUTH_URL || 'https://localhost:3000'}/api/auth/callback/faceit` }); export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams; const code = searchParams.get('code'); if (!code) { return Response.redirect(`${process.env.NEXTAUTH_URL}/?error=no_code`); } const cookieStore = await cookies(); const codeVerifier = cookieStore.get('faceit_code_verifier')?.value; if (!codeVerifier) { return Response.redirect(`${process.env.NEXTAUTH_URL}/?error=no_verifier`); } try { const tokenResponse = await visa.exchangeCode(code, codeVerifier); if (!tokenResponse) { return Response.redirect(`${process.env.NEXTAUTH_URL}/?error=token_failed`); } const user = await visa.getUserProfile(tokenResponse.access_token); if (!user) { return Response.redirect(`${process.env.NEXTAUTH_URL}/?error=profile_failed`); } // Store user data and token in cookies before redirecting cookieStore.set('faceit_user', JSON.stringify(user), { httpOnly: true, secure: process.env.NODE_ENV === 'production', maxAge: 60 * 60 * 24 * 7, // 7 days sameSite: 'lax' }); cookieStore.set('faceit_token', tokenResponse.access_token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', maxAge: 60 * 60 * 24 * 7, // 7 days sameSite: 'lax' }); // Clear code verifier cookieStore.delete('faceit_code_verifier'); // Redirect to home page return Response.redirect(`${process.env.NEXTAUTH_URL}/`); } catch (error) { console.error('FACEIT auth error:', error); return Response.redirect(`${process.env.NEXTAUTH_URL}/?error=auth_failed`); } }