-
+
@@ -15,19 +15,28 @@ const authStore = useAuthUser();
const route = useRoute();
-const mHandleError = (e: unknown) => {
+const mHandleError = (e: any) => {
logger.error("Primary error boundary", e);
};
-const isPendingAuth = computed(() => authStore.isPending);
+const shouldRender = computed(
+ () => !authStore.isPending || authStore.isAuthenticated
+);
// Doing this here instead than in the middleware allow reactivity on the auth user
watchEffect(async () => {
- if (isPendingAuth.value) {
+ logger.info("pending");
+ if (authStore.isPending) {
return;
}
+ logger.info("resolved pending");
const shouldRedirectToLogin =
!authStore.isAuthenticated &&
authStore.authUrl &&
route.name !== "auth-login";
+ logger.info("shouldRedirectToLogin");
+ logger.info(authStore.isAuthenticated);
+ logger.info(authStore.authUrl);
+ logger.info(route.name);
+ logger.info(shouldRedirectToLogin);
if (shouldRedirectToLogin) {
await navigateTo(authStore.authUrl, { external: true });
}
@@ -38,3 +47,4 @@ watchEffect(async () => {
}
});
+cd
diff --git a/apps/front/src/middleware/auth.global.ts b/apps/front/src/middleware/auth.global.ts
index 074900c4..f0fb65ca 100644
--- a/apps/front/src/middleware/auth.global.ts
+++ b/apps/front/src/middleware/auth.global.ts
@@ -5,6 +5,7 @@ export default defineNuxtRouteMiddleware(async () => {
// We refresh the data information
// If the syncMe result in a 401, the component RedirectToLogin will be triggered,
// so no need to wait the sync
+ logger.info("------ in middleware");
const mePromise = authStore.syncMe();
/**
* We still wait if the user is not authenticated because that may mean
diff --git a/apps/front/src/plugins/appFetch.ts b/apps/front/src/plugins/appFetch.ts
index 53a65380..41c545d1 100644
--- a/apps/front/src/plugins/appFetch.ts
+++ b/apps/front/src/plugins/appFetch.ts
@@ -9,10 +9,14 @@ export default defineNuxtPlugin(() => {
const event = useRequestEvent();
const headers: {
[key: string]: string;
- } = useRequestHeaders(["cookie"]) as {
- [key: string]: string;
+ } = {
+ ...(useRequestHeaders(["cookie"]) as {
+ [key: string]: string;
+ }),
+ ...{
+ accept: "application/json",
+ },
};
-
const handleException = (e: any) => {
logger.error("An error hapenned during an API call");
logger.error(e);
@@ -21,10 +25,9 @@ export default defineNuxtPlugin(() => {
logger.error("401 error, removing authentication informations");
store.resetAuth();
}
- // HERE the bug
const cookies = e.response.headers.get("set-cookie") || "";
if (process.server && cookies) {
- event.res.setHeader("set-cookie", cookies);
+ event.node.res.setHeader("set-cookie", cookies);
}
throw e;
};
@@ -40,7 +43,7 @@ export default defineNuxtPlugin(() => {
const cookies = res.headers.get("set-cookie") || "";
if (process.server && cookies) {
- event.res.setHeader("set-cookie", cookies);
+ event.node.res.setHeader("set-cookie", cookies);
}
return res;
};
@@ -57,7 +60,7 @@ export default defineNuxtPlugin(() => {
const cookies = res.headers.get("set-cookie") || "";
if (process.server && cookies) {
- event.res.setHeader("set-cookie", cookies);
+ event.node.res.setHeader("set-cookie", cookies);
}
return res._data;
};
diff --git a/apps/front/src/server/api/[...].ts b/apps/front/src/server/api/[...].ts
index d07b1099..0e8b9da3 100644
--- a/apps/front/src/server/api/[...].ts
+++ b/apps/front/src/server/api/[...].ts
@@ -1,5 +1,11 @@
-import { defineEventHandler, H3Event, proxyRequest } from "h3";
-
+import {
+ defineEventHandler,
+ H3Event,
+ RequestHeaders,
+ getMethod,
+ getRequestHeaders,
+ sendProxy as _sendProxy,
+} from "h3";
/**
* Beware
* Using the SSR, cookies are transmitted to the proxy BUT
@@ -25,6 +31,81 @@ import { defineEventHandler, H3Event, proxyRequest } from "h3";
import logger from "~/utils/logger";
+/**
+ * This code override proxyRequest from h3
+ */
+
+/**
+ * start - this code is not exported from h3
+ */
+export interface ProxyOptions {
+ headers?: RequestHeaders | HeadersInit;
+ fetchOptions?: RequestInit;
+ fetch?: typeof fetch;
+ sendStream?: boolean;
+ cookieDomainRewrite?: string | Record;
+ cookiePathRewrite?: string | Record;
+ onResponse?: (event: H3Event, response: Response) => void;
+}
+
+const ignoredHeaders = new Set([
+ 'transfer-encoding',
+ 'connection',
+ 'keep-alive',
+ 'upgrade',
+ 'expect',
+ 'host',
+]);
+
+export function getProxyRequestHeaders(event: H3Event) {
+ const headers = Object.create(null);
+ const reqHeaders = getRequestHeaders(event);
+ // eslint-disable-next-line no-restricted-syntax
+ for (const name in reqHeaders) {
+ if (!ignoredHeaders.has(name)) {
+ headers[name] = reqHeaders[name];
+ }
+ }
+ return headers;
+}
+
+/**
+ * end - this code is not exported from h3
+ */
+
+/**
+ * This code override h3 default behavior:
+ * Instead of reading the body we send the body as the stream, allowing better memory usage + prevent utf8 decoding
+ * */
+async function proxyRequest(
+ event: H3Event,
+ target: string,
+ opts: ProxyOptions = {},
+) {
+ const method = getMethod(event);
+
+ // Headers
+ const headers = getProxyRequestHeaders(event);
+ if (opts.fetchOptions?.headers) {
+ Object.assign(headers, opts.fetchOptions.headers);
+ }
+ if (opts.headers) {
+ Object.assign(headers, opts.headers);
+ }
+ return _sendProxy(event, target, {
+ ...opts,
+ fetchOptions: {
+ headers,
+ method,
+ body: method !== "GET" && method !== "HEAD" ? event.node.req : undefined,
+ ...opts.fetchOptions,
+ } as RequestInit,
+ });
+}
+
+/**
+ * Here we use the proxy as a default request
+ */
export default defineEventHandler(async (event: H3Event) => {
const { API_URL } = useRuntimeConfig();
const target = new URL(event.req.url as string, API_URL);
@@ -33,8 +114,9 @@ export default defineEventHandler(async (event: H3Event) => {
headers: {
host: target.host,
},
- cookiePathRewrite: {
- "/*": "/",
+ sendStream: true,
+ fetchOptions: {
+ redirect: "manual",
},
});
return ret;
diff --git a/apps/front/src/store/auth.ts b/apps/front/src/store/auth.ts
index 84d43302..feda46ba 100644
--- a/apps/front/src/store/auth.ts
+++ b/apps/front/src/store/auth.ts
@@ -56,10 +56,10 @@ export const useAuthUser = defineStore({
if (this.isPending) {
return;
}
+ this.startPending();
// Our session is based on the PHPSESSID cookie
const me = useMe();
try {
- this.startPending();
const authUser = await me();
this.setAuthUser(authUser);
this.endPending();
diff --git a/docker-compose.yml b/docker-compose.yml
index 9bea5ff5..fdad542f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -47,7 +47,7 @@ services:
working_dir: /home/node/app
environment:
# This is used only per the proxy
- NUXT_API_URL: http://${API_DOMAIN}/
+ - NUXT_API_URL=${PROTOCOL}://${API_DOMAIN}/
proxy:
image: traefik:3.0
container_name: tcm_proxy