Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- export const handle = sequence(
- Sentry.sentryHandle(),
- async function _handle({ event, resolve }): Promise<Response> {
- // Check if it's a public vs authenticated route and then verify jwt at that stage...
- const cookies = cookie.parse(event.request.headers.get('cookie') || '');
- const _at = cookies._at ? cookies._at : null;
- const _rt = cookies._rt ? cookies._rt : null;
- const publicPaths = ['/auth/login'];
- const isPublicPath = publicPaths.includes(event.url.pathname);
- if (!isPublicPath) {
- if (!_at || !_rt) {
- return Response.redirect(`${event.url.origin}/auth/login`, 302);
- }
- const { decodedToken, accessToken, refreshToken } = await verifyAndRefreshJWT({
- accessToken: _at,
- refreshToken: _rt
- });
- if (!decodedToken) {
- return Response.redirect(`${event.url.origin}/auth/login`, 302);
- }
- event.locals.user = decodedToken.toJSON();
- event.locals.token = accessToken;
- const response: Response = await resolve(event);
- response.headers.append(
- 'Set-Cookie',
- `_at=${accessToken}; Path=/; HttpOnly; Max-Age=360000;`
- );
- response.headers.append(
- 'Set-Cookie',
- `_rt=${refreshToken}; Path=/; HttpOnly; Max-Age=360000;`
- );
- return response;
- }
- return await resolve(event);
- }
- );
- async function verifyAndRefreshJWT({ accessToken, refreshToken }) {
- if (accessToken && refreshToken) {
- try {
- const token = jwtVerify.verify(accessToken);
- return {
- decodedToken: token.body,
- accessToken,
- refreshToken
- };
- } catch (err) {
- if (err.message === 'Jwt is expired') {
- //console.log('JWT Expired.. Getting new one');
- try {
- const data = await get(`auth/refresh`, refreshToken);
- if (data.accessToken) {
- const verifyNewToken = jwtVerify.verify(data.accessToken);
- return {
- decodedToken: verifyNewToken.body,
- accessToken: data.accessToken,
- refreshToken: data.refreshToken
- };
- } else {
- return {
- decodedToken: null,
- accessToken: null,
- refreshToken: null
- };
- }
- } catch (err) {
- return {
- decodedToken: null,
- accessToken: null,
- refreshToken: null
- };
- }
- }
- }
- } else if (refreshToken) {
- try {
- console.log('No Access Token.. Requesting new one with Refresh Token');
- const data = await get(`auth/refresh`, refreshToken);
- if (data.accessToken) {
- const verifyNewToken = jwtVerify.verify(data.accessToken);
- return {
- decodedToken: verifyNewToken.body,
- accessToken: data.accessToken,
- refreshToken: data.refreshToken
- };
- } else {
- return {
- decodedToken: null,
- accessToken: null,
- refreshToken: null
- };
- }
- } catch (err) {
- return {
- decodedToken: null,
- accessToken: null,
- refreshToken: null
- };
- }
- } else {
- return {
- decodedToken: null,
- accessToken: null,
- refreshToken: null
- };
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment