@atlasauth/react 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/AtlasProvider.js +12 -2
- package/dist/AtlasProvider.js.map +1 -1
- package/dist/active-atlas.d.ts +9 -0
- package/dist/active-atlas.js.map +1 -1
- package/dist/compat-descope.d.ts +85 -0
- package/dist/compat-descope.js +191 -0
- package/dist/compat-descope.js.map +1 -0
- package/dist/compat-kinde.d.ts +166 -0
- package/dist/compat-kinde.js +184 -0
- package/dist/compat-kinde.js.map +1 -0
- package/dist/compat-okta.d.ts +102 -0
- package/dist/compat-okta.js +240 -0
- package/dist/compat-okta.js.map +1 -0
- package/dist/compat.d.ts +5 -1
- package/dist/compat.js +19 -1
- package/dist/compat.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.kindeUserFrom = kindeUserFrom;
|
|
5
|
+
exports.kindeSessionFrom = kindeSessionFrom;
|
|
6
|
+
exports.useKindeAuthCompat = useKindeAuthCompat;
|
|
7
|
+
exports.useKindeBrowserClientCompat = useKindeBrowserClientCompat;
|
|
8
|
+
/**
|
|
9
|
+
* Drop-in helpers for apps moving to Atlas from Kinde (`@kinde-oss/kinde-auth-react`
|
|
10
|
+
* and the browser side of `@kinde-oss/kinde-auth-nextjs`).
|
|
11
|
+
*
|
|
12
|
+
* `atlas migrate code --from kinde` rewrites `useKindeAuth()` to
|
|
13
|
+
* {@link useKindeAuthCompat} and `useKindeBrowserClient()` to
|
|
14
|
+
* {@link useKindeBrowserClientCompat}, so call sites keep the Kinde shapes
|
|
15
|
+
* (`user.given_name`, `getPermission(key).isGranted`, `organization.orgCode`, …)
|
|
16
|
+
* and run on day one. Both are thin projections over the `<AtlasProvider>` state;
|
|
17
|
+
* move call sites to `useUser()` / `useAuth()` / `useOrganization()` at your own pace.
|
|
18
|
+
*
|
|
19
|
+
* What maps, and how:
|
|
20
|
+
* - the user → Kinde's `{ id, email, given_name, family_name, picture, username, phone_number }`;
|
|
21
|
+
* - permissions → the session's organization permissions plus its app-level
|
|
22
|
+
* permissions (`org_permissions` / `app_permissions` claims);
|
|
23
|
+
* - the organization → the active Atlas organization (`orgCode` is its id);
|
|
24
|
+
* - `accessToken` / `getAccessToken()` → the decoded Atlas session claims, and the
|
|
25
|
+
* raw token is the Atlas session JWT;
|
|
26
|
+
* - feature flags have no Atlas counterpart: the flag getters always return the
|
|
27
|
+
* default value you pass (the codemod marks every call site).
|
|
28
|
+
*
|
|
29
|
+
* Every getter works with or without `await`, so code written for either the
|
|
30
|
+
* synchronous (v4) or the asynchronous (v5) Kinde React API keeps working.
|
|
31
|
+
*/
|
|
32
|
+
const react_1 = require("react");
|
|
33
|
+
const AtlasProvider_1 = require("./AtlasProvider");
|
|
34
|
+
const components_shared_1 = require("./components-shared");
|
|
35
|
+
/** Project an Atlas user onto Kinde's user shape. */
|
|
36
|
+
function kindeUserFrom(user) {
|
|
37
|
+
if (!user)
|
|
38
|
+
return null;
|
|
39
|
+
const emails = user.email_addresses ?? [];
|
|
40
|
+
const email = emails.find((e) => e.primary) ?? emails.find((e) => e.verified) ?? emails[0];
|
|
41
|
+
const phones = user.phone_numbers ?? [];
|
|
42
|
+
const phone = phones.find((p) => p.primary) ?? phones[0];
|
|
43
|
+
return {
|
|
44
|
+
id: user.id,
|
|
45
|
+
email: email?.email_address ?? null,
|
|
46
|
+
given_name: user.first_name,
|
|
47
|
+
family_name: user.last_name,
|
|
48
|
+
picture: user.image_url,
|
|
49
|
+
username: user.username,
|
|
50
|
+
phone_number: phone?.phone_number ?? null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Organization permissions plus app-level permissions, deduplicated. */
|
|
54
|
+
function heldPermissions(claims) {
|
|
55
|
+
const out = new Set();
|
|
56
|
+
for (const list of [claims?.org_permissions, claims?.app_permissions]) {
|
|
57
|
+
if (!Array.isArray(list))
|
|
58
|
+
continue;
|
|
59
|
+
for (const p of list)
|
|
60
|
+
if (typeof p === 'string')
|
|
61
|
+
out.add(p);
|
|
62
|
+
}
|
|
63
|
+
return [...out];
|
|
64
|
+
}
|
|
65
|
+
function flagType(value) {
|
|
66
|
+
return typeof value === 'boolean' ? 'boolean' : typeof value === 'number' ? 'integer' : 'string';
|
|
67
|
+
}
|
|
68
|
+
/** The flag getters: Atlas has no feature flags, so each returns the default it is given. */
|
|
69
|
+
function flagGetters() {
|
|
70
|
+
return {
|
|
71
|
+
getFlag(code, defaultValue, _type) {
|
|
72
|
+
return { code, type: flagType(defaultValue), value: defaultValue, is_default: true, defaultValue };
|
|
73
|
+
},
|
|
74
|
+
getBooleanFlag(_code, defaultValue) {
|
|
75
|
+
return defaultValue;
|
|
76
|
+
},
|
|
77
|
+
getStringFlag(_code, defaultValue) {
|
|
78
|
+
return defaultValue;
|
|
79
|
+
},
|
|
80
|
+
getIntegerFlag(_code, defaultValue) {
|
|
81
|
+
return defaultValue;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Pure projection of the provider state onto the members `useKindeAuth()` and
|
|
87
|
+
* `useKindeBrowserClient()` share. Exported for tests and custom wiring.
|
|
88
|
+
*/
|
|
89
|
+
function kindeSessionFrom(state) {
|
|
90
|
+
const signedIn = state.status === 'signed_in';
|
|
91
|
+
const claims = signedIn ? state.claims : null;
|
|
92
|
+
const orgCode = claims?.org_id ?? null;
|
|
93
|
+
const memberships = signedIn ? (state.memberships ?? []) : [];
|
|
94
|
+
const active = memberships.find((m) => m.organization.id === orgCode) ?? null;
|
|
95
|
+
const user = signedIn ? kindeUserFrom(state.user) : null;
|
|
96
|
+
const permissions = { permissions: heldPermissions(claims), orgCode };
|
|
97
|
+
const organization = orgCode
|
|
98
|
+
? { orgCode, orgName: active?.organization.name ?? null }
|
|
99
|
+
: null;
|
|
100
|
+
const userOrganizations = signedIn
|
|
101
|
+
? {
|
|
102
|
+
orgCodes: memberships.map((m) => m.organization.id),
|
|
103
|
+
orgs: memberships.map((m) => ({ code: m.organization.id, name: m.organization.name })),
|
|
104
|
+
}
|
|
105
|
+
: null;
|
|
106
|
+
return {
|
|
107
|
+
isLoading: state.status === 'loading',
|
|
108
|
+
isAuthenticated: signedIn,
|
|
109
|
+
user,
|
|
110
|
+
permissions,
|
|
111
|
+
organization,
|
|
112
|
+
userOrganizations,
|
|
113
|
+
/** The decoded Atlas session claims (Kinde's decoded access token). */
|
|
114
|
+
accessToken: claims,
|
|
115
|
+
getUser: () => user,
|
|
116
|
+
getPermission: (key) => ({
|
|
117
|
+
isGranted: permissions.permissions.includes(key),
|
|
118
|
+
orgCode,
|
|
119
|
+
}),
|
|
120
|
+
getPermissions: () => permissions,
|
|
121
|
+
getOrganization: () => organization,
|
|
122
|
+
getUserOrganizations: () => userOrganizations,
|
|
123
|
+
getAccessToken: () => claims,
|
|
124
|
+
/** A claim of the Atlas session token, as `{ name, value }`; null when signed out. */
|
|
125
|
+
getClaim: (name, _tokenType) => claims ? { name, value: claims[name] ?? null } : null,
|
|
126
|
+
...flagGetters(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function returnPath(options) {
|
|
130
|
+
return options.app_state?.redirectTo ?? options.redirectURL ?? options.post_login_redirect_url;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* `useKindeAuth()` from `@kinde-oss/kinde-auth-react`, on Atlas. `login()` and
|
|
134
|
+
* `register()` open your Atlas sign-in / sign-up pages; `logout(url?)` signs out
|
|
135
|
+
* and goes to `url` (default `/`); `getToken()` resolves the Atlas session JWT.
|
|
136
|
+
*/
|
|
137
|
+
function useKindeAuthCompat() {
|
|
138
|
+
const atlas = (0, AtlasProvider_1.useAtlas)();
|
|
139
|
+
return {
|
|
140
|
+
...kindeSessionFrom(atlas),
|
|
141
|
+
error: undefined,
|
|
142
|
+
login: async (options = {}) => (0, components_shared_1.navigateTo)((0, components_shared_1.withRedirect)(options.signInUrl ?? '/sign-in', returnPath(options))),
|
|
143
|
+
register: async (options = {}) => (0, components_shared_1.navigateTo)((0, components_shared_1.withRedirect)(options.signUpUrl ?? '/sign-up', returnPath(options))),
|
|
144
|
+
logout: async (options) => {
|
|
145
|
+
await atlas.signOut();
|
|
146
|
+
const to = typeof options === 'string' ? options : (options?.redirectUrl ?? options?.returnTo);
|
|
147
|
+
(0, components_shared_1.navigateTo)(to ?? '/');
|
|
148
|
+
},
|
|
149
|
+
getToken: async () => (await atlas.getToken()) ?? undefined,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* `useKindeBrowserClient()` from `@kinde-oss/kinde-auth-nextjs`, on Atlas.
|
|
154
|
+
* `accessTokenRaw` / `getToken()` hold the latest Atlas session JWT (null until the
|
|
155
|
+
* first one is fetched); for a request, prefer `await useAuth().getToken()`, which
|
|
156
|
+
* is always fresh. `refreshData()` reloads the user and session.
|
|
157
|
+
*/
|
|
158
|
+
function useKindeBrowserClientCompat() {
|
|
159
|
+
const atlas = (0, AtlasProvider_1.useAtlas)();
|
|
160
|
+
const [token, setToken] = (0, react_1.useState)(null);
|
|
161
|
+
(0, react_1.useEffect)(() => {
|
|
162
|
+
if (atlas.status !== 'signed_in') {
|
|
163
|
+
setToken(null);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
let live = true;
|
|
167
|
+
void atlas.getToken().then((t) => live && setToken(t), () => live && setToken(null));
|
|
168
|
+
return () => {
|
|
169
|
+
live = false;
|
|
170
|
+
};
|
|
171
|
+
}, [atlas.status, atlas.claims]);
|
|
172
|
+
return {
|
|
173
|
+
...kindeSessionFrom(atlas),
|
|
174
|
+
error: null,
|
|
175
|
+
accessTokenRaw: token,
|
|
176
|
+
accessTokenEncoded: token,
|
|
177
|
+
getAccessTokenRaw: () => token,
|
|
178
|
+
getToken: () => token,
|
|
179
|
+
refreshData: async () => {
|
|
180
|
+
await atlas.reload();
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=compat-kinde.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-kinde.js","sourceRoot":"","sources":["../src/compat-kinde.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { AtlasUser, SessionClaims } from './types';
|
|
2
|
+
import { type ActiveAtlas } from './active-atlas';
|
|
3
|
+
/** The OIDC user claims okta-auth-js's `getUser()` / `token.getUserInfo()` resolve to. */
|
|
4
|
+
export interface OktaCompatUserClaims {
|
|
5
|
+
sub: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
given_name?: string;
|
|
8
|
+
family_name?: string;
|
|
9
|
+
preferred_username?: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
email_verified?: boolean;
|
|
12
|
+
picture?: string;
|
|
13
|
+
[claim: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/** okta-auth-js's `AuthState`: `null` while loading, then signed in or not. */
|
|
16
|
+
export interface OktaCompatAuthState {
|
|
17
|
+
isAuthenticated: boolean;
|
|
18
|
+
/** The Atlas session token, with the user's profile claims merged into its claims. */
|
|
19
|
+
idToken?: {
|
|
20
|
+
idToken: string;
|
|
21
|
+
claims: OktaCompatUserClaims & SessionClaims;
|
|
22
|
+
};
|
|
23
|
+
/** The Atlas session token and its claims. */
|
|
24
|
+
accessToken?: {
|
|
25
|
+
accessToken: string;
|
|
26
|
+
claims: SessionClaims;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface OktaAuthCompatOptions {
|
|
30
|
+
/** Where your Atlas sign-in page lives (default `/sign-in`). */
|
|
31
|
+
signInUrl?: string;
|
|
32
|
+
/** Where `signOut()` goes when the call does not say (okta-auth-js's option of the same name). Default `/`. */
|
|
33
|
+
postLogoutRedirectUri?: string;
|
|
34
|
+
/** okta-auth-js options (`issuer`, `clientId`, `redirectUri`, `scopes`, `pkce`, …) are accepted and ignored. */
|
|
35
|
+
[option: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface OktaCompatSignInOptions {
|
|
38
|
+
/** Where to land after sign-in (sent to the sign-in page as `redirect_url`). */
|
|
39
|
+
originalUri?: string;
|
|
40
|
+
[option: string]: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface OktaCompatSignOutOptions {
|
|
43
|
+
postLogoutRedirectUri?: string;
|
|
44
|
+
[option: string]: unknown;
|
|
45
|
+
}
|
|
46
|
+
/** okta-auth-js's `AuthSdkError`, thrown when a call needs a signed-in user. */
|
|
47
|
+
export declare class OktaCompatAuthSdkError extends Error {
|
|
48
|
+
readonly errorCode = "INTERNAL";
|
|
49
|
+
readonly errorSummary: string;
|
|
50
|
+
constructor(message: string);
|
|
51
|
+
}
|
|
52
|
+
/** Project an Atlas user onto the OIDC user claims Okta returns. */
|
|
53
|
+
export declare function oktaUserFrom(user: AtlasUser | null): OktaCompatUserClaims | null;
|
|
54
|
+
/**
|
|
55
|
+
* Pure projection of the provider state onto okta-auth-js's `AuthState`.
|
|
56
|
+
* `token` is the session token: `undefined` while it is being read (the state
|
|
57
|
+
* is then `null`, as Okta's is before its first evaluation), `null` when there
|
|
58
|
+
* is none.
|
|
59
|
+
*/
|
|
60
|
+
export declare function oktaAuthStateFrom(state: Pick<ActiveAtlas, 'status' | 'user' | 'claims'>, token: string | null | undefined): OktaCompatAuthState | null;
|
|
61
|
+
/** okta-auth-js's `toRelativeUrl(path, baseUrl)`: an absolute URL loses its `baseUrl` prefix. */
|
|
62
|
+
export declare function toRelativeUrlCompat(path?: string, baseUrl?: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* `new OktaAuth(config)` from `@okta/okta-auth-js`, on Atlas, for a React app
|
|
65
|
+
* that renders `<AtlasProvider>`. The config is accepted and ignored apart from
|
|
66
|
+
* `signInUrl` and `postLogoutRedirectUri`: sign-in runs on your Atlas pages and
|
|
67
|
+
* the provider holds the session.
|
|
68
|
+
*/
|
|
69
|
+
export declare class OktaAuthCompat {
|
|
70
|
+
readonly options: OktaAuthCompatOptions;
|
|
71
|
+
/** okta-auth-js's `oktaAuth.token` namespace (`getUserInfo` only). */
|
|
72
|
+
readonly token: {
|
|
73
|
+
getUserInfo(): Promise<OktaCompatUserClaims>;
|
|
74
|
+
};
|
|
75
|
+
private readonly atlas;
|
|
76
|
+
private cached;
|
|
77
|
+
private pending;
|
|
78
|
+
/**
|
|
79
|
+
* @param atlas Where the provider state comes from. Internal: the hook passes
|
|
80
|
+
* its own; by default the `<AtlasProvider>` mounted on the page.
|
|
81
|
+
*/
|
|
82
|
+
constructor(options?: OktaAuthCompatOptions, atlas?: () => ActiveAtlas);
|
|
83
|
+
/** Open your Atlas sign-in page, coming back to `originalUri` afterwards. */
|
|
84
|
+
signInWithRedirect(options?: OktaCompatSignInOptions): Promise<void>;
|
|
85
|
+
/** Sign out, then go to `postLogoutRedirectUri` (default `/`). */
|
|
86
|
+
signOut(options?: OktaCompatSignOutOptions): Promise<void>;
|
|
87
|
+
isAuthenticated(): Promise<boolean>;
|
|
88
|
+
/** The signed-in user's claims; throws `AuthSdkError` when nobody is signed in, like Okta. */
|
|
89
|
+
getUser(): Promise<OktaCompatUserClaims>;
|
|
90
|
+
/** The session token on hand (synchronous, like okta-auth-js), refreshed in the background. */
|
|
91
|
+
getAccessToken(): string | undefined;
|
|
92
|
+
/** Atlas has one session token: the same value as `getAccessToken()`. */
|
|
93
|
+
getIdToken(): string | undefined;
|
|
94
|
+
/** Read a fresh session token now (the async form of `getAccessToken()`). */
|
|
95
|
+
getFreshAccessToken(): Promise<string | undefined>;
|
|
96
|
+
private current;
|
|
97
|
+
}
|
|
98
|
+
/** `useOktaAuth()` from `@okta/okta-react`, on Atlas: `{ oktaAuth, authState }`. */
|
|
99
|
+
export declare function useOktaAuthCompat(): {
|
|
100
|
+
oktaAuth: OktaAuthCompat;
|
|
101
|
+
authState: OktaCompatAuthState | null;
|
|
102
|
+
};
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.OktaAuthCompat = exports.OktaCompatAuthSdkError = void 0;
|
|
5
|
+
exports.oktaUserFrom = oktaUserFrom;
|
|
6
|
+
exports.oktaAuthStateFrom = oktaAuthStateFrom;
|
|
7
|
+
exports.toRelativeUrlCompat = toRelativeUrlCompat;
|
|
8
|
+
exports.useOktaAuthCompat = useOktaAuthCompat;
|
|
9
|
+
/**
|
|
10
|
+
* Drop-in compatibility helpers for React apps moving to Atlas from Okta
|
|
11
|
+
* (`@okta/okta-react` + `@okta/okta-auth-js`): what `atlas migrate code --from okta`
|
|
12
|
+
* rewrites `useOktaAuth()`, `new OktaAuth(config)` and `toRelativeUrl` onto.
|
|
13
|
+
*
|
|
14
|
+
* `useOktaAuthCompat()` keeps okta-react's `{ oktaAuth, authState }` shape, and
|
|
15
|
+
* `OktaAuthCompat` the okta-auth-js methods apps call most (`signInWithRedirect`,
|
|
16
|
+
* `signOut`, `isAuthenticated`, `getUser`, `getAccessToken`, `getIdToken`,
|
|
17
|
+
* `token.getUserInfo`), on top of the mounted `<AtlasProvider>`:
|
|
18
|
+
*
|
|
19
|
+
* - sign-in opens your Atlas sign-in page and comes back to `originalUri`, so
|
|
20
|
+
* okta-react's `restoreOriginalUri` and `<LoginCallback>` are no longer needed;
|
|
21
|
+
* - the "access token" and the "ID token" are both the Atlas session token:
|
|
22
|
+
* verify it on your server with `AtlasBackend` from `@atlasauth/backend`. Its
|
|
23
|
+
* `sub` is the Atlas user id (an Okta access token carried the login there,
|
|
24
|
+
* and the user id in `uid`);
|
|
25
|
+
* - `getAccessToken()` / `getIdToken()` stay synchronous, as in okta-auth-js:
|
|
26
|
+
* they return the freshest unexpired token on hand and refresh it in the
|
|
27
|
+
* background (`await getFreshAccessToken()` when you can wait).
|
|
28
|
+
*
|
|
29
|
+
* Calling a method with no provider mounted throws a clear error, except the
|
|
30
|
+
* synchronous token getters, which return `undefined` like a signed-out Okta app.
|
|
31
|
+
*/
|
|
32
|
+
const react_1 = require("react");
|
|
33
|
+
const AtlasProvider_1 = require("./AtlasProvider");
|
|
34
|
+
const components_shared_1 = require("./components-shared");
|
|
35
|
+
const active_atlas_1 = require("./active-atlas");
|
|
36
|
+
/** okta-auth-js's `AuthSdkError`, thrown when a call needs a signed-in user. */
|
|
37
|
+
class OktaCompatAuthSdkError extends Error {
|
|
38
|
+
errorCode = 'INTERNAL';
|
|
39
|
+
errorSummary;
|
|
40
|
+
constructor(message) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = 'AuthSdkError';
|
|
43
|
+
this.errorSummary = message;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.OktaCompatAuthSdkError = OktaCompatAuthSdkError;
|
|
47
|
+
/** Project an Atlas user onto the OIDC user claims Okta returns. */
|
|
48
|
+
function oktaUserFrom(user) {
|
|
49
|
+
if (!user)
|
|
50
|
+
return null;
|
|
51
|
+
const list = user.email_addresses ?? [];
|
|
52
|
+
const email = list.find((e) => e.primary) ?? list.find((e) => e.verified) ?? list[0];
|
|
53
|
+
const out = { sub: user.id };
|
|
54
|
+
const name = [user.first_name, user.last_name].filter(Boolean).join(' ').trim();
|
|
55
|
+
if (name)
|
|
56
|
+
out.name = name;
|
|
57
|
+
if (user.first_name)
|
|
58
|
+
out.given_name = user.first_name;
|
|
59
|
+
if (user.last_name)
|
|
60
|
+
out.family_name = user.last_name;
|
|
61
|
+
// Okta's preferred_username is the login: the username here, else the email.
|
|
62
|
+
const login = user.username ?? email?.email_address;
|
|
63
|
+
if (login)
|
|
64
|
+
out.preferred_username = login;
|
|
65
|
+
if (email) {
|
|
66
|
+
out.email = email.email_address;
|
|
67
|
+
out.email_verified = email.verified;
|
|
68
|
+
}
|
|
69
|
+
if (user.image_url)
|
|
70
|
+
out.picture = user.image_url;
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Pure projection of the provider state onto okta-auth-js's `AuthState`.
|
|
75
|
+
* `token` is the session token: `undefined` while it is being read (the state
|
|
76
|
+
* is then `null`, as Okta's is before its first evaluation), `null` when there
|
|
77
|
+
* is none.
|
|
78
|
+
*/
|
|
79
|
+
function oktaAuthStateFrom(state, token) {
|
|
80
|
+
if (state.status === 'loading')
|
|
81
|
+
return null;
|
|
82
|
+
if (state.status !== 'signed_in')
|
|
83
|
+
return { isAuthenticated: false };
|
|
84
|
+
if (token === undefined)
|
|
85
|
+
return null;
|
|
86
|
+
if (token === null || !state.claims)
|
|
87
|
+
return { isAuthenticated: true };
|
|
88
|
+
const profile = oktaUserFrom(state.user);
|
|
89
|
+
return {
|
|
90
|
+
isAuthenticated: true,
|
|
91
|
+
idToken: { idToken: token, claims: { ...state.claims, ...profile, sub: state.claims.sub } },
|
|
92
|
+
accessToken: { accessToken: token, claims: state.claims },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** okta-auth-js's `toRelativeUrl(path, baseUrl)`: an absolute URL loses its `baseUrl` prefix. */
|
|
96
|
+
function toRelativeUrlCompat(path = '', baseUrl = '') {
|
|
97
|
+
let out = path;
|
|
98
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(out))
|
|
99
|
+
out = out.substring(baseUrl.length);
|
|
100
|
+
return out.charAt(0) === '/' ? out : `/${out}`;
|
|
101
|
+
}
|
|
102
|
+
/** When a JWT expires (ms since epoch); unknown expiry counts as not expiring. */
|
|
103
|
+
function expiresAt(token) {
|
|
104
|
+
try {
|
|
105
|
+
const part = (token.split('.')[1] ?? '').replace(/-/g, '+').replace(/_/g, '/');
|
|
106
|
+
const exp = JSON.parse(atob(part.padEnd(Math.ceil(part.length / 4) * 4, '='))).exp;
|
|
107
|
+
return typeof exp === 'number' ? exp * 1000 : Number.POSITIVE_INFINITY;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return Number.POSITIVE_INFINITY;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Like okta-auth-js's `expireEarlySeconds`: a token this close to expiry is not handed out. */
|
|
114
|
+
const EXPIRE_EARLY_MS = 10_000;
|
|
115
|
+
/**
|
|
116
|
+
* `new OktaAuth(config)` from `@okta/okta-auth-js`, on Atlas, for a React app
|
|
117
|
+
* that renders `<AtlasProvider>`. The config is accepted and ignored apart from
|
|
118
|
+
* `signInUrl` and `postLogoutRedirectUri`: sign-in runs on your Atlas pages and
|
|
119
|
+
* the provider holds the session.
|
|
120
|
+
*/
|
|
121
|
+
class OktaAuthCompat {
|
|
122
|
+
options;
|
|
123
|
+
/** okta-auth-js's `oktaAuth.token` namespace (`getUserInfo` only). */
|
|
124
|
+
token;
|
|
125
|
+
atlas;
|
|
126
|
+
cached = null;
|
|
127
|
+
pending = null;
|
|
128
|
+
/**
|
|
129
|
+
* @param atlas Where the provider state comes from. Internal: the hook passes
|
|
130
|
+
* its own; by default the `<AtlasProvider>` mounted on the page.
|
|
131
|
+
*/
|
|
132
|
+
constructor(options = {}, atlas) {
|
|
133
|
+
this.options = options;
|
|
134
|
+
this.token = { getUserInfo: () => this.getUser() };
|
|
135
|
+
if (atlas) {
|
|
136
|
+
this.atlas = atlas;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.atlas = () => (0, active_atlas_1.requireActive)('OktaAuthCompat');
|
|
140
|
+
// Keep a token on hand for the synchronous getters, as Okta's token manager does.
|
|
141
|
+
const prefetch = (state) => {
|
|
142
|
+
if (state?.status === 'signed_in')
|
|
143
|
+
void this.getFreshAccessToken().catch(() => undefined);
|
|
144
|
+
};
|
|
145
|
+
(0, active_atlas_1.onActiveAtlasChange)(prefetch);
|
|
146
|
+
prefetch((0, active_atlas_1.getActiveAtlas)());
|
|
147
|
+
}
|
|
148
|
+
/** Open your Atlas sign-in page, coming back to `originalUri` afterwards. */
|
|
149
|
+
async signInWithRedirect(options = {}) {
|
|
150
|
+
(0, components_shared_1.navigateTo)((0, components_shared_1.withRedirect)(this.options.signInUrl ?? '/sign-in', options.originalUri));
|
|
151
|
+
}
|
|
152
|
+
/** Sign out, then go to `postLogoutRedirectUri` (default `/`). */
|
|
153
|
+
async signOut(options = {}) {
|
|
154
|
+
await this.atlas().signOut();
|
|
155
|
+
this.cached = null;
|
|
156
|
+
(0, components_shared_1.navigateTo)(options.postLogoutRedirectUri ?? this.options.postLogoutRedirectUri ?? '/');
|
|
157
|
+
}
|
|
158
|
+
async isAuthenticated() {
|
|
159
|
+
return this.atlas().status === 'signed_in';
|
|
160
|
+
}
|
|
161
|
+
/** The signed-in user's claims; throws `AuthSdkError` when nobody is signed in, like Okta. */
|
|
162
|
+
async getUser() {
|
|
163
|
+
const atlas = this.atlas();
|
|
164
|
+
const user = atlas.status === 'signed_in' ? oktaUserFrom(atlas.user) : null;
|
|
165
|
+
if (!user)
|
|
166
|
+
throw new OktaCompatAuthSdkError('getUser: no user is signed in');
|
|
167
|
+
return user;
|
|
168
|
+
}
|
|
169
|
+
/** The session token on hand (synchronous, like okta-auth-js), refreshed in the background. */
|
|
170
|
+
getAccessToken() {
|
|
171
|
+
void this.getFreshAccessToken().catch(() => undefined);
|
|
172
|
+
return this.current();
|
|
173
|
+
}
|
|
174
|
+
/** Atlas has one session token: the same value as `getAccessToken()`. */
|
|
175
|
+
getIdToken() {
|
|
176
|
+
return this.getAccessToken();
|
|
177
|
+
}
|
|
178
|
+
/** Read a fresh session token now (the async form of `getAccessToken()`). */
|
|
179
|
+
getFreshAccessToken() {
|
|
180
|
+
if (!this.pending) {
|
|
181
|
+
this.pending = (async () => {
|
|
182
|
+
const atlas = this.atlas();
|
|
183
|
+
const sub = atlas.claims?.sub;
|
|
184
|
+
if (atlas.status !== 'signed_in' || !sub) {
|
|
185
|
+
this.cached = null;
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
const token = await atlas.getToken();
|
|
189
|
+
this.cached = token ? { token, sub, expiresAt: expiresAt(token) } : null;
|
|
190
|
+
return token ?? undefined;
|
|
191
|
+
})().finally(() => {
|
|
192
|
+
this.pending = null;
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return this.pending;
|
|
196
|
+
}
|
|
197
|
+
current() {
|
|
198
|
+
let atlas;
|
|
199
|
+
try {
|
|
200
|
+
atlas = this.atlas();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
const c = this.cached;
|
|
206
|
+
// Never hand one user's token to another, nor a token about to expire.
|
|
207
|
+
if (atlas.status !== 'signed_in' || !c || c.sub !== atlas.claims?.sub)
|
|
208
|
+
return undefined;
|
|
209
|
+
return c.expiresAt - EXPIRE_EARLY_MS > Date.now() ? c.token : undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.OktaAuthCompat = OktaAuthCompat;
|
|
213
|
+
/** `useOktaAuth()` from `@okta/okta-react`, on Atlas: `{ oktaAuth, authState }`. */
|
|
214
|
+
function useOktaAuthCompat() {
|
|
215
|
+
const atlas = (0, AtlasProvider_1.useAtlas)();
|
|
216
|
+
const latest = (0, react_1.useRef)(atlas);
|
|
217
|
+
latest.current = atlas;
|
|
218
|
+
// One stable object, like okta-react's: effects that depend on it do not re-run.
|
|
219
|
+
const oktaAuth = (0, react_1.useMemo)(() => new OktaAuthCompat({}, () => latest.current), []);
|
|
220
|
+
const sub = atlas.status === 'signed_in' ? (atlas.claims?.sub ?? null) : null;
|
|
221
|
+
const [token, setToken] = (0, react_1.useState)(null);
|
|
222
|
+
(0, react_1.useEffect)(() => {
|
|
223
|
+
if (!sub)
|
|
224
|
+
return;
|
|
225
|
+
let live = true;
|
|
226
|
+
oktaAuth.getFreshAccessToken().then((value) => {
|
|
227
|
+
if (live)
|
|
228
|
+
setToken({ sub, value: value ?? null });
|
|
229
|
+
}, () => {
|
|
230
|
+
if (live)
|
|
231
|
+
setToken({ sub, value: null });
|
|
232
|
+
});
|
|
233
|
+
return () => {
|
|
234
|
+
live = false;
|
|
235
|
+
};
|
|
236
|
+
// New claims mean a refreshed session token: read it again.
|
|
237
|
+
}, [oktaAuth, sub, atlas.claims]);
|
|
238
|
+
return { oktaAuth, authState: oktaAuthStateFrom(atlas, token && token.sub === sub ? token.value : undefined) };
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=compat-okta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-okta.js","sourceRoot":"","sources":["../src/compat-okta.ts"],"names":[],"mappings":"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"}
|
package/dist/compat.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Drop-in compatibility helpers for apps moving to Atlas from Auth.js (NextAuth),
|
|
3
|
-
* Auth0 (auth0-react / nextjs-auth0), Supabase Auth
|
|
3
|
+
* Auth0 (auth0-react / nextjs-auth0), Supabase Auth, Better Auth, Okta (okta-react /
|
|
4
|
+
* okta-auth-js), Kinde and Descope.
|
|
4
5
|
*
|
|
5
6
|
* `atlas migrate code --from <vendor>` rewrites an app's imports onto these, so
|
|
6
7
|
* the migrated code keeps the shapes it was written against (`{ data, status }`
|
|
@@ -16,6 +17,9 @@ import { type ComponentType, type ReactNode } from 'react';
|
|
|
16
17
|
import type { AtlasUser, SessionClaims } from './types';
|
|
17
18
|
import { type ActiveAtlas, type GetTokenOptions } from './active-atlas';
|
|
18
19
|
export { getActiveAtlas, type ActiveAtlas } from './active-atlas';
|
|
20
|
+
export * from './compat-okta';
|
|
21
|
+
export * from './compat-kinde';
|
|
22
|
+
export * from './compat-descope';
|
|
19
23
|
/** The primary email address, else the first verified one, else any. */
|
|
20
24
|
export declare function primaryEmail(user: AtlasUser | null): {
|
|
21
25
|
address: string;
|
package/dist/compat.js
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
'use client';
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
15
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
16
|
+
};
|
|
3
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
18
|
exports.LoginRequiredError = exports.getActiveAtlas = void 0;
|
|
5
19
|
exports.primaryEmail = primaryEmail;
|
|
@@ -26,7 +40,8 @@ exports.betterAuthSessionFrom = betterAuthSessionFrom;
|
|
|
26
40
|
exports.createBetterAuthCompatClient = createBetterAuthCompatClient;
|
|
27
41
|
/**
|
|
28
42
|
* Drop-in compatibility helpers for apps moving to Atlas from Auth.js (NextAuth),
|
|
29
|
-
* Auth0 (auth0-react / nextjs-auth0), Supabase Auth
|
|
43
|
+
* Auth0 (auth0-react / nextjs-auth0), Supabase Auth, Better Auth, Okta (okta-react /
|
|
44
|
+
* okta-auth-js), Kinde and Descope.
|
|
30
45
|
*
|
|
31
46
|
* `atlas migrate code --from <vendor>` rewrites an app's imports onto these, so
|
|
32
47
|
* the migrated code keeps the shapes it was written against (`{ data, status }`
|
|
@@ -44,6 +59,9 @@ const components_shared_1 = require("./components-shared");
|
|
|
44
59
|
const active_atlas_1 = require("./active-atlas");
|
|
45
60
|
var active_atlas_2 = require("./active-atlas");
|
|
46
61
|
Object.defineProperty(exports, "getActiveAtlas", { enumerable: true, get: function () { return active_atlas_2.getActiveAtlas; } });
|
|
62
|
+
__exportStar(require("./compat-okta"), exports);
|
|
63
|
+
__exportStar(require("./compat-kinde"), exports);
|
|
64
|
+
__exportStar(require("./compat-descope"), exports);
|
|
47
65
|
// ---- shared user projection --------------------------------------------------
|
|
48
66
|
/** The primary email address, else the first verified one, else any. */
|
|
49
67
|
function primaryEmail(user) {
|