@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.
Files changed (85) hide show
  1. package/README.md +56 -10
  2. package/dist/esm/actions.js +10 -0
  3. package/dist/esm/actions.js.map +1 -0
  4. package/dist/esm/auth.js +18 -0
  5. package/dist/esm/auth.js.map +1 -0
  6. package/dist/{cjs → esm}/authkit-callback-route.js +14 -17
  7. package/dist/esm/authkit-callback-route.js.map +1 -0
  8. package/dist/{cjs/provider.js → esm/authkit-provider.js} +14 -15
  9. package/dist/esm/authkit-provider.js.map +1 -0
  10. package/dist/{cjs → esm}/button.js +2 -6
  11. package/dist/esm/button.js.map +1 -0
  12. package/dist/{cjs → esm}/cookie.d.ts +1 -2
  13. package/dist/esm/cookie.js +16 -0
  14. package/dist/esm/cookie.js.map +1 -0
  15. package/dist/{cjs → esm}/env-variables.d.ts +6 -5
  16. package/dist/esm/env-variables.js +16 -0
  17. package/dist/esm/env-variables.js.map +1 -0
  18. package/dist/esm/get-authorization-url.js +17 -0
  19. package/dist/esm/get-authorization-url.js.map +1 -0
  20. package/dist/{cjs → esm}/impersonation.js +13 -18
  21. package/dist/esm/impersonation.js.map +1 -0
  22. package/dist/esm/index.d.ts +7 -0
  23. package/dist/esm/index.js +14 -0
  24. package/dist/esm/index.js.map +1 -0
  25. package/dist/{cjs → esm}/interfaces.d.ts +2 -0
  26. package/dist/esm/interfaces.js +2 -0
  27. package/dist/{cjs → esm}/middleware.d.ts +1 -1
  28. package/dist/esm/middleware.js +7 -0
  29. package/dist/esm/middleware.js.map +1 -0
  30. package/dist/esm/min-max-button.js +10 -0
  31. package/dist/esm/min-max-button.js.map +1 -0
  32. package/dist/esm/session.d.ts +34 -0
  33. package/dist/{cjs → esm}/session.js +83 -59
  34. package/dist/esm/session.js.map +1 -0
  35. package/dist/{cjs → esm}/workos.d.ts +1 -1
  36. package/dist/esm/workos.js +16 -0
  37. package/dist/esm/workos.js.map +1 -0
  38. package/package.json +6 -6
  39. package/src/auth.ts +4 -1
  40. package/src/authkit-callback-route.ts +4 -2
  41. package/src/{provider.tsx → authkit-provider.tsx} +9 -5
  42. package/src/cookie.ts +1 -2
  43. package/src/env-variables.ts +16 -26
  44. package/src/get-authorization-url.ts +4 -1
  45. package/src/impersonation.tsx +2 -2
  46. package/src/index.ts +4 -3
  47. package/src/interfaces.ts +2 -0
  48. package/src/middleware.ts +2 -1
  49. package/src/session.ts +57 -13
  50. package/src/workos.ts +2 -2
  51. package/dist/cjs/actions.js +0 -14
  52. package/dist/cjs/actions.js.map +0 -1
  53. package/dist/cjs/auth.js +0 -21
  54. package/dist/cjs/auth.js.map +0 -1
  55. package/dist/cjs/authkit-callback-route.js.map +0 -1
  56. package/dist/cjs/button.js.map +0 -1
  57. package/dist/cjs/cookie.js +0 -21
  58. package/dist/cjs/cookie.js.map +0 -1
  59. package/dist/cjs/env-variables.js +0 -35
  60. package/dist/cjs/env-variables.js.map +0 -1
  61. package/dist/cjs/get-authorization-url.js +0 -18
  62. package/dist/cjs/get-authorization-url.js.map +0 -1
  63. package/dist/cjs/impersonation.js.map +0 -1
  64. package/dist/cjs/index.d.ts +0 -7
  65. package/dist/cjs/index.js +0 -19
  66. package/dist/cjs/index.js.map +0 -1
  67. package/dist/cjs/interfaces.js +0 -3
  68. package/dist/cjs/middleware.js +0 -11
  69. package/dist/cjs/middleware.js.map +0 -1
  70. package/dist/cjs/min-max-button.js +0 -15
  71. package/dist/cjs/min-max-button.js.map +0 -1
  72. package/dist/cjs/provider.js.map +0 -1
  73. package/dist/cjs/session.d.ts +0 -20
  74. package/dist/cjs/session.js.map +0 -1
  75. package/dist/cjs/workos.js +0 -19
  76. package/dist/cjs/workos.js.map +0 -1
  77. /package/dist/{cjs → esm}/actions.d.ts +0 -0
  78. /package/dist/{cjs → esm}/auth.d.ts +0 -0
  79. /package/dist/{cjs → esm}/authkit-callback-route.d.ts +0 -0
  80. /package/dist/{cjs/provider.d.ts → esm/authkit-provider.d.ts} +0 -0
  81. /package/dist/{cjs → esm}/button.d.ts +0 -0
  82. /package/dist/{cjs → esm}/get-authorization-url.d.ts +0 -0
  83. /package/dist/{cjs → esm}/impersonation.d.ts +0 -0
  84. /package/dist/{cjs → esm}/interfaces.js.map +0 -0
  85. /package/dist/{cjs → esm}/min-max-button.d.ts +0 -0
