@workos-inc/authkit-nextjs 0.10.1 → 0.11.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/README.md +56 -10
- package/dist/esm/actions.js +10 -0
- package/dist/esm/actions.js.map +1 -0
- package/dist/esm/auth.js +18 -0
- package/dist/esm/auth.js.map +1 -0
- package/dist/{cjs → esm}/authkit-callback-route.js +14 -17
- package/dist/esm/authkit-callback-route.js.map +1 -0
- package/dist/{cjs/provider.js → esm/authkit-provider.js} +14 -15
- package/dist/esm/authkit-provider.js.map +1 -0
- package/dist/{cjs → esm}/button.js +2 -6
- package/dist/esm/button.js.map +1 -0
- package/dist/{cjs → esm}/cookie.d.ts +1 -2
- package/dist/esm/cookie.js +16 -0
- package/dist/esm/cookie.js.map +1 -0
- package/dist/{cjs → esm}/env-variables.d.ts +6 -5
- package/dist/esm/env-variables.js +16 -0
- package/dist/esm/env-variables.js.map +1 -0
- package/dist/esm/get-authorization-url.js +17 -0
- package/dist/esm/get-authorization-url.js.map +1 -0
- package/dist/{cjs → esm}/impersonation.js +13 -18
- package/dist/esm/impersonation.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/{cjs → esm}/interfaces.d.ts +2 -0
- package/dist/esm/interfaces.js +2 -0
- package/dist/{cjs → esm}/middleware.d.ts +1 -1
- package/dist/esm/middleware.js +7 -0
- package/dist/esm/middleware.js.map +1 -0
- package/dist/esm/min-max-button.js +10 -0
- package/dist/esm/min-max-button.js.map +1 -0
- package/dist/esm/session.d.ts +34 -0
- package/dist/{cjs → esm}/session.js +83 -59
- package/dist/esm/session.js.map +1 -0
- package/dist/{cjs → esm}/workos.d.ts +1 -1
- package/dist/esm/workos.js +16 -0
- package/dist/esm/workos.js.map +1 -0
- package/package.json +6 -6
- package/src/auth.ts +4 -1
- package/src/authkit-callback-route.ts +4 -2
- package/src/{provider.tsx → authkit-provider.tsx} +9 -5
- package/src/cookie.ts +1 -2
- package/src/env-variables.ts +16 -26
- package/src/get-authorization-url.ts +4 -1
- package/src/impersonation.tsx +2 -2
- package/src/index.ts +4 -3
- package/src/interfaces.ts +2 -0
- package/src/middleware.ts +2 -1
- package/src/session.ts +57 -13
- package/src/workos.ts +2 -2
- package/dist/cjs/actions.js +0 -14
- package/dist/cjs/actions.js.map +0 -1
- package/dist/cjs/auth.js +0 -21
- package/dist/cjs/auth.js.map +0 -1
- package/dist/cjs/authkit-callback-route.js.map +0 -1
- package/dist/cjs/button.js.map +0 -1
- package/dist/cjs/cookie.js +0 -21
- package/dist/cjs/cookie.js.map +0 -1
- package/dist/cjs/env-variables.js +0 -35
- package/dist/cjs/env-variables.js.map +0 -1
- package/dist/cjs/get-authorization-url.js +0 -18
- package/dist/cjs/get-authorization-url.js.map +0 -1
- package/dist/cjs/impersonation.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -7
- package/dist/cjs/index.js +0 -19
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/interfaces.js +0 -3
- package/dist/cjs/middleware.js +0 -11
- package/dist/cjs/middleware.js.map +0 -1
- package/dist/cjs/min-max-button.js +0 -15
- package/dist/cjs/min-max-button.js.map +0 -1
- package/dist/cjs/provider.js.map +0 -1
- package/dist/cjs/session.d.ts +0 -20
- package/dist/cjs/session.js.map +0 -1
- package/dist/cjs/workos.js +0 -19
- package/dist/cjs/workos.js.map +0 -1
- /package/dist/{cjs → esm}/actions.d.ts +0 -0
- /package/dist/{cjs → esm}/auth.d.ts +0 -0
- /package/dist/{cjs → esm}/authkit-callback-route.d.ts +0 -0
- /package/dist/{cjs/provider.d.ts → esm/authkit-provider.d.ts} +0 -0
- /package/dist/{cjs → esm}/button.d.ts +0 -0
- /package/dist/{cjs → esm}/get-authorization-url.d.ts +0 -0
- /package/dist/{cjs → esm}/impersonation.d.ts +0 -0
- /package/dist/{cjs → esm}/interfaces.js.map +0 -0
- /package/dist/{cjs → esm}/min-max-button.d.ts +0 -0
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const get_authorization_url_js_1 = require("./get-authorization-url.js");
|
|
13
|
-
const path_to_regexp_1 = require("path-to-regexp");
|
|
1
|
+
'use server';
|
|
2
|
+
import { redirect } from 'next/navigation';
|
|
3
|
+
import { cookies, headers } from 'next/headers';
|
|
4
|
+
import { NextResponse } from 'next/server';
|
|
5
|
+
import { jwtVerify, createRemoteJWKSet, decodeJwt } from 'jose';
|
|
6
|
+
import { sealData, unsealData } from 'iron-session';
|
|
7
|
+
import { cookieOptions } from './cookie.js';
|
|
8
|
+
import { workos } from './workos.js';
|
|
9
|
+
import { WORKOS_CLIENT_ID, WORKOS_COOKIE_PASSWORD, WORKOS_COOKIE_NAME, WORKOS_REDIRECT_URI } from './env-variables.js';
|
|
10
|
+
import { getAuthorizationUrl } from './get-authorization-url.js';
|
|
11
|
+
import { parse, tokensToRegexp } from 'path-to-regexp';
|
|
14
12
|
const sessionHeaderName = 'x-workos-session';
|
|
15
13
|
const middlewareHeaderName = 'x-workos-middleware';
|
|
16
|
-
const
|
|
14
|
+
const redirectUriHeaderName = 'x-redirect-uri';
|
|
15
|
+
const JWKS = createRemoteJWKSet(new URL(workos.userManagement.getJwksUrl(WORKOS_CLIENT_ID)));
|
|
17
16
|
async function encryptSession(session) {
|
|
18
|
-
return
|
|
17
|
+
return sealData(session, { password: WORKOS_COOKIE_PASSWORD });
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
async function updateSession(request, debug, middlewareAuth) {
|
|
19
|
+
async function updateSession(request, debug, middlewareAuth, redirectUri) {
|
|
22
20
|
const session = await getSessionFromCookie();
|
|
23
21
|
const newRequestHeaders = new Headers(request.headers);
|
|
24
22
|
// We store the current request url in a custom header, so we can always have access to it
|
|
@@ -27,8 +25,12 @@ async function updateSession(request, debug, middlewareAuth) {
|
|
|
27
25
|
newRequestHeaders.set('x-url', request.url);
|
|
28
26
|
// Record that the request was routed through the middleware so we can check later for DX purposes
|
|
29
27
|
newRequestHeaders.set(middlewareHeaderName, 'true');
|
|
28
|
+
// If the redirect URI is set, store it in the headers so we can use it later
|
|
29
|
+
if (redirectUri) {
|
|
30
|
+
newRequestHeaders.set(redirectUriHeaderName, redirectUri);
|
|
31
|
+
}
|
|
30
32
|
newRequestHeaders.delete(sessionHeaderName);
|
|
31
|
-
const url = new URL(
|
|
33
|
+
const url = new URL(WORKOS_REDIRECT_URI);
|
|
32
34
|
if (middlewareAuth.enabled &&
|
|
33
35
|
url.pathname === request.nextUrl.pathname &&
|
|
34
36
|
!middlewareAuth.unauthenticatedPaths.includes(url.pathname)) {
|
|
@@ -49,31 +51,32 @@ async function updateSession(request, debug, middlewareAuth) {
|
|
|
49
51
|
if (middlewareAuth.enabled && matchedPaths.length === 0 && !session) {
|
|
50
52
|
if (debug)
|
|
51
53
|
console.log('Unauthenticated user on protected route, redirecting to AuthKit');
|
|
52
|
-
return
|
|
54
|
+
return NextResponse.redirect(await getAuthorizationUrl({ returnPathname: getReturnPathname(request.url) }));
|
|
53
55
|
}
|
|
54
56
|
// If no session, just continue
|
|
55
57
|
if (!session) {
|
|
56
|
-
return
|
|
58
|
+
return NextResponse.next({
|
|
57
59
|
request: { headers: newRequestHeaders },
|
|
58
60
|
});
|
|
59
61
|
}
|
|
60
62
|
const hasValidSession = await verifyAccessToken(session.accessToken);
|
|
63
|
+
const cookieName = WORKOS_COOKIE_NAME || 'wos-session';
|
|
61
64
|
if (hasValidSession) {
|
|
62
65
|
if (debug)
|
|
63
66
|
console.log('Session is valid');
|
|
64
67
|
// set the x-workos-session header according to the current cookie value
|
|
65
|
-
newRequestHeaders.set(sessionHeaderName,
|
|
66
|
-
return
|
|
68
|
+
newRequestHeaders.set(sessionHeaderName, cookies().get(cookieName).value);
|
|
69
|
+
return NextResponse.next({
|
|
67
70
|
request: { headers: newRequestHeaders },
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
try {
|
|
71
74
|
if (debug)
|
|
72
75
|
console.log('Session invalid. Attempting refresh', session.refreshToken);
|
|
73
|
-
const { org_id: organizationId } =
|
|
76
|
+
const { org_id: organizationId } = decodeJwt(session.accessToken);
|
|
74
77
|
// If the session is invalid (i.e. the access token has expired) attempt to re-authenticate with the refresh token
|
|
75
|
-
const { accessToken, refreshToken, user, impersonator } = await
|
|
76
|
-
clientId:
|
|
78
|
+
const { accessToken, refreshToken, user, impersonator } = await workos.userManagement.authenticateWithRefreshToken({
|
|
79
|
+
clientId: WORKOS_CLIENT_ID,
|
|
77
80
|
refreshToken: session.refreshToken,
|
|
78
81
|
organizationId,
|
|
79
82
|
});
|
|
@@ -87,24 +90,23 @@ async function updateSession(request, debug, middlewareAuth) {
|
|
|
87
90
|
impersonator,
|
|
88
91
|
});
|
|
89
92
|
newRequestHeaders.set(sessionHeaderName, encryptedSession);
|
|
90
|
-
const response =
|
|
93
|
+
const response = NextResponse.next({
|
|
91
94
|
request: { headers: newRequestHeaders },
|
|
92
95
|
});
|
|
93
96
|
// update the cookie
|
|
94
|
-
response.cookies.set(
|
|
97
|
+
response.cookies.set(cookieName, encryptedSession, cookieOptions);
|
|
95
98
|
return response;
|
|
96
99
|
}
|
|
97
100
|
catch (e) {
|
|
98
101
|
if (debug)
|
|
99
102
|
console.log('Failed to refresh. Deleting cookie and redirecting.', e);
|
|
100
|
-
const response =
|
|
103
|
+
const response = NextResponse.next({
|
|
101
104
|
request: { headers: newRequestHeaders },
|
|
102
105
|
});
|
|
103
|
-
response.cookies.delete(
|
|
106
|
+
response.cookies.delete(cookieName);
|
|
104
107
|
return response;
|
|
105
108
|
}
|
|
106
109
|
}
|
|
107
|
-
exports.updateSession = updateSession;
|
|
108
110
|
async function refreshSession({ organizationId: nextOrganizationId, ensureSignedIn = false, } = {}) {
|
|
109
111
|
const session = await getSessionFromCookie();
|
|
110
112
|
if (!session) {
|
|
@@ -113,9 +115,9 @@ async function refreshSession({ organizationId: nextOrganizationId, ensureSigned
|
|
|
113
115
|
}
|
|
114
116
|
return { user: null };
|
|
115
117
|
}
|
|
116
|
-
const { org_id: organizationIdFromAccessToken } =
|
|
117
|
-
const { accessToken, refreshToken, user, impersonator } = await
|
|
118
|
-
clientId:
|
|
118
|
+
const { org_id: organizationIdFromAccessToken } = decodeJwt(session.accessToken);
|
|
119
|
+
const { accessToken, refreshToken, user, impersonator } = await workos.userManagement.authenticateWithRefreshToken({
|
|
120
|
+
clientId: WORKOS_CLIENT_ID,
|
|
119
121
|
refreshToken: session.refreshToken,
|
|
120
122
|
organizationId: nextOrganizationId !== null && nextOrganizationId !== void 0 ? nextOrganizationId : organizationIdFromAccessToken,
|
|
121
123
|
});
|
|
@@ -126,8 +128,9 @@ async function refreshSession({ organizationId: nextOrganizationId, ensureSigned
|
|
|
126
128
|
user,
|
|
127
129
|
impersonator,
|
|
128
130
|
});
|
|
129
|
-
|
|
130
|
-
|
|
131
|
+
const cookieName = WORKOS_COOKIE_NAME || 'wos-session';
|
|
132
|
+
cookies().set(cookieName, encryptedSession, cookieOptions);
|
|
133
|
+
const { sid: sessionId, org_id: organizationId, role, permissions } = decodeJwt(accessToken);
|
|
131
134
|
return {
|
|
132
135
|
sessionId,
|
|
133
136
|
user: session.user,
|
|
@@ -138,15 +141,14 @@ async function refreshSession({ organizationId: nextOrganizationId, ensureSigned
|
|
|
138
141
|
accessToken: session.accessToken,
|
|
139
142
|
};
|
|
140
143
|
}
|
|
141
|
-
exports.refreshSession = refreshSession;
|
|
142
144
|
function getMiddlewareAuthPathRegex(pathGlob) {
|
|
143
145
|
let regex;
|
|
144
146
|
try {
|
|
145
147
|
// Redirect URI is only used to construct the URL
|
|
146
|
-
const url = new URL(pathGlob,
|
|
148
|
+
const url = new URL(pathGlob, WORKOS_REDIRECT_URI);
|
|
147
149
|
const path = `${url.pathname}${url.hash || ''}`;
|
|
148
|
-
const tokens =
|
|
149
|
-
regex =
|
|
150
|
+
const tokens = parse(path);
|
|
151
|
+
regex = tokensToRegexp(tokens).source;
|
|
150
152
|
return new RegExp(regex);
|
|
151
153
|
}
|
|
152
154
|
catch (err) {
|
|
@@ -155,19 +157,19 @@ function getMiddlewareAuthPathRegex(pathGlob) {
|
|
|
155
157
|
}
|
|
156
158
|
}
|
|
157
159
|
async function redirectToSignIn() {
|
|
158
|
-
const url =
|
|
160
|
+
const url = headers().get('x-url');
|
|
159
161
|
const returnPathname = url ? getReturnPathname(url) : undefined;
|
|
160
|
-
|
|
162
|
+
redirect(await getAuthorizationUrl({ returnPathname }));
|
|
161
163
|
}
|
|
162
|
-
async function
|
|
163
|
-
const session = await getSessionFromHeader(
|
|
164
|
+
async function withAuth({ ensureSignedIn = false } = {}) {
|
|
165
|
+
const session = await getSessionFromHeader();
|
|
164
166
|
if (!session) {
|
|
165
167
|
if (ensureSignedIn) {
|
|
166
168
|
await redirectToSignIn();
|
|
167
169
|
}
|
|
168
170
|
return { user: null };
|
|
169
171
|
}
|
|
170
|
-
const { sid: sessionId, org_id: organizationId, role, permissions } =
|
|
172
|
+
const { sid: sessionId, org_id: organizationId, role, permissions } = decodeJwt(session.accessToken);
|
|
171
173
|
return {
|
|
172
174
|
sessionId,
|
|
173
175
|
user: session.user,
|
|
@@ -178,44 +180,66 @@ async function getUser({ ensureSignedIn = false } = {}) {
|
|
|
178
180
|
accessToken: session.accessToken,
|
|
179
181
|
};
|
|
180
182
|
}
|
|
181
|
-
exports.getUser = getUser;
|
|
182
183
|
async function terminateSession() {
|
|
183
|
-
const { sessionId } = await
|
|
184
|
+
const { sessionId } = await withAuth();
|
|
184
185
|
if (sessionId) {
|
|
185
|
-
|
|
186
|
+
redirect(workos.userManagement.getLogoutUrl({ sessionId }));
|
|
186
187
|
}
|
|
187
|
-
|
|
188
|
+
redirect('/');
|
|
188
189
|
}
|
|
189
|
-
exports.terminateSession = terminateSession;
|
|
190
190
|
async function verifyAccessToken(accessToken) {
|
|
191
191
|
try {
|
|
192
|
-
await
|
|
192
|
+
await jwtVerify(accessToken, JWKS);
|
|
193
193
|
return true;
|
|
194
194
|
}
|
|
195
195
|
catch (e) {
|
|
196
196
|
return false;
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
|
-
async function getSessionFromCookie() {
|
|
200
|
-
const
|
|
199
|
+
async function getSessionFromCookie(response) {
|
|
200
|
+
const cookieName = WORKOS_COOKIE_NAME || 'wos-session';
|
|
201
|
+
const cookie = response ? response.cookies.get(cookieName) : cookies().get(cookieName);
|
|
201
202
|
if (cookie) {
|
|
202
|
-
return
|
|
203
|
-
password:
|
|
203
|
+
return unsealData(cookie.value, {
|
|
204
|
+
password: WORKOS_COOKIE_PASSWORD,
|
|
204
205
|
});
|
|
205
206
|
}
|
|
206
207
|
}
|
|
207
|
-
|
|
208
|
-
|
|
208
|
+
/**
|
|
209
|
+
* Retrieves the session from the cookie. Meant for use in the middleware, for client side use `withAuth` instead.
|
|
210
|
+
*
|
|
211
|
+
* @returns Session | undefined
|
|
212
|
+
*/
|
|
213
|
+
async function getSession(response) {
|
|
214
|
+
const session = await getSessionFromCookie(response);
|
|
215
|
+
if (!session)
|
|
216
|
+
return;
|
|
217
|
+
if (await verifyAccessToken(session.accessToken)) {
|
|
218
|
+
const { sid: sessionId, org_id: organizationId, role, permissions } = decodeJwt(session.accessToken);
|
|
219
|
+
return {
|
|
220
|
+
sessionId,
|
|
221
|
+
user: session.user,
|
|
222
|
+
organizationId,
|
|
223
|
+
role,
|
|
224
|
+
permissions,
|
|
225
|
+
impersonator: session.impersonator,
|
|
226
|
+
accessToken: session.accessToken,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function getSessionFromHeader() {
|
|
231
|
+
const hasMiddleware = Boolean(headers().get(middlewareHeaderName));
|
|
209
232
|
if (!hasMiddleware) {
|
|
210
|
-
throw new Error(
|
|
233
|
+
throw new Error("You are calling 'withAuth' on a path that isn’t covered by the AuthKit middleware. Make sure it is running on all paths you are calling `${caller}` from by updating your middleware config in `middleware.(js|ts)`.");
|
|
211
234
|
}
|
|
212
|
-
const authHeader =
|
|
235
|
+
const authHeader = headers().get(sessionHeaderName);
|
|
213
236
|
if (!authHeader)
|
|
214
237
|
return;
|
|
215
|
-
return
|
|
238
|
+
return unsealData(authHeader, { password: WORKOS_COOKIE_PASSWORD });
|
|
216
239
|
}
|
|
217
240
|
function getReturnPathname(url) {
|
|
218
241
|
const newUrl = new URL(url);
|
|
219
242
|
return `${newUrl.pathname}${newUrl.searchParams.size > 0 ? '?' + newUrl.searchParams.toString() : ''}`;
|
|
220
243
|
}
|
|
244
|
+
export { encryptSession, withAuth, refreshSession, terminateSession, updateSession, getSession };
|
|
221
245
|
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { WorkOS } from '@workos-inc/node';
|
|
2
|
+
import { WORKOS_API_HOSTNAME, WORKOS_API_KEY, WORKOS_API_HTTPS, WORKOS_API_PORT } from './env-variables.js';
|
|
3
|
+
export const VERSION = '0.11.1';
|
|
4
|
+
const options = {
|
|
5
|
+
apiHostname: WORKOS_API_HOSTNAME,
|
|
6
|
+
https: WORKOS_API_HTTPS ? WORKOS_API_HTTPS === 'true' : true,
|
|
7
|
+
port: WORKOS_API_PORT ? parseInt(WORKOS_API_PORT) : undefined,
|
|
8
|
+
appInfo: {
|
|
9
|
+
name: 'authkit/nextjs',
|
|
10
|
+
version: VERSION,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
// Initialize the WorkOS client
|
|
14
|
+
const workos = new WorkOS(WORKOS_API_KEY, options);
|
|
15
|
+
export { workos };
|
|
16
|
+
//# sourceMappingURL=workos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workos.js","sourceRoot":"","sources":["../../src/workos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE5G,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEhC,MAAM,OAAO,GAAG;IACd,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI;IAC5D,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;IAC7D,OAAO,EAAE;QACP,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB;CACF,CAAC;AAEF,+BAA+B;AAC/B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workos-inc/authkit-nextjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"description": "Authentication and session helpers for using WorkOS & AuthKit with Next.js",
|
|
5
5
|
"sideEffects": false,
|
|
6
|
-
"type": "
|
|
7
|
-
"main": "./dist/
|
|
8
|
-
"types": "./dist/
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/esm/index.js",
|
|
8
|
+
"types": "./dist/esm/index.d.ts",
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
11
|
"src",
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
"scripts": {
|
|
16
16
|
"clean": "rm -rf dist",
|
|
17
17
|
"prebuild": "npm run clean",
|
|
18
|
-
"build": "tsc --project tsconfig
|
|
18
|
+
"build": "tsc --project tsconfig.json",
|
|
19
19
|
"prepublishOnly": "npm run lint",
|
|
20
20
|
"lint": "eslint \"src/**/*.ts*\"",
|
|
21
21
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@workos-inc/node": "7.
|
|
24
|
+
"@workos-inc/node": "7.26.0",
|
|
25
25
|
"iron-session": "^8.0.1",
|
|
26
26
|
"jose": "^5.2.3",
|
|
27
27
|
"path-to-regexp": "^6.2.2"
|
package/src/auth.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
1
3
|
import { getAuthorizationUrl } from './get-authorization-url.js';
|
|
2
4
|
import { cookies } from 'next/headers';
|
|
3
|
-
import { cookieName } from './cookie.js';
|
|
4
5
|
import { terminateSession } from './session.js';
|
|
6
|
+
import { WORKOS_COOKIE_NAME } from './env-variables.js';
|
|
5
7
|
|
|
6
8
|
async function getSignInUrl({ organizationId }: { organizationId?: string } = {}) {
|
|
7
9
|
return getAuthorizationUrl({ organizationId, screenHint: 'sign-in' });
|
|
@@ -12,6 +14,7 @@ async function getSignUpUrl() {
|
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
async function signOut() {
|
|
17
|
+
const cookieName = WORKOS_COOKIE_NAME || 'wos-session';
|
|
15
18
|
cookies().delete(cookieName);
|
|
16
19
|
await terminateSession();
|
|
17
20
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { cookies } from 'next/headers';
|
|
3
3
|
import { workos } from './workos.js';
|
|
4
|
-
import { WORKOS_CLIENT_ID } from './env-variables.js';
|
|
4
|
+
import { WORKOS_CLIENT_ID, WORKOS_COOKIE_NAME } from './env-variables.js';
|
|
5
5
|
import { encryptSession } from './session.js';
|
|
6
|
-
import {
|
|
6
|
+
import { cookieOptions } from './cookie.js';
|
|
7
7
|
import { HandleAuthOptions } from './interfaces.js';
|
|
8
8
|
|
|
9
9
|
export function handleAuth(options: HandleAuthOptions = {}) {
|
|
@@ -50,6 +50,8 @@ export function handleAuth(options: HandleAuthOptions = {}) {
|
|
|
50
50
|
// The refreshToken should never be accesible publicly, hence why we encrypt it in the cookie session
|
|
51
51
|
// Alternatively you could persist the refresh token in a backend database
|
|
52
52
|
const session = await encryptSession({ accessToken, refreshToken, user, impersonator });
|
|
53
|
+
const cookieName = WORKOS_COOKIE_NAME || 'wos-session';
|
|
54
|
+
|
|
53
55
|
cookies().set(cookieName, session, cookieOptions);
|
|
54
56
|
|
|
55
57
|
return response;
|
|
@@ -12,7 +12,7 @@ interface AuthKitProviderProps {
|
|
|
12
12
|
onSessionExpired?: false | (() => void);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export const AuthKitProvider = ({ children, onSessionExpired
|
|
15
|
+
export const AuthKitProvider = ({ children, onSessionExpired }: AuthKitProviderProps) => {
|
|
16
16
|
React.useEffect(() => {
|
|
17
17
|
// Return early if the session expired checks are disabled.
|
|
18
18
|
if (onSessionExpired === false) {
|
|
@@ -38,10 +38,14 @@ export const AuthKitProvider = ({ children, onSessionExpired = false }: AuthKitP
|
|
|
38
38
|
throw new Error('Session expired');
|
|
39
39
|
}
|
|
40
40
|
} catch (error) {
|
|
41
|
-
if
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
// 'Failed to fetch' is the error we are looking for if the action fails
|
|
42
|
+
// If any other error happens, for other reasons, we should not reload the page
|
|
43
|
+
if (error instanceof Error && error.message.includes('Failed to fetch')) {
|
|
44
|
+
if (onSessionExpired) {
|
|
45
|
+
onSessionExpired();
|
|
46
|
+
} else {
|
|
47
|
+
window.location.reload();
|
|
48
|
+
}
|
|
45
49
|
}
|
|
46
50
|
} finally {
|
|
47
51
|
visibilityChangedCalled = false;
|
package/src/cookie.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { WORKOS_REDIRECT_URI, WORKOS_COOKIE_MAX_AGE, WORKOS_COOKIE_DOMAIN } from
|
|
|
3
3
|
const redirectUrl = new URL(WORKOS_REDIRECT_URI);
|
|
4
4
|
const isSecureProtocol = redirectUrl.protocol === 'https:';
|
|
5
5
|
|
|
6
|
-
const cookieName = 'wos-session';
|
|
7
6
|
const cookieOptions = {
|
|
8
7
|
path: '/',
|
|
9
8
|
httpOnly: true,
|
|
@@ -16,4 +15,4 @@ const cookieOptions = {
|
|
|
16
15
|
domain: WORKOS_COOKIE_DOMAIN,
|
|
17
16
|
};
|
|
18
17
|
|
|
19
|
-
export {
|
|
18
|
+
export { cookieOptions };
|
package/src/env-variables.ts
CHANGED
|
@@ -1,37 +1,27 @@
|
|
|
1
|
-
function getEnvVariable(name: string): string {
|
|
2
|
-
const envVariable = process.env[name];
|
|
3
|
-
if (!envVariable) {
|
|
4
|
-
throw new Error(`${name} environment variable is not set`);
|
|
5
|
-
}
|
|
6
|
-
return envVariable;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function getOptionalEnvVariable(name: string): string | undefined {
|
|
1
|
+
function getEnvVariable(name: string): string | undefined {
|
|
10
2
|
return process.env[name];
|
|
11
3
|
}
|
|
12
4
|
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
if (WORKOS_COOKIE_PASSWORD.length < 32) {
|
|
24
|
-
throw new Error('WORKOS_COOKIE_PASSWORD must be at least 32 characters long');
|
|
25
|
-
}
|
|
5
|
+
const WORKOS_API_HOSTNAME = getEnvVariable('WORKOS_API_HOSTNAME');
|
|
6
|
+
const WORKOS_API_HTTPS = getEnvVariable('WORKOS_API_HTTPS');
|
|
7
|
+
const WORKOS_API_KEY = getEnvVariable('WORKOS_API_KEY') ?? '';
|
|
8
|
+
const WORKOS_API_PORT = getEnvVariable('WORKOS_API_PORT');
|
|
9
|
+
const WORKOS_CLIENT_ID = getEnvVariable('WORKOS_CLIENT_ID') ?? '';
|
|
10
|
+
const WORKOS_COOKIE_DOMAIN = getEnvVariable('WORKOS_COOKIE_DOMAIN');
|
|
11
|
+
const WORKOS_COOKIE_MAX_AGE = getEnvVariable('WORKOS_COOKIE_MAX_AGE');
|
|
12
|
+
const WORKOS_COOKIE_NAME = getEnvVariable('WORKOS_COOKIE_NAME');
|
|
13
|
+
const WORKOS_COOKIE_PASSWORD = getEnvVariable('WORKOS_COOKIE_PASSWORD') ?? '';
|
|
14
|
+
const WORKOS_REDIRECT_URI = process.env.NEXT_PUBLIC_WORKOS_REDIRECT_URI ?? '';
|
|
26
15
|
|
|
27
16
|
export {
|
|
28
|
-
WORKOS_CLIENT_ID,
|
|
29
|
-
WORKOS_API_KEY,
|
|
30
|
-
WORKOS_REDIRECT_URI,
|
|
31
|
-
WORKOS_COOKIE_PASSWORD,
|
|
32
17
|
WORKOS_API_HOSTNAME,
|
|
33
18
|
WORKOS_API_HTTPS,
|
|
19
|
+
WORKOS_API_KEY,
|
|
34
20
|
WORKOS_API_PORT,
|
|
21
|
+
WORKOS_CLIENT_ID,
|
|
35
22
|
WORKOS_COOKIE_DOMAIN,
|
|
36
23
|
WORKOS_COOKIE_MAX_AGE,
|
|
24
|
+
WORKOS_COOKIE_NAME,
|
|
25
|
+
WORKOS_COOKIE_PASSWORD,
|
|
26
|
+
WORKOS_REDIRECT_URI,
|
|
37
27
|
};
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { workos } from './workos.js';
|
|
2
2
|
import { WORKOS_CLIENT_ID, WORKOS_REDIRECT_URI } from './env-variables.js';
|
|
3
3
|
import { GetAuthURLOptions } from './interfaces.js';
|
|
4
|
+
import { headers } from 'next/headers';
|
|
4
5
|
|
|
5
6
|
async function getAuthorizationUrl(options: GetAuthURLOptions = {}) {
|
|
6
7
|
const { returnPathname, screenHint, organizationId } = options;
|
|
7
8
|
|
|
9
|
+
const redirectUri = headers().get('x-redirect-uri');
|
|
10
|
+
|
|
8
11
|
return workos.userManagement.getAuthorizationUrl({
|
|
9
12
|
provider: 'authkit',
|
|
10
13
|
clientId: WORKOS_CLIENT_ID,
|
|
11
|
-
redirectUri: WORKOS_REDIRECT_URI,
|
|
14
|
+
redirectUri: redirectUri ?? WORKOS_REDIRECT_URI,
|
|
12
15
|
state: returnPathname ? btoa(JSON.stringify({ returnPathname })) : undefined,
|
|
13
16
|
screenHint,
|
|
14
17
|
organizationId,
|
package/src/impersonation.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { withAuth } from './session.js';
|
|
3
3
|
import { signOut } from './auth.js';
|
|
4
4
|
import { workos } from './workos.js';
|
|
5
5
|
import { Button } from './button.js';
|
|
@@ -10,7 +10,7 @@ interface ImpersonationProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export async function Impersonation({ side = 'bottom', ...props }: ImpersonationProps) {
|
|
13
|
-
const { impersonator, user, organizationId } = await
|
|
13
|
+
const { impersonator, user, organizationId } = await withAuth();
|
|
14
14
|
|
|
15
15
|
if (!impersonator) return null;
|
|
16
16
|
|
package/src/index.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { handleAuth } from './authkit-callback-route.js';
|
|
2
2
|
import { authkitMiddleware } from './middleware.js';
|
|
3
|
-
import {
|
|
3
|
+
import { withAuth, refreshSession, getSession } from './session.js';
|
|
4
4
|
import { getSignInUrl, getSignUpUrl, signOut } from './auth.js';
|
|
5
5
|
import { Impersonation } from './impersonation.js';
|
|
6
|
-
import { AuthKitProvider } from './provider.js';
|
|
6
|
+
import { AuthKitProvider } from './authkit-provider.js';
|
|
7
7
|
|
|
8
8
|
export {
|
|
9
9
|
handleAuth,
|
|
10
10
|
//
|
|
11
11
|
authkitMiddleware,
|
|
12
|
+
getSession,
|
|
12
13
|
//
|
|
13
14
|
getSignInUrl,
|
|
14
15
|
getSignUpUrl,
|
|
15
|
-
|
|
16
|
+
withAuth,
|
|
16
17
|
refreshSession,
|
|
17
18
|
signOut,
|
|
18
19
|
//
|
package/src/interfaces.ts
CHANGED
|
@@ -44,6 +44,7 @@ export interface GetAuthURLOptions {
|
|
|
44
44
|
screenHint?: 'sign-up' | 'sign-in';
|
|
45
45
|
returnPathname?: string;
|
|
46
46
|
organizationId?: string;
|
|
47
|
+
redirectUri?: string;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
export interface AuthkitMiddlewareAuth {
|
|
@@ -54,4 +55,5 @@ export interface AuthkitMiddlewareAuth {
|
|
|
54
55
|
export interface AuthkitMiddlewareOptions {
|
|
55
56
|
debug?: boolean;
|
|
56
57
|
middlewareAuth?: AuthkitMiddlewareAuth;
|
|
58
|
+
redirectUri?: string;
|
|
57
59
|
}
|
package/src/middleware.ts
CHANGED
|
@@ -5,8 +5,9 @@ import { AuthkitMiddlewareOptions } from './interfaces.js';
|
|
|
5
5
|
export function authkitMiddleware({
|
|
6
6
|
debug = false,
|
|
7
7
|
middlewareAuth = { enabled: false, unauthenticatedPaths: [] },
|
|
8
|
+
redirectUri = '',
|
|
8
9
|
}: AuthkitMiddlewareOptions = {}): NextMiddleware {
|
|
9
10
|
return function (request) {
|
|
10
|
-
return updateSession(request, debug, middlewareAuth);
|
|
11
|
+
return updateSession(request, debug, middlewareAuth, redirectUri);
|
|
11
12
|
};
|
|
12
13
|
}
|