chatbot-template/app/api/auth/callback/route.ts
2023-05-19 14:13:38 -04:00

62 lines
1.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { serialize } from 'cookie';
import { createSession } from '@/lib/session/create';
import { encryptJWECookie } from '@/lib/cookies/encrypt-jwe';
import ms from 'ms';
import { userSessionCookieName } from '@/lib/session/constants';
export const runtime = 'edge';
const sharedTokenSecret = process.env.SHARE_TOKEN_ENDPOINT_SECRET;
const cookieTTL = ms('1y');
export async function GET(req: NextRequest) {
const { origin, searchParams } = req.nextUrl;
const shareableToken = searchParams.get('shareableToken');
if (!sharedTokenSecret || !shareableToken) {
// TODO: Make an error page
return NextResponse.json({ error: 'Invalid request' }, { status: 500 });
}
const query = new URLSearchParams({
sharedTokenSecret,
});
const response = await fetch(
`https://api.vercel.com/user/tokens/shared/${shareableToken}?${query.toString()}`
);
const { token } = (await response.json()) as { token: string };
const session = await createSession(token);
const cookieValue = await encryptJWECookie(session, '1y');
const next = req.cookies.get('auth-next')?.value;
return NextResponse.redirect(new URL(next ?? '/', origin), {
headers: [
[
'set-cookie',
serialize(userSessionCookieName, cookieValue, {
path: '/',
maxAge: cookieTTL / 1000,
expires: new Date(Date.now() + cookieTTL),
httpOnly: true,
secure: process.env.NODE_ENV !== 'development',
}),
],
// There's currently an issue with adding more than one cookie to a response: https://github.com/vercel/next.js/issues/46579
// the `auth-next` cookie will expire in 10 min anyway
// [
// 'set-cookie',
// serialize('auth-next', '', {
// path: '/api/auth/callback',
// maxAge: 0,
// expires: new Date(),
// httpOnly: true,
// })
// ]
],
});
}