@devcoffee/nuxt-core 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -1
- package/dist/runtime/server/core/helpers.d.ts +23 -0
- package/dist/runtime/server/core/helpers.js +21 -2
- package/dist/runtime/server/core/nuxtForwardHandler.js +11 -2
- package/dist/runtime/server/plugins/authts.js +9 -13
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.4.0
|
|
4
|
+
|
|
5
|
+
[compare changes](https://github.com/coolkg1412/devcoffee-nuxt-core/compare/v1.3.0...v1.4.0)
|
|
6
|
+
|
|
7
|
+
### 🚀 Enhancements
|
|
8
|
+
|
|
9
|
+
- Implement writeSessionCookie function and integrate it into NuxtForwardRequestHandler and authts plugin ([e761f6c](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/e761f6c))
|
|
10
|
+
|
|
11
|
+
### 🩹 Fixes
|
|
12
|
+
|
|
13
|
+
- Drop return from proxyRequest in NuxtForwardRequestHandler to prevent ERR_HTTP_HEADERS_SENT ([fd3b91c](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/fd3b91c))
|
|
14
|
+
- Prevent sending headers after response has been finalized in beforeResponse hook ([444a012](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/444a012))
|
|
15
|
+
- Update version to 1.3.2 in package.json and package-lock.json ([e6ab449](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/e6ab449))
|
|
16
|
+
|
|
17
|
+
### 💅 Refactors
|
|
18
|
+
|
|
19
|
+
- Remove redundant signSessionId checks from authts.sec03.test.ts ([18686f4](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/18686f4))
|
|
20
|
+
|
|
21
|
+
### ❤️ Contributors
|
|
22
|
+
|
|
23
|
+
- Hieu Nguyen <hieu.nguyen@devcoffee.tech>
|
|
24
|
+
|
|
3
25
|
## v1.3.0
|
|
4
26
|
|
|
5
27
|
[compare changes](https://github.com/coolkg1412/devcoffee-nuxt-core/compare/v1.2.5...v1.3.0)
|
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { addCustomTab } from '@nuxt/devtools-kit';
|
|
|
2
2
|
import { defineNuxtModule, useLogger, createResolver, addTemplate, addServerImports, addServerImportsDir, addServerPlugin, addImportsDir, addPlugin, addRouteMiddleware, addServerHandler } from '@nuxt/kit';
|
|
3
3
|
import { deepMerge, pick } from '../dist/runtime/utils.js';
|
|
4
4
|
|
|
5
|
-
const version = "1.
|
|
5
|
+
const version = "1.4.0";
|
|
6
6
|
|
|
7
7
|
const defaultLocale = "vi-VN";
|
|
8
8
|
const defaultLanguage = "vi";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SessionContext } from '@devcoffee/nuxt-core';
|
|
2
|
+
import type { CookieSerializeOptions, H3Event } from '#devcoffee-core/server/adapters/http';
|
|
2
3
|
import type { ClientMetadata, ServerMetadata, TokenEndpointResponse } from '#devcoffee-core/server/adapters/oidc';
|
|
3
4
|
/** Options used for session creation and validation. */
|
|
4
5
|
type SessionCreateOptions = {
|
|
@@ -19,6 +20,28 @@ type SessionCreateOptions = {
|
|
|
19
20
|
* @since 1.0.0
|
|
20
21
|
*/
|
|
21
22
|
export declare function isSameOrigin(redirectUrl: string, requestUrl: URL): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Write the session cookie to the response.
|
|
25
|
+
*
|
|
26
|
+
* Shared by the `beforeResponse` Nitro hook (buffered responses) and the
|
|
27
|
+
* `proxyRequest` `onResponse` callback (streaming proxy responses). Calling
|
|
28
|
+
* it in both places ensures the cookie is always refreshed regardless of
|
|
29
|
+
* whether `headersSent` is true by the time `beforeResponse` fires.
|
|
30
|
+
*
|
|
31
|
+
* @param event - The H3 event for the current request.
|
|
32
|
+
* @param session - The resolved session context to encode into the cookie.
|
|
33
|
+
* @param sessionsConfig - Session cookie options from `nuxtCore.authts.sessions`.
|
|
34
|
+
* @since 1.3.3
|
|
35
|
+
*/
|
|
36
|
+
export declare function writeSessionCookie(event: H3Event, session: SessionContext, sessionsConfig: {
|
|
37
|
+
cookieOpts: Omit<CookieSerializeOptions, 'sameSite'> & {
|
|
38
|
+
sameSite?: string | boolean;
|
|
39
|
+
};
|
|
40
|
+
secret?: string;
|
|
41
|
+
names: {
|
|
42
|
+
sessionId: string;
|
|
43
|
+
};
|
|
44
|
+
}): void;
|
|
22
45
|
/**
|
|
23
46
|
* Retrieve an existing session from storage.
|
|
24
47
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createError } from "#devcoffee-core/server/adapters/http";
|
|
1
|
+
import { createError, setCookie } from "#devcoffee-core/server/adapters/http";
|
|
2
2
|
import {
|
|
3
3
|
allowInsecureRequests,
|
|
4
4
|
authorizationCodeGrant as authorizationCodeGrantOidc,
|
|
@@ -22,7 +22,14 @@ import { deepMerge, omit } from "#devcoffee-core/server/adapters/utils";
|
|
|
22
22
|
import useServerLogger from "#devcoffee-core/server/composables/useServerLogger";
|
|
23
23
|
import { useRuntimeConfig } from "#imports";
|
|
24
24
|
import { useStorage } from "nitropack/runtime";
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
decryptTokenSet,
|
|
27
|
+
encryptTokenSet,
|
|
28
|
+
generateSessionId,
|
|
29
|
+
isValidSessionId,
|
|
30
|
+
signSessionId,
|
|
31
|
+
verifySessionId
|
|
32
|
+
} from "./crypto.js";
|
|
26
33
|
import { tryAcquireLock } from "./mutex.js";
|
|
27
34
|
function getAnonymousUser(extras) {
|
|
28
35
|
const anonymous = useRuntimeConfig().nuxtCore.authts.auth.anonymousUser;
|
|
@@ -56,6 +63,18 @@ export function isSameOrigin(redirectUrl, requestUrl) {
|
|
|
56
63
|
return false;
|
|
57
64
|
}
|
|
58
65
|
}
|
|
66
|
+
export function writeSessionCookie(event, session, sessionsConfig) {
|
|
67
|
+
const {
|
|
68
|
+
cookieOpts,
|
|
69
|
+
secret = "",
|
|
70
|
+
names: { sessionId: cookieName }
|
|
71
|
+
} = sessionsConfig;
|
|
72
|
+
const cookieValue = secret ? signSessionId(session.id, secret) : session.id;
|
|
73
|
+
setCookie(event, cookieName, cookieValue, {
|
|
74
|
+
...cookieOpts,
|
|
75
|
+
expires: new Date(session.expiresAt)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
59
78
|
export async function getSession(sessionId, opts) {
|
|
60
79
|
const sessingKey = getSessionStorageKey(opts.storagePrefix, sessionId);
|
|
61
80
|
if (!await hasSessionData(opts.storageName, sessingKey)) return null;
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "#devcoffee-core/server/adapters/http";
|
|
8
8
|
import { deepMerge } from "#devcoffee-core/server/adapters/utils";
|
|
9
9
|
import useServerLogger from "#devcoffee-core/server/composables/useServerLogger";
|
|
10
|
-
import { getOpenIdConfiguration } from "./helpers.js";
|
|
10
|
+
import { getOpenIdConfiguration, writeSessionCookie } from "./helpers.js";
|
|
11
11
|
const defaultOpts = {
|
|
12
12
|
logLevel: 2,
|
|
13
13
|
proxyPrefix: ""
|
|
@@ -51,6 +51,15 @@ export default function NuxtForwardRequestHandler(opts) {
|
|
|
51
51
|
};
|
|
52
52
|
logger.info(`from '${event.path}' to '${defaultForwardInit.forwardUrl}' - auth stt='${session?.auth?.status}'`);
|
|
53
53
|
const { forwardUrl, ...proxyOption } = await onBeforeRequest?.(defaultForwardInit, params) || defaultForwardInit;
|
|
54
|
-
|
|
54
|
+
const { sessions } = useRuntimeConfig(event).nuxtCore.authts;
|
|
55
|
+
await proxyRequest(event, forwardUrl, {
|
|
56
|
+
...proxyOption,
|
|
57
|
+
onResponse(proxyEvent, _upstreamResponse) {
|
|
58
|
+
const session2 = proxyEvent.context.session;
|
|
59
|
+
if (session2) {
|
|
60
|
+
writeSessionCookie(proxyEvent, session2, sessions);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
55
64
|
});
|
|
56
65
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { defineNitroPlugin, getCookie,
|
|
1
|
+
import { defineNitroPlugin, getCookie, useRuntimeConfig } from "#devcoffee-core/server/adapters/http";
|
|
2
2
|
import useServerLogger from "#devcoffee-core/server/composables/useServerLogger";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
refreshTokenIfNeeded,
|
|
5
|
+
updateSession,
|
|
6
|
+
validateSession,
|
|
7
|
+
writeSessionCookie
|
|
8
|
+
} from "#devcoffee-core/server/core/helpers";
|
|
5
9
|
import { useNitroApp, useStorage } from "nitropack/runtime";
|
|
6
10
|
export default defineNitroPlugin((nitroApp) => {
|
|
7
11
|
nitroApp.hooks.hook("request", async (event) => {
|
|
@@ -65,18 +69,10 @@ export default defineNitroPlugin((nitroApp) => {
|
|
|
65
69
|
event.context.session = session;
|
|
66
70
|
});
|
|
67
71
|
nitroApp.hooks.hook("beforeResponse", async (event) => {
|
|
68
|
-
|
|
69
|
-
cookieOpts,
|
|
70
|
-
secret = "",
|
|
71
|
-
names: { sessionId: cookieName }
|
|
72
|
-
} = useRuntimeConfig(event).nuxtCore.authts.sessions;
|
|
72
|
+
if (event.node.res.headersSent) return;
|
|
73
73
|
const session = event.context.session;
|
|
74
74
|
if (session) {
|
|
75
|
-
|
|
76
|
-
setCookie(event, cookieName, cookieValue, {
|
|
77
|
-
...cookieOpts,
|
|
78
|
-
expires: new Date(session.expiresAt)
|
|
79
|
-
});
|
|
75
|
+
writeSessionCookie(event, session, useRuntimeConfig(event).nuxtCore.authts.sessions);
|
|
80
76
|
}
|
|
81
77
|
});
|
|
82
78
|
});
|