faceit-visa
Version:
A lightweight OAuth2 authentication library for FACEIT integration
61 lines (50 loc) • 2 kB
text/typescript
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`);
}
}