Guest User

Untitled

a guest
Oct 31st, 2024
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. export const handle = sequence(
  2.     Sentry.sentryHandle(),
  3.     async function _handle({ event, resolve }): Promise<Response> {
  4.         // Check if it's a public vs authenticated route and then verify jwt at that stage...
  5.         const cookies = cookie.parse(event.request.headers.get('cookie') || '');
  6.         const _at = cookies._at ? cookies._at : null;
  7.         const _rt = cookies._rt ? cookies._rt : null;
  8.  
  9.         const publicPaths = ['/auth/login'];
  10.  
  11.         const isPublicPath = publicPaths.includes(event.url.pathname);
  12.         if (!isPublicPath) {
  13.             if (!_at || !_rt) {
  14.                 return Response.redirect(`${event.url.origin}/auth/login`, 302);
  15.             }
  16.  
  17.             const { decodedToken, accessToken, refreshToken } = await verifyAndRefreshJWT({
  18.                 accessToken: _at,
  19.                 refreshToken: _rt
  20.             });
  21.  
  22.             if (!decodedToken) {
  23.                 return Response.redirect(`${event.url.origin}/auth/login`, 302);
  24.             }
  25.             event.locals.user = decodedToken.toJSON();
  26.             event.locals.token = accessToken;
  27.             const response: Response = await resolve(event);
  28.  
  29.             response.headers.append(
  30.                 'Set-Cookie',
  31.                 `_at=${accessToken}; Path=/; HttpOnly; Max-Age=360000;`
  32.             );
  33.             response.headers.append(
  34.                 'Set-Cookie',
  35.                 `_rt=${refreshToken}; Path=/; HttpOnly; Max-Age=360000;`
  36.             );
  37.  
  38.             return response;
  39.         }
  40.  
  41.         return await resolve(event);
  42.     }
  43. );
  44.  
  45. async function verifyAndRefreshJWT({ accessToken, refreshToken }) {
  46.     if (accessToken && refreshToken) {
  47.         try {
  48.             const token = jwtVerify.verify(accessToken);
  49.             return {
  50.                 decodedToken: token.body,
  51.                 accessToken,
  52.                 refreshToken
  53.             };
  54.         } catch (err) {
  55.             if (err.message === 'Jwt is expired') {
  56.                 //console.log('JWT Expired.. Getting new one');
  57.                 try {
  58.                     const data = await get(`auth/refresh`, refreshToken);
  59.                     if (data.accessToken) {
  60.                         const verifyNewToken = jwtVerify.verify(data.accessToken);
  61.                         return {
  62.                             decodedToken: verifyNewToken.body,
  63.                             accessToken: data.accessToken,
  64.                             refreshToken: data.refreshToken
  65.                         };
  66.                     } else {
  67.                         return {
  68.                             decodedToken: null,
  69.                             accessToken: null,
  70.                             refreshToken: null
  71.                         };
  72.                     }
  73.                 } catch (err) {
  74.                     return {
  75.                         decodedToken: null,
  76.                         accessToken: null,
  77.                         refreshToken: null
  78.                     };
  79.                 }
  80.             }
  81.         }
  82.     } else if (refreshToken) {
  83.         try {
  84.             console.log('No Access Token.. Requesting new one with Refresh Token');
  85.             const data = await get(`auth/refresh`, refreshToken);
  86.             if (data.accessToken) {
  87.                 const verifyNewToken = jwtVerify.verify(data.accessToken);
  88.                 return {
  89.                     decodedToken: verifyNewToken.body,
  90.                     accessToken: data.accessToken,
  91.                     refreshToken: data.refreshToken
  92.                 };
  93.             } else {
  94.                 return {
  95.                     decodedToken: null,
  96.                     accessToken: null,
  97.                     refreshToken: null
  98.                 };
  99.             }
  100.         } catch (err) {
  101.             return {
  102.                 decodedToken: null,
  103.                 accessToken: null,
  104.                 refreshToken: null
  105.             };
  106.         }
  107.     } else {
  108.         return {
  109.             decodedToken: null,
  110.             accessToken: null,
  111.             refreshToken: null
  112.         };
  113.     }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment