From 6dd86b2fb8035bc47fa0fd9ef71c614e3c099532 Mon Sep 17 00:00:00 2001 From: Vijayabhaskar J Date: Thu, 14 Mar 2024 19:13:57 +0530 Subject: [PATCH 1/3] set and reload data, rawToken from cookie --- src/runtime/composables/local/useAuth.ts | 16 +++++++++++++-- src/runtime/plugin.ts | 26 ++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/runtime/composables/local/useAuth.ts b/src/runtime/composables/local/useAuth.ts index 114248aa..6aed7df9 100644 --- a/src/runtime/composables/local/useAuth.ts +++ b/src/runtime/composables/local/useAuth.ts @@ -7,7 +7,7 @@ import { getRequestURLWN } from '../../utils/callWithNuxt' import { useAuthState } from './useAuthState' // @ts-expect-error - #auth not defined import type { SessionData } from '#auth' -import { useNuxtApp, useRuntimeConfig, nextTick, navigateTo } from '#imports' +import { useCookie, useNuxtApp, useRuntimeConfig, nextTick, navigateTo } from '#imports' type Credentials = { username?: string, email?: string, password?: string } & Record @@ -82,16 +82,28 @@ const getSession: GetSessionFunc = async (getSessionO const headers = new Headers(token.value ? { [config.token.headerName]: token.value } as HeadersInit : undefined) + const sessionCookie = useCookie("auth:sessionCookie", { + default: () => null, + maxAge: config.token.maxAgeInSeconds, + sameSite: config.token.sameSiteAttribute, + }); + loading.value = true try { data.value = await _fetch(nuxt, path, { method, headers }) + // Store the session data as a cookie + lastRefreshedAt.value = new Date(); + sessionCookie.value = { + lastRefreshedAt: lastRefreshedAt.value, + data: data.value, + }; } catch { // Clear all data: Request failed so we must not be authenticated data.value = null rawToken.value = null + sessionCookie.value = null; } loading.value = false - lastRefreshedAt.value = new Date() const { required = false, callbackUrl, onUnauthenticated, external } = getSessionOptions ?? {} if (required && data.value === null) { diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts index 9c27a8c9..c818fd62 100644 --- a/src/runtime/plugin.ts +++ b/src/runtime/plugin.ts @@ -1,10 +1,10 @@ import { getHeader } from 'h3' import authMiddleware from './middleware/auth' -import { addRouteMiddleware, defineNuxtPlugin, useRuntimeConfig, useAuth, useAuthState } from '#imports' +import { addRouteMiddleware, defineNuxtPlugin, useRuntimeConfig, useAuth, useAuthState, useCookie } from '#imports' export default defineNuxtPlugin(async (nuxtApp) => { // 1. Initialize authentication state, potentially fetch current session - const { data, lastRefreshedAt } = useAuthState() + const { data, lastRefreshedAt, rawToken, loading } = useAuthState() const { getSession } = useAuth() // use runtimeConfig @@ -19,6 +19,28 @@ export default defineNuxtPlugin(async (nuxtApp) => { // Only fetch session if it was not yet initialized server-side if (typeof data.value === 'undefined' && !nitroPrerender) { + // Restore the session data from the cookie + const sessionCookie = useCookie("auth:sessionCookie"); + const cookieToken = useCookie( + runtimeConfig.provider.token.cookieName + ); + if (sessionCookie.value && !rawToken.value && cookieToken.value) { + try { + loading.value = true; + const sessionData = sessionCookie.value; + lastRefreshedAt.value = sessionData?.lastRefreshedAt; + data.value = sessionData?.data; + rawToken.value = cookieToken.value; + } catch (error) { + console.error("Failed to parse session data from cookie:", error); + } finally { + loading.value = false; + } + } + + if (!data.value) { + await getSession(); + } await getSession() } From 8a361181fc3282322633584afa8a6d28345642c4 Mon Sep 17 00:00:00 2001 From: Vijayabhaskar J Date: Thu, 14 Mar 2024 19:41:02 +0530 Subject: [PATCH 2/3] fix lint --- src/runtime/composables/local/useAuth.ts | 14 +++++++------- src/runtime/plugin.ts | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/runtime/composables/local/useAuth.ts b/src/runtime/composables/local/useAuth.ts index 6aed7df9..f0bdbd2c 100644 --- a/src/runtime/composables/local/useAuth.ts +++ b/src/runtime/composables/local/useAuth.ts @@ -82,26 +82,26 @@ const getSession: GetSessionFunc = async (getSessionO const headers = new Headers(token.value ? { [config.token.headerName]: token.value } as HeadersInit : undefined) - const sessionCookie = useCookie("auth:sessionCookie", { + const sessionCookie = useCookie('auth:sessionCookie', { default: () => null, maxAge: config.token.maxAgeInSeconds, - sameSite: config.token.sameSiteAttribute, - }); + sameSite: config.token.sameSiteAttribute + }) loading.value = true try { data.value = await _fetch(nuxt, path, { method, headers }) // Store the session data as a cookie - lastRefreshedAt.value = new Date(); + lastRefreshedAt.value = new Date() sessionCookie.value = { lastRefreshedAt: lastRefreshedAt.value, - data: data.value, - }; + data: data.value + } } catch { // Clear all data: Request failed so we must not be authenticated data.value = null rawToken.value = null - sessionCookie.value = null; + sessionCookie.value = null } loading.value = false diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts index c818fd62..2dc718c8 100644 --- a/src/runtime/plugin.ts +++ b/src/runtime/plugin.ts @@ -20,26 +20,26 @@ export default defineNuxtPlugin(async (nuxtApp) => { // Only fetch session if it was not yet initialized server-side if (typeof data.value === 'undefined' && !nitroPrerender) { // Restore the session data from the cookie - const sessionCookie = useCookie("auth:sessionCookie"); + const sessionCookie = useCookie('auth:sessionCookie') const cookieToken = useCookie( runtimeConfig.provider.token.cookieName - ); + ) if (sessionCookie.value && !rawToken.value && cookieToken.value) { try { - loading.value = true; - const sessionData = sessionCookie.value; - lastRefreshedAt.value = sessionData?.lastRefreshedAt; - data.value = sessionData?.data; - rawToken.value = cookieToken.value; + loading.value = true + const sessionData = sessionCookie.value + lastRefreshedAt.value = sessionData?.lastRefreshedAt + data.value = sessionData?.data + rawToken.value = cookieToken.value } catch (error) { - console.error("Failed to parse session data from cookie:", error); + console.error('Failed to parse session data from cookie:', error) } finally { - loading.value = false; + loading.value = false } } if (!data.value) { - await getSession(); + await getSession() } await getSession() } From 9b4b8b12f3149cc1615e42bdfe10499730e0ff83 Mon Sep 17 00:00:00 2001 From: Vijayabhaskar J Date: Thu, 14 Mar 2024 20:27:00 +0530 Subject: [PATCH 3/3] fix typecheck --- src/runtime/plugin.ts | 9 +++++---- src/runtime/types.ts | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts index 2dc718c8..c3055ff3 100644 --- a/src/runtime/plugin.ts +++ b/src/runtime/plugin.ts @@ -1,5 +1,7 @@ import { getHeader } from 'h3' import authMiddleware from './middleware/auth' +import { useTypedBackendConfig } from './helpers' +import type { SessionCookie } from './types' import { addRouteMiddleware, defineNuxtPlugin, useRuntimeConfig, useAuth, useAuthState, useCookie } from '#imports' export default defineNuxtPlugin(async (nuxtApp) => { @@ -20,10 +22,9 @@ export default defineNuxtPlugin(async (nuxtApp) => { // Only fetch session if it was not yet initialized server-side if (typeof data.value === 'undefined' && !nitroPrerender) { // Restore the session data from the cookie - const sessionCookie = useCookie('auth:sessionCookie') - const cookieToken = useCookie( - runtimeConfig.provider.token.cookieName - ) + const config = useTypedBackendConfig(useRuntimeConfig(), 'local') + const sessionCookie = useCookie('auth:sessionCookie') + const cookieToken = useCookie(config.token.cookieName) if (sessionCookie.value && !rawToken.value && cookieToken.value) { try { loading.value = true diff --git a/src/runtime/types.ts b/src/runtime/types.ts index 094c446e..e49493cb 100644 --- a/src/runtime/types.ts +++ b/src/runtime/types.ts @@ -461,6 +461,10 @@ export interface ModuleOptionsNormalized extends ModuleOptions { fullBaseUrl: string } } +export interface SessionCookie { + lastRefreshedAt?: SessionLastRefreshedAt + data?: SessionDataObject +} // Augment types declare module 'nuxt/schema' {