@@ -1,24 +1,22 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateSession = exports.terminateSession = exports.refreshSession = exports.getUser = exports.encryptSession = void 0;
4
- const navigation_1 = require("next/navigation");
5
- const headers_1 = require("next/headers");
6
- const server_1 = require("next/server");
7
- const jose_1 = require("jose");
8
- const iron_session_1 = require("iron-session");
9
- const cookie_js_1 = require("./cookie.js");
10
- const workos_js_1 = require("./workos.js");
11
- const env_variables_js_1 = require("./env-variables.js");
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 JWKS = (0, jose_1.createRemoteJWKSet)(new URL(workos_js_1.workos.userManagement.getJwksUrl(env_variables_js_1.WORKOS_CLIENT_ID)));
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 (0, iron_session_1.sealData)(session, { password: env_variables_js_1.WORKOS_COOKIE_PASSWORD });
17
+ return sealData(session, { password: WORKOS_COOKIE_PASSWORD });
19
18
  }
20
- exports.encryptSession = encryptSession;
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(env_variables_js_1.WORKOS_REDIRECT_URI);
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 server_1.NextResponse.redirect(await (0, get_authorization_url_js_1.getAuthorizationUrl)({ returnPathname: getReturnPathname(request.url) }));
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 server_1.NextResponse.next({
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, (0, headers_1.cookies)().get(cookie_js_1.cookieName).value);
66
- return server_1.NextResponse.next({
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 } = (0, jose_1.decodeJwt)(session.accessToken);
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 workos_js_1.workos.userManagement.authenticateWithRefreshToken({
76
- clientId: env_variables_js_1.WORKOS_CLIENT_ID,
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 = server_1.NextResponse.next({
93
+ const response = NextResponse.next({
91
94
  request: { headers: newRequestHeaders },
92
95
  });
93
96
  // update the cookie
94
- response.cookies.set(cookie_js_1.cookieName, encryptedSession, cookie_js_1.cookieOptions);
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 = server_1.NextResponse.next({
103
+ const response = NextResponse.next({
101
104
  request: { headers: newRequestHeaders },
102
105
  });
103
- response.cookies.delete(cookie_js_1.cookieName);
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 } = (0, jose_1.decodeJwt)(session.accessToken);
117
- const { accessToken, refreshToken, user, impersonator } = await workos_js_1.workos.userManagement.authenticateWithRefreshToken({
118
- clientId: env_variables_js_1.WORKOS_CLIENT_ID,
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
- (0, headers_1.cookies)().set(cookie_js_1.cookieName, encryptedSession, cookie_js_1.cookieOptions);
130
- const { sid: sessionId, org_id: organizationId, role, permissions } = (0, jose_1.decodeJwt)(accessToken);
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, env_variables_js_1.WORKOS_REDIRECT_URI);
148
+ const url = new URL(pathGlob, WORKOS_REDIRECT_URI);
147
149
  const path = `${url.pathname}${url.hash || ''}`;
148
- const tokens = (0, path_to_regexp_1.parse)(path);
149
- regex = (0, path_to_regexp_1.tokensToRegexp)(tokens).source;
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 = (0, headers_1.headers)().get('x-url');
160
+ const url = headers().get('x-url');
159
161
  const returnPathname = url ? getReturnPathname(url) : undefined;
160
- (0, navigation_1.redirect)(await (0, get_authorization_url_js_1.getAuthorizationUrl)({ returnPathname }));
162
+ redirect(await getAuthorizationUrl({ returnPathname }));
161
163
  }
162
- async function getUser({ ensureSignedIn = false } = {}) {
163
- const session = await getSessionFromHeader('getUser');
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 } = (0, jose_1.decodeJwt)(session.accessToken);
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 getUser();
184
+ const { sessionId } = await withAuth();
184
185
  if (sessionId) {
185
- (0, navigation_1.redirect)(workos_js_1.workos.userManagement.getLogoutUrl({ sessionId }));
186
+ redirect(workos.userManagement.getLogoutUrl({ sessionId }));
186
187
  }
187
- (0, navigation_1.redirect)('/');
188
+ redirect('/');
188
189
  }
189
- exports.terminateSession = terminateSession;
190
190
  async function verifyAccessToken(accessToken) {
191
191
  try {
192
- await (0, jose_1.jwtVerify)(accessToken, JWKS);
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 cookie = (0, headers_1.cookies)().get(cookie_js_1.cookieName);
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 (0, iron_session_1.unsealData)(cookie.value, {
203
- password: env_variables_js_1.WORKOS_COOKIE_PASSWORD,
203
+ return unsealData(cookie.value, {
204
+ password: WORKOS_COOKIE_PASSWORD,
204
205
  });
205
206
  }
206
207
  }
207
- async function getSessionFromHeader(caller) {
208
- const hasMiddleware = Boolean((0, headers_1.headers)().get(middlewareHeaderName));
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(`You are calling \`${caller}\` 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)\`.`);
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 = (0, headers_1.headers)().get(sessionHeaderName);
235
+ const authHeader = headers().get(sessionHeaderName);
213
236
  if (!authHeader)
214
237
  return;
215
- return (0, iron_session_1.unsealData)(authHeader, { password: env_variables_js_1.WORKOS_COOKIE_PASSWORD });
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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"}
@@ -1,4 +1,4 @@
1
1
  import { WorkOS } from '@workos-inc/node';
2
- export declare const VERSION = "0.10.1";
2
+ export declare const VERSION = "0.11.1";
3
3
  declare const workos: WorkOS;
4
4
  export { workos };
@@ -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.10.1",
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": "commonjs",
7
- "main": "./dist/cjs/index.js",
8
- "types": "./dist/cjs/index.d.ts",
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-cjs.json",
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.21.0",
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 { cookieName, cookieOptions } from './cookie.js';
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 = false }: AuthKitProviderProps) => {
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 (onSessionExpired) {
42
- onSessionExpired();
43
- } else {
44
- window.location.reload();
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 { cookieName, cookieOptions };
18
+ export { cookieOptions };
@@ -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 WORKOS_CLIENT_ID = getEnvVariable('WORKOS_CLIENT_ID');
14
- const WORKOS_API_KEY = getEnvVariable('WORKOS_API_KEY');
15
- const WORKOS_REDIRECT_URI = getEnvVariable('WORKOS_REDIRECT_URI');
16
- const WORKOS_COOKIE_PASSWORD = getEnvVariable('WORKOS_COOKIE_PASSWORD');
17
- const WORKOS_API_HOSTNAME = getOptionalEnvVariable('WORKOS_API_HOSTNAME');
18
- const WORKOS_API_HTTPS = getOptionalEnvVariable('WORKOS_API_HTTPS');
19
- const WORKOS_API_PORT = getOptionalEnvVariable('WORKOS_API_PORT');
20
- const WORKOS_COOKIE_DOMAIN = getOptionalEnvVariable('WORKOS_COOKIE_DOMAIN');
21
- const WORKOS_COOKIE_MAX_AGE = getOptionalEnvVariable('WORKOS_COOKIE_MAX_AGE');
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,
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { getUser } from './session.js';
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 getUser();
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 { getUser, refreshSession } from './session.js';
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
- getUser,
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
  }