@workos-inc/authkit-nextjs 2.11.1 → 2.12.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 +25 -0
- package/dist/esm/authkit-callback-route.js +4 -11
- package/dist/esm/authkit-callback-route.js.map +1 -1
- package/dist/esm/components/authkit-provider.js +15 -12
- package/dist/esm/components/authkit-provider.js.map +1 -1
- package/dist/esm/types/components/authkit-provider.d.ts +6 -2
- package/dist/esm/types/workos.d.ts +1 -1
- package/dist/esm/workos.js +1 -1
- package/package.json +2 -2
- package/src/authkit-callback-route.spec.ts +15 -0
- package/src/authkit-callback-route.ts +4 -11
- package/src/components/authkit-provider.spec.tsx +115 -0
- package/src/components/authkit-provider.tsx +19 -13
- package/src/workos.ts +1 -1
package/README.md
CHANGED
|
@@ -209,6 +209,31 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
209
209
|
}
|
|
210
210
|
```
|
|
211
211
|
|
|
212
|
+
#### Optimizing with Server-Side Auth Data
|
|
213
|
+
|
|
214
|
+
To avoid a server action call on mount, you can pass the initial auth data from the server to the `AuthKitProvider`.
|
|
215
|
+
|
|
216
|
+
```jsx
|
|
217
|
+
import { AuthKitProvider } from '@workos-inc/authkit-nextjs/components';
|
|
218
|
+
import { withAuth } from '@workos-inc/authkit-nextjs';
|
|
219
|
+
|
|
220
|
+
export default async function RootLayout({ children }: { children: React.ReactNode }) {
|
|
221
|
+
// Fetch auth data on the server
|
|
222
|
+
const auth = await withAuth();
|
|
223
|
+
|
|
224
|
+
// Remove the accessToken from the auth object as it is not needed on the client side
|
|
225
|
+
const { accessToken, ...initialAuth } = auth;
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<html lang="en">
|
|
229
|
+
<body>
|
|
230
|
+
<AuthKitProvider initialAuth={initialAuth}>{children}</AuthKitProvider>
|
|
231
|
+
</body>
|
|
232
|
+
</html>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
212
237
|
### Get the current user in a server component
|
|
213
238
|
|
|
214
239
|
For pages where you want to display a signed-in and signed-out view, use `withAuth` to retrieve the user session from WorkOS.
|
|
@@ -71,17 +71,10 @@ export function handleAuth(options = {}) {
|
|
|
71
71
|
url.searchParams.delete('state');
|
|
72
72
|
// Redirect to the requested path and store the session
|
|
73
73
|
const returnPathname = returnPathnameState !== null && returnPathnameState !== void 0 ? returnPathnameState : returnPathnameOption;
|
|
74
|
-
// Extract
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
for (const [key, value] of newUrl.searchParams) {
|
|
79
|
-
url.searchParams.append(key, value);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
url.pathname = returnPathname;
|
|
84
|
-
}
|
|
74
|
+
// Extract pathname and search params from returnPathname
|
|
75
|
+
const parsedReturnUrl = new URL(returnPathname, 'https://placeholder.com');
|
|
76
|
+
url.pathname = parsedReturnUrl.pathname;
|
|
77
|
+
url.search = parsedReturnUrl.search;
|
|
85
78
|
// Fall back to standard Response if NextResponse is not available.
|
|
86
79
|
// This is to support Next.js 13.
|
|
87
80
|
const response = redirectWithFallback(url.toString());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authkit-callback-route.js","sourceRoot":"","sources":["../../src/authkit-callback-route.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"authkit-callback-route.js","sourceRoot":"","sources":["../../src/authkit-callback-route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,SAAS,cAAc,CAAC,OAAgB;IACtC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB;IACvC,IAAI,cAAc,GAAuB,SAAS,CAAC;IACnD,IAAI,SAA6B,CAAC;IAClC,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC/D,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;QAC5D,CAAC;QAAC,WAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,WAAM,CAAC;YACP,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO;QACL,cAAc;QACd,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAA6B,EAAE;IACxD,MAAM,EAAE,cAAc,EAAE,oBAAoB,GAAG,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5F,iDAAiD;IACjD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,UAAU,GAAG,CAAC,OAAoB;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAExD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,+EAA+E;gBAC/E,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,GACxG,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC,oBAAoB,CAAC;oBACpD,QAAQ,EAAE,gBAAgB;oBAC1B,IAAI;iBACL,CAAC,CAAC;gBAEL,4DAA4D;gBAC5D,0EAA0E;gBAC1E,4DAA4D;gBAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEjE,iBAAiB;gBACjB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEjC,uDAAuD;gBACvD,MAAM,cAAc,GAAG,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,oBAAoB,CAAC;gBAEnE,yDAAyD;gBACzD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;gBAC3E,GAAG,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;gBACxC,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;gBAEpC,mEAAmE;gBACnE,iCAAiC;gBACjC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAEjC,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY;oBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAEjF,MAAM,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;gBAE9E,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,SAAS,CAAC;wBACd,WAAW;wBACX,YAAY;wBACZ,IAAI;wBACJ,YAAY;wBACZ,WAAW;wBACX,oBAAoB;wBACpB,cAAc;wBACd,KAAK,EAAE,WAAW;qBACnB,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG;oBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC;gBAEF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAExB,OAAO,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,KAAK,UAAU,aAAa,CAAC,OAAoB,EAAE,KAAe;QAChE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,yBAAyB,CAAC;YACzC,KAAK,EAAE;gBACL,OAAO,EAAE,sBAAsB;gBAC/B,WAAW,EAAE,8FAA8F;aAC5G;SACF,CAAC,CAAC;QAEH,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
|
|
3
3
|
import { checkSessionAction, getAuthAction, handleSignOutAction, refreshAuthAction, switchToOrganizationAction, } from '../actions.js';
|
|
4
4
|
const AuthContext = createContext(undefined);
|
|
5
|
-
export const AuthKitProvider = ({ children, onSessionExpired }) => {
|
|
6
|
-
|
|
7
|
-
const [
|
|
8
|
-
const [
|
|
9
|
-
const [
|
|
10
|
-
const [
|
|
11
|
-
const [
|
|
12
|
-
const [
|
|
13
|
-
const [
|
|
14
|
-
const [
|
|
15
|
-
const [
|
|
5
|
+
export const AuthKitProvider = ({ children, onSessionExpired, initialAuth }) => {
|
|
6
|
+
var _a;
|
|
7
|
+
const [user, setUser] = useState((_a = initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.user) !== null && _a !== void 0 ? _a : null);
|
|
8
|
+
const [sessionId, setSessionId] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.sessionId);
|
|
9
|
+
const [organizationId, setOrganizationId] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.organizationId);
|
|
10
|
+
const [role, setRole] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.role);
|
|
11
|
+
const [roles, setRoles] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.roles);
|
|
12
|
+
const [permissions, setPermissions] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.permissions);
|
|
13
|
+
const [entitlements, setEntitlements] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.entitlements);
|
|
14
|
+
const [featureFlags, setFeatureFlags] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.featureFlags);
|
|
15
|
+
const [impersonator, setImpersonator] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.impersonator);
|
|
16
|
+
const [loading, setLoading] = useState(!initialAuth);
|
|
16
17
|
const getAuth = useCallback(async ({ ensureSignedIn = false } = {}) => {
|
|
17
18
|
setLoading(true);
|
|
18
19
|
try {
|
|
@@ -78,7 +79,9 @@ export const AuthKitProvider = ({ children, onSessionExpired }) => {
|
|
|
78
79
|
await handleSignOutAction({ returnTo });
|
|
79
80
|
}, []);
|
|
80
81
|
useEffect(() => {
|
|
81
|
-
|
|
82
|
+
if (!initialAuth) {
|
|
83
|
+
getAuth();
|
|
84
|
+
}
|
|
82
85
|
// Return early if the session expired checks are disabled.
|
|
83
86
|
if (onSessionExpired === false) {
|
|
84
87
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authkit-provider.js","sourceRoot":"","sources":["../../../src/components/authkit-provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAAE,aAAa,EAAa,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtG,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAwBvB,MAAM,WAAW,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"authkit-provider.js","sourceRoot":"","sources":["../../../src/components/authkit-provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAAE,aAAa,EAAa,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtG,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAwBvB,MAAM,WAAW,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAC;AAe1E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAwB,EAAE,EAAE;;IACnG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,mCAAI,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAqB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,SAAS,CAAC,CAAC;IACvF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAqB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,CAAC,CAAC;IACtG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAqB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAuB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAuB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,WAAW,CAAC,CAAC;IAC/F,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAuB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,CAAC,CAAC;IAClG,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAuB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,CAAC,CAAC;IAClG,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA2B,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,CAAC,CAAC;IACtG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,cAAc,GAAG,KAAK,KAAmC,EAAE,EAAE,EAAE;QAClG,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;YACnB,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpB,cAAc,CAAC,SAAS,CAAC,CAAC;YAC1B,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,oBAAoB,GAAG,WAAW,CACtC,KAAK,EAAE,cAAsB,EAAE,UAAuC,EAAE,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,cAAc,EAAE;YAC9D,oBAAoB,EAAE,MAAM;YAC5B,GAAG,OAAO;SACX,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,oBAAoB,KAAK,MAAM,EAAE,CAAC;YACzC,MAAM,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,cAAc,KAA4D,EAAE,EAAE,EAAE;QAC/G,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;YAEzE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,KAA4B,EAAE,EAAE,EAAE;QAC7E,MAAM,mBAAmB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,2DAA2D;QAC3D,IAAI,gBAAgB,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,uBAAuB,GAAG,KAAK,CAAC;QAEpC,MAAM,sBAAsB,GAAG,KAAK,IAAI,EAAE;YACxC,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,oGAAoG;YACpG,qFAAqF;YACrF,oGAAoG;YACpG,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC3C,uBAAuB,GAAG,IAAI,CAAC;gBAE/B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;oBAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wEAAwE;oBACxE,+EAA+E;oBAC/E,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBACxE,IAAI,gBAAgB,EAAE,CAAC;4BACrB,gBAAgB,EAAE,CAAC;wBACrB,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,uBAAuB,GAAG,KAAK,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QACpE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;QAEzD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YAC5D,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QACzE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,OAAO,CACL,oBAAC,WAAW,CAAC,QAAQ,IACnB,KAAK,EAAE;YACL,IAAI;YACJ,SAAS;YACT,cAAc;YACd,IAAI;YACJ,KAAK;YACL,WAAW;YACX,YAAY;YACZ,YAAY;YACZ,YAAY;YACZ,OAAO;YACP,OAAO;YACP,WAAW;YACX,OAAO;YACP,oBAAoB;SACrB,IAEA,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,UAAU,OAAO,CAAC,EAAE,cAAc,GAAG,KAAK,KAAmC,EAAE;IACnF,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnE,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC,CAAC;IAExE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
2
|
import type { Impersonator, User } from '@workos-inc/node';
|
|
3
|
-
import type { UserInfo, SwitchToOrganizationOptions } from '../interfaces.js';
|
|
3
|
+
import type { UserInfo, SwitchToOrganizationOptions, NoUserInfo } from '../interfaces.js';
|
|
4
4
|
type AuthContextType = {
|
|
5
5
|
user: User | null;
|
|
6
6
|
sessionId: string | undefined;
|
|
@@ -35,8 +35,12 @@ interface AuthKitProviderProps {
|
|
|
35
35
|
* You can also pass this as `false` to disable the expired session checks.
|
|
36
36
|
*/
|
|
37
37
|
onSessionExpired?: false | (() => void);
|
|
38
|
+
/**
|
|
39
|
+
* Initial auth data from the server. If provided, the provider will skip the initial client-side fetch.
|
|
40
|
+
*/
|
|
41
|
+
initialAuth?: Omit<UserInfo | NoUserInfo, 'accessToken'>;
|
|
38
42
|
}
|
|
39
|
-
export declare const AuthKitProvider: ({ children, onSessionExpired }: AuthKitProviderProps) => React.JSX.Element;
|
|
43
|
+
export declare const AuthKitProvider: ({ children, onSessionExpired, initialAuth }: AuthKitProviderProps) => React.JSX.Element;
|
|
40
44
|
export declare function useAuth(options: {
|
|
41
45
|
ensureSignedIn: true;
|
|
42
46
|
}): AuthContextType & ({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WorkOS } from '@workos-inc/node';
|
|
2
|
-
export declare const VERSION = "2.
|
|
2
|
+
export declare const VERSION = "2.12.1";
|
|
3
3
|
/**
|
|
4
4
|
* Create a WorkOS instance with the provided API key and options.
|
|
5
5
|
* If an instance already exists, it returns the existing instance.
|
package/dist/esm/workos.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WorkOS } from '@workos-inc/node';
|
|
2
2
|
import { WORKOS_API_HOSTNAME, WORKOS_API_KEY, WORKOS_API_HTTPS, WORKOS_API_PORT } from './env-variables.js';
|
|
3
3
|
import { lazy } from './utils.js';
|
|
4
|
-
export const VERSION = '2.
|
|
4
|
+
export const VERSION = '2.12.1';
|
|
5
5
|
const options = {
|
|
6
6
|
apiHostname: WORKOS_API_HOSTNAME,
|
|
7
7
|
https: WORKOS_API_HTTPS ? WORKOS_API_HTTPS === 'true' : true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workos-inc/authkit-nextjs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.1",
|
|
4
4
|
"description": "Authentication and session helpers for using WorkOS & AuthKit with Next.js",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"eslint-plugin-require-extensions": "^0.1.3",
|
|
58
58
|
"jest": "^29.7.0",
|
|
59
59
|
"jest-environment-jsdom": "^29.7.0",
|
|
60
|
-
"next": "^16.0.
|
|
60
|
+
"next": "^16.0.9",
|
|
61
61
|
"prettier": "^3.3.3",
|
|
62
62
|
"ts-jest": "^29.2.5",
|
|
63
63
|
"ts-node": "^10.9.2",
|
|
@@ -181,6 +181,21 @@ describe('authkit-callback-route', () => {
|
|
|
181
181
|
expect(response.headers.get('Location')).toContain('/custom-path?foo=bar&baz=qux');
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
+
it('should handle full URL in returnPathname by extracting only the pathname', async () => {
|
|
185
|
+
jest.mocked(workos.userManagement.authenticateWithCode).mockResolvedValue(mockAuthResponse);
|
|
186
|
+
|
|
187
|
+
const state = btoa(JSON.stringify({ returnPathname: 'https://example.com/invite/k0123456789' }));
|
|
188
|
+
request.nextUrl.searchParams.set('code', 'test-code');
|
|
189
|
+
request.nextUrl.searchParams.set('state', state);
|
|
190
|
+
|
|
191
|
+
const handler = handleAuth();
|
|
192
|
+
const response = await handler(request);
|
|
193
|
+
|
|
194
|
+
const location = response.headers.get('Location');
|
|
195
|
+
expect(location).toContain('/invite/k0123456789');
|
|
196
|
+
expect(location).not.toContain('https://example.com/invite');
|
|
197
|
+
});
|
|
198
|
+
|
|
184
199
|
it('should use Response if NextResponse.redirect is not available', async () => {
|
|
185
200
|
const originalRedirect = NextResponse.redirect;
|
|
186
201
|
(NextResponse as Partial<typeof NextResponse>).redirect = undefined;
|
|
@@ -80,17 +80,10 @@ export function handleAuth(options: HandleAuthOptions = {}) {
|
|
|
80
80
|
// Redirect to the requested path and store the session
|
|
81
81
|
const returnPathname = returnPathnameState ?? returnPathnameOption;
|
|
82
82
|
|
|
83
|
-
// Extract
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
for (const [key, value] of newUrl.searchParams) {
|
|
89
|
-
url.searchParams.append(key, value);
|
|
90
|
-
}
|
|
91
|
-
} else {
|
|
92
|
-
url.pathname = returnPathname;
|
|
93
|
-
}
|
|
83
|
+
// Extract pathname and search params from returnPathname
|
|
84
|
+
const parsedReturnUrl = new URL(returnPathname, 'https://placeholder.com');
|
|
85
|
+
url.pathname = parsedReturnUrl.pathname;
|
|
86
|
+
url.search = parsedReturnUrl.search;
|
|
94
87
|
|
|
95
88
|
// Fall back to standard Response if NextResponse is not available.
|
|
96
89
|
// This is to support Next.js 13.
|
|
@@ -35,6 +35,121 @@ describe('AuthKitProvider', () => {
|
|
|
35
35
|
expect(getByText('Test Child')).toBeInTheDocument();
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
+
it('should skip initial getAuthAction call when initialAuth is provided', async () => {
|
|
39
|
+
const initialAuth = {
|
|
40
|
+
user: {
|
|
41
|
+
id: 'user-123',
|
|
42
|
+
email: 'test@example.com',
|
|
43
|
+
emailVerified: true,
|
|
44
|
+
profilePictureUrl: null,
|
|
45
|
+
firstName: 'Test',
|
|
46
|
+
lastName: 'User',
|
|
47
|
+
object: 'user' as const,
|
|
48
|
+
createdAt: '2024-01-01T00:00:00Z',
|
|
49
|
+
updatedAt: '2024-01-01T00:00:00Z',
|
|
50
|
+
lastSignInAt: '2024-01-01T00:00:00Z',
|
|
51
|
+
externalId: null,
|
|
52
|
+
locale: 'en-US',
|
|
53
|
+
metadata: {},
|
|
54
|
+
},
|
|
55
|
+
sessionId: 'test-session',
|
|
56
|
+
organizationId: 'test-org',
|
|
57
|
+
role: 'admin',
|
|
58
|
+
roles: ['admin'],
|
|
59
|
+
permissions: ['read', 'write'],
|
|
60
|
+
entitlements: ['feature1'],
|
|
61
|
+
featureFlags: ['test-flag'],
|
|
62
|
+
impersonator: undefined,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
render(
|
|
66
|
+
<AuthKitProvider initialAuth={initialAuth}>
|
|
67
|
+
<div>Test Child</div>
|
|
68
|
+
</AuthKitProvider>,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// Wait a bit to ensure no call is made
|
|
72
|
+
await waitFor(
|
|
73
|
+
() => {
|
|
74
|
+
expect(getAuthAction).not.toHaveBeenCalled();
|
|
75
|
+
},
|
|
76
|
+
{ timeout: 100 },
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should initialize state with initialAuth values', async () => {
|
|
81
|
+
const initialAuth = {
|
|
82
|
+
user: {
|
|
83
|
+
id: 'user-123',
|
|
84
|
+
email: 'test@example.com',
|
|
85
|
+
emailVerified: true,
|
|
86
|
+
profilePictureUrl: null,
|
|
87
|
+
firstName: 'Test',
|
|
88
|
+
lastName: 'User',
|
|
89
|
+
object: 'user' as const,
|
|
90
|
+
createdAt: '2024-01-01T00:00:00Z',
|
|
91
|
+
updatedAt: '2024-01-01T00:00:00Z',
|
|
92
|
+
lastSignInAt: '2024-01-01T00:00:00Z',
|
|
93
|
+
locale: 'en-US',
|
|
94
|
+
externalId: null,
|
|
95
|
+
metadata: {},
|
|
96
|
+
},
|
|
97
|
+
sessionId: 'test-session',
|
|
98
|
+
organizationId: 'test-org',
|
|
99
|
+
role: 'admin',
|
|
100
|
+
roles: ['admin'],
|
|
101
|
+
permissions: ['read', 'write'],
|
|
102
|
+
entitlements: ['feature1'],
|
|
103
|
+
featureFlags: ['test-flag'],
|
|
104
|
+
impersonator: { email: 'admin@example.com', reason: 'Support request' },
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const TestComponent = () => {
|
|
108
|
+
const auth = useAuth();
|
|
109
|
+
return (
|
|
110
|
+
<div>
|
|
111
|
+
<div data-testid="loading">{auth.loading.toString()}</div>
|
|
112
|
+
<div data-testid="email">{auth.user?.email}</div>
|
|
113
|
+
<div data-testid="session">{auth.sessionId}</div>
|
|
114
|
+
<div data-testid="org">{auth.organizationId}</div>
|
|
115
|
+
<div data-testid="role">{auth.role}</div>
|
|
116
|
+
<div data-testid="impersonator">{auth.impersonator?.email}</div>
|
|
117
|
+
</div>
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const { getByTestId } = render(
|
|
122
|
+
<AuthKitProvider initialAuth={initialAuth}>
|
|
123
|
+
<TestComponent />
|
|
124
|
+
</AuthKitProvider>,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// Should not be loading when initialAuth is provided
|
|
128
|
+
expect(getByTestId('loading')).toHaveTextContent('false');
|
|
129
|
+
expect(getByTestId('email')).toHaveTextContent('test@example.com');
|
|
130
|
+
expect(getByTestId('session')).toHaveTextContent('test-session');
|
|
131
|
+
expect(getByTestId('org')).toHaveTextContent('test-org');
|
|
132
|
+
expect(getByTestId('role')).toHaveTextContent('admin');
|
|
133
|
+
expect(getByTestId('impersonator')).toHaveTextContent('admin@example.com');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should call getAuthAction when initialAuth is not provided', async () => {
|
|
137
|
+
(getAuthAction as jest.Mock).mockResolvedValueOnce({
|
|
138
|
+
user: { email: 'test@example.com' },
|
|
139
|
+
sessionId: 'test-session',
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
render(
|
|
143
|
+
<AuthKitProvider>
|
|
144
|
+
<div>Test Child</div>
|
|
145
|
+
</AuthKitProvider>,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
await waitFor(() => {
|
|
149
|
+
expect(getAuthAction).toHaveBeenCalledTimes(1);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
38
153
|
it('should do nothing if onSessionExpired is false', async () => {
|
|
39
154
|
jest.spyOn(window, 'addEventListener');
|
|
40
155
|
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
switchToOrganizationAction,
|
|
10
10
|
} from '../actions.js';
|
|
11
11
|
import type { Impersonator, User } from '@workos-inc/node';
|
|
12
|
-
import type { UserInfo, SwitchToOrganizationOptions } from '../interfaces.js';
|
|
12
|
+
import type { UserInfo, SwitchToOrganizationOptions, NoUserInfo } from '../interfaces.js';
|
|
13
13
|
|
|
14
14
|
type AuthContextType = {
|
|
15
15
|
user: User | null;
|
|
@@ -40,19 +40,23 @@ interface AuthKitProviderProps {
|
|
|
40
40
|
* You can also pass this as `false` to disable the expired session checks.
|
|
41
41
|
*/
|
|
42
42
|
onSessionExpired?: false | (() => void);
|
|
43
|
+
/**
|
|
44
|
+
* Initial auth data from the server. If provided, the provider will skip the initial client-side fetch.
|
|
45
|
+
*/
|
|
46
|
+
initialAuth?: Omit<UserInfo | NoUserInfo, 'accessToken'>;
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
export const AuthKitProvider = ({ children, onSessionExpired }: AuthKitProviderProps) => {
|
|
46
|
-
const [user, setUser] = useState<User | null>(null);
|
|
47
|
-
const [sessionId, setSessionId] = useState<string | undefined>(
|
|
48
|
-
const [organizationId, setOrganizationId] = useState<string | undefined>(
|
|
49
|
-
const [role, setRole] = useState<string | undefined>(
|
|
50
|
-
const [roles, setRoles] = useState<string[] | undefined>(
|
|
51
|
-
const [permissions, setPermissions] = useState<string[] | undefined>(
|
|
52
|
-
const [entitlements, setEntitlements] = useState<string[] | undefined>(
|
|
53
|
-
const [featureFlags, setFeatureFlags] = useState<string[] | undefined>(
|
|
54
|
-
const [impersonator, setImpersonator] = useState<Impersonator | undefined>(
|
|
55
|
-
const [loading, setLoading] = useState(
|
|
49
|
+
export const AuthKitProvider = ({ children, onSessionExpired, initialAuth }: AuthKitProviderProps) => {
|
|
50
|
+
const [user, setUser] = useState<User | null>(initialAuth?.user ?? null);
|
|
51
|
+
const [sessionId, setSessionId] = useState<string | undefined>(initialAuth?.sessionId);
|
|
52
|
+
const [organizationId, setOrganizationId] = useState<string | undefined>(initialAuth?.organizationId);
|
|
53
|
+
const [role, setRole] = useState<string | undefined>(initialAuth?.role);
|
|
54
|
+
const [roles, setRoles] = useState<string[] | undefined>(initialAuth?.roles);
|
|
55
|
+
const [permissions, setPermissions] = useState<string[] | undefined>(initialAuth?.permissions);
|
|
56
|
+
const [entitlements, setEntitlements] = useState<string[] | undefined>(initialAuth?.entitlements);
|
|
57
|
+
const [featureFlags, setFeatureFlags] = useState<string[] | undefined>(initialAuth?.featureFlags);
|
|
58
|
+
const [impersonator, setImpersonator] = useState<Impersonator | undefined>(initialAuth?.impersonator);
|
|
59
|
+
const [loading, setLoading] = useState(!initialAuth);
|
|
56
60
|
|
|
57
61
|
const getAuth = useCallback(async ({ ensureSignedIn = false }: { ensureSignedIn?: boolean } = {}) => {
|
|
58
62
|
setLoading(true);
|
|
@@ -128,7 +132,9 @@ export const AuthKitProvider = ({ children, onSessionExpired }: AuthKitProviderP
|
|
|
128
132
|
}, []);
|
|
129
133
|
|
|
130
134
|
useEffect(() => {
|
|
131
|
-
|
|
135
|
+
if (!initialAuth) {
|
|
136
|
+
getAuth();
|
|
137
|
+
}
|
|
132
138
|
|
|
133
139
|
// Return early if the session expired checks are disabled.
|
|
134
140
|
if (onSessionExpired === false) {
|
package/src/workos.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { WorkOS } from '@workos-inc/node';
|
|
|
2
2
|
import { WORKOS_API_HOSTNAME, WORKOS_API_KEY, WORKOS_API_HTTPS, WORKOS_API_PORT } from './env-variables.js';
|
|
3
3
|
import { lazy } from './utils.js';
|
|
4
4
|
|
|
5
|
-
export const VERSION = '2.
|
|
5
|
+
export const VERSION = '2.12.1';
|
|
6
6
|
|
|
7
7
|
const options = {
|
|
8
8
|
apiHostname: WORKOS_API_HOSTNAME,
|