@workos-inc/authkit-nextjs 0.4.0 → 0.4.1
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/dist/cjs/session.js +19 -8
- package/dist/cjs/session.js.map +1 -1
- package/package.json +1 -1
- package/src/session.ts +25 -8
package/dist/cjs/session.js
CHANGED
|
@@ -11,6 +11,7 @@ const workos_js_1 = require("./workos.js");
|
|
|
11
11
|
const env_variables_js_1 = require("./env-variables.js");
|
|
12
12
|
const get_authorization_url_js_1 = require("./get-authorization-url.js");
|
|
13
13
|
const sessionHeaderName = 'x-workos-session';
|
|
14
|
+
const middlewareHeaderName = 'x-workos-middleware';
|
|
14
15
|
const JWKS = (0, jose_1.createRemoteJWKSet)(new URL(workos_js_1.workos.userManagement.getJwksUrl(env_variables_js_1.WORKOS_CLIENT_ID)));
|
|
15
16
|
async function encryptSession(session) {
|
|
16
17
|
return (0, iron_session_1.sealData)(session, { password: env_variables_js_1.WORKOS_COOKIE_PASSWORD });
|
|
@@ -18,19 +19,27 @@ async function encryptSession(session) {
|
|
|
18
19
|
exports.encryptSession = encryptSession;
|
|
19
20
|
async function updateSession(request, debug) {
|
|
20
21
|
const session = await getSessionFromCookie();
|
|
22
|
+
const newRequestHeaders = new Headers(request.headers);
|
|
23
|
+
// We store the current request url in a custom header, so we can always have access to it
|
|
24
|
+
// This is because on hard navigations we don't have access to `next-url` but need to get the current
|
|
25
|
+
// `pathname` to be able to return the users where they came from before sign-in
|
|
26
|
+
newRequestHeaders.set('x-url', request.url);
|
|
27
|
+
// Record that the request was routed through the middleware so we can check later for DX purposes
|
|
28
|
+
newRequestHeaders.set(middlewareHeaderName, 'true');
|
|
21
29
|
// If no session, just continue
|
|
22
30
|
if (!session) {
|
|
23
|
-
return server_1.NextResponse.next(
|
|
31
|
+
return server_1.NextResponse.next({
|
|
32
|
+
request: { headers: newRequestHeaders },
|
|
33
|
+
});
|
|
24
34
|
}
|
|
25
35
|
const hasValidSession = await verifyAccessToken(session.accessToken);
|
|
26
|
-
const newRequestHeaders = new Headers(request.headers);
|
|
27
36
|
if (hasValidSession) {
|
|
28
37
|
if (debug)
|
|
29
38
|
console.log('Session is valid');
|
|
30
39
|
// set the x-workos-session header according to the current cookie value
|
|
31
40
|
newRequestHeaders.set(sessionHeaderName, (0, headers_1.cookies)().get(cookie_js_1.cookieName).value);
|
|
32
41
|
return server_1.NextResponse.next({
|
|
33
|
-
headers: newRequestHeaders,
|
|
42
|
+
request: { headers: newRequestHeaders },
|
|
34
43
|
});
|
|
35
44
|
}
|
|
36
45
|
try {
|
|
@@ -52,9 +61,7 @@ async function updateSession(request, debug) {
|
|
|
52
61
|
});
|
|
53
62
|
newRequestHeaders.set(sessionHeaderName, encryptedSession);
|
|
54
63
|
const response = server_1.NextResponse.next({
|
|
55
|
-
request: {
|
|
56
|
-
headers: newRequestHeaders,
|
|
57
|
-
},
|
|
64
|
+
request: { headers: newRequestHeaders },
|
|
58
65
|
});
|
|
59
66
|
// update the cookie
|
|
60
67
|
response.cookies.set(cookie_js_1.cookieName, encryptedSession, cookie_js_1.cookieOptions);
|
|
@@ -69,11 +76,15 @@ async function updateSession(request, debug) {
|
|
|
69
76
|
}
|
|
70
77
|
exports.updateSession = updateSession;
|
|
71
78
|
async function getUser({ ensureSignedIn = false } = {}) {
|
|
72
|
-
|
|
79
|
+
const hasMiddleware = Boolean((0, headers_1.headers)().get(middlewareHeaderName));
|
|
80
|
+
if (!hasMiddleware) {
|
|
81
|
+
throw new Error('You are calling `getUser` on a path that isn’t covered by the AuthKit middleware. Make sure it is running on all paths you are calling `getUser` from by updating your middleware config in `middleware.(js|ts)`.');
|
|
82
|
+
}
|
|
73
83
|
const session = await getSessionFromHeader();
|
|
74
84
|
if (!session) {
|
|
75
85
|
if (ensureSignedIn) {
|
|
76
|
-
const
|
|
86
|
+
const url = (0, headers_1.headers)().get('x-url');
|
|
87
|
+
const returnPathname = url ? new URL(url).pathname : undefined;
|
|
77
88
|
(0, navigation_1.redirect)(await (0, get_authorization_url_js_1.getAuthorizationUrl)(returnPathname));
|
|
78
89
|
}
|
|
79
90
|
return { user: null };
|
package/dist/cjs/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":";;;AAAA,gDAA2C;AAC3C,0CAAgD;AAChD,wCAAwD;AACxD,+BAAgE;AAChE,+CAAoD;AACpD,2CAAwD;AACxD,2CAAqC;AACrC,yDAA8E;AAC9E,yEAAiE;AAGjE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/session.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { getAuthorizationUrl } from './get-authorization-url.js';
|
|
|
10
10
|
import { AccessToken, NoUserInfo, Session, UserInfo } from './interfaces.js';
|
|
11
11
|
|
|
12
12
|
const sessionHeaderName = 'x-workos-session';
|
|
13
|
+
const middlewareHeaderName = 'x-workos-middleware';
|
|
13
14
|
|
|
14
15
|
const JWKS = createRemoteJWKSet(new URL(workos.userManagement.getJwksUrl(WORKOS_CLIENT_ID)));
|
|
15
16
|
|
|
@@ -19,22 +20,31 @@ async function encryptSession(session: Session) {
|
|
|
19
20
|
|
|
20
21
|
async function updateSession(request: NextRequest, debug: boolean) {
|
|
21
22
|
const session = await getSessionFromCookie();
|
|
23
|
+
const newRequestHeaders = new Headers(request.headers);
|
|
24
|
+
|
|
25
|
+
// We store the current request url in a custom header, so we can always have access to it
|
|
26
|
+
// This is because on hard navigations we don't have access to `next-url` but need to get the current
|
|
27
|
+
// `pathname` to be able to return the users where they came from before sign-in
|
|
28
|
+
newRequestHeaders.set('x-url', request.url);
|
|
29
|
+
|
|
30
|
+
// Record that the request was routed through the middleware so we can check later for DX purposes
|
|
31
|
+
newRequestHeaders.set(middlewareHeaderName, 'true');
|
|
22
32
|
|
|
23
33
|
// If no session, just continue
|
|
24
34
|
if (!session) {
|
|
25
|
-
return NextResponse.next(
|
|
35
|
+
return NextResponse.next({
|
|
36
|
+
request: { headers: newRequestHeaders },
|
|
37
|
+
});
|
|
26
38
|
}
|
|
27
39
|
|
|
28
40
|
const hasValidSession = await verifyAccessToken(session.accessToken);
|
|
29
41
|
|
|
30
|
-
const newRequestHeaders = new Headers(request.headers);
|
|
31
|
-
|
|
32
42
|
if (hasValidSession) {
|
|
33
43
|
if (debug) console.log('Session is valid');
|
|
34
44
|
// set the x-workos-session header according to the current cookie value
|
|
35
45
|
newRequestHeaders.set(sessionHeaderName, cookies().get(cookieName)!.value);
|
|
36
46
|
return NextResponse.next({
|
|
37
|
-
headers: newRequestHeaders,
|
|
47
|
+
request: { headers: newRequestHeaders },
|
|
38
48
|
});
|
|
39
49
|
}
|
|
40
50
|
|
|
@@ -60,9 +70,7 @@ async function updateSession(request: NextRequest, debug: boolean) {
|
|
|
60
70
|
newRequestHeaders.set(sessionHeaderName, encryptedSession);
|
|
61
71
|
|
|
62
72
|
const response = NextResponse.next({
|
|
63
|
-
request: {
|
|
64
|
-
headers: newRequestHeaders,
|
|
65
|
-
},
|
|
73
|
+
request: { headers: newRequestHeaders },
|
|
66
74
|
});
|
|
67
75
|
// update the cookie
|
|
68
76
|
response.cookies.set(cookieName, encryptedSession, cookieOptions);
|
|
@@ -80,10 +88,19 @@ async function getUser(options?: { ensureSignedIn: false }): Promise<UserInfo |
|
|
|
80
88
|
async function getUser(options: { ensureSignedIn: true }): Promise<UserInfo>;
|
|
81
89
|
|
|
82
90
|
async function getUser({ ensureSignedIn = false } = {}) {
|
|
91
|
+
const hasMiddleware = Boolean(headers().get(middlewareHeaderName));
|
|
92
|
+
|
|
93
|
+
if (!hasMiddleware) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
'You are calling `getUser` on a path that isn’t covered by the AuthKit middleware. Make sure it is running on all paths you are calling `getUser` from by updating your middleware config in `middleware.(js|ts)`.',
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
83
99
|
const session = await getSessionFromHeader();
|
|
84
100
|
if (!session) {
|
|
85
101
|
if (ensureSignedIn) {
|
|
86
|
-
const
|
|
102
|
+
const url = headers().get('x-url');
|
|
103
|
+
const returnPathname = url ? new URL(url).pathname : undefined;
|
|
87
104
|
redirect(await getAuthorizationUrl(returnPathname));
|
|
88
105
|
}
|
|
89
106
|
return { user: null };
|