@atlasauth/react 0.19.0 → 0.21.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 +14 -0
- package/dist/AtlasProvider.js +17 -1
- package/dist/AtlasProvider.js.map +1 -1
- package/dist/account-factors.d.ts +14 -0
- package/dist/account-factors.js +195 -0
- package/dist/account-factors.js.map +1 -0
- package/dist/account.d.ts +12 -1
- package/dist/account.js +92 -3
- package/dist/account.js.map +1 -1
- package/dist/app-launcher.d.ts +11 -0
- package/dist/app-launcher.js +28 -0
- package/dist/app-launcher.js.map +1 -0
- package/dist/billing.d.ts +25 -4
- package/dist/billing.js +40 -22
- package/dist/billing.js.map +1 -1
- package/dist/compat-amplify.d.ts +116 -0
- package/dist/compat-amplify.js +212 -0
- package/dist/compat-amplify.js.map +1 -0
- package/dist/compat-baas.d.ts +155 -0
- package/dist/compat-baas.js +401 -0
- package/dist/compat-baas.js.map +1 -0
- 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-firebase.d.ts +67 -0
- package/dist/compat-firebase.js +166 -0
- package/dist/compat-firebase.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-msal.d.ts +84 -0
- package/dist/compat-msal.js +158 -0
- package/dist/compat-msal.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 +11 -1
- package/dist/compat.js +27 -1
- package/dist/compat.js.map +1 -1
- package/dist/components.d.ts +12 -1
- package/dist/components.js +26 -2
- package/dist/components.js.map +1 -1
- package/dist/connected-accounts.d.ts +36 -0
- package/dist/connected-accounts.js +107 -0
- package/dist/connected-accounts.js.map +1 -0
- package/dist/delegated-ui.d.ts +49 -0
- package/dist/delegated-ui.js +42 -0
- package/dist/delegated-ui.js.map +1 -0
- package/dist/flow.d.ts +37 -1
- package/dist/flow.js +111 -2
- package/dist/flow.js.map +1 -1
- package/dist/i18n.js +14 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/marketing.d.ts +31 -0
- package/dist/marketing.js +64 -0
- package/dist/marketing.js.map +1 -0
- package/dist/mfa-steps.d.ts +9 -0
- package/dist/mfa-steps.js +51 -0
- package/dist/mfa-steps.js.map +1 -1
- package/dist/organization-admin.d.ts +38 -0
- package/dist/organization-admin.js +192 -0
- package/dist/organization-admin.js.map +1 -0
- package/dist/organization.d.ts +8 -1
- package/dist/organization.js +15 -2
- package/dist/organization.js.map +1 -1
- package/dist/profile-completion.d.ts +11 -0
- package/dist/profile-completion.js +49 -0
- package/dist/profile-completion.js.map +1 -0
- package/dist/profile-traits.d.ts +37 -0
- package/dist/profile-traits.js +143 -0
- package/dist/profile-traits.js.map +1 -0
- package/dist/sign-up.js +48 -7
- package/dist/sign-up.js.map +1 -1
- package/dist/styles.js +6 -4
- package/dist/styles.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -5
|
@@ -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,84 @@
|
|
|
1
|
+
import type { AtlasUser } from './types';
|
|
2
|
+
/** MSAL's `AccountInfo`, as far as apps read it. */
|
|
3
|
+
export interface MsalCompatAccount {
|
|
4
|
+
homeAccountId: string;
|
|
5
|
+
localAccountId: string;
|
|
6
|
+
environment: string;
|
|
7
|
+
tenantId: string;
|
|
8
|
+
username: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
idTokenClaims?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface MsalCompatAuthResult {
|
|
13
|
+
accessToken: string;
|
|
14
|
+
idToken: string;
|
|
15
|
+
account: MsalCompatAccount;
|
|
16
|
+
scopes: string[];
|
|
17
|
+
expiresOn: Date | null;
|
|
18
|
+
tokenType: 'Bearer';
|
|
19
|
+
idTokenClaims: Record<string, unknown>;
|
|
20
|
+
uniqueId: string;
|
|
21
|
+
tenantId: string;
|
|
22
|
+
fromCache: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Thrown like MSAL's `InteractionRequiredAuthError` when nobody is signed in. */
|
|
25
|
+
export declare class MsalCompatInteractionRequiredError extends Error {
|
|
26
|
+
readonly errorCode = "interaction_required";
|
|
27
|
+
constructor();
|
|
28
|
+
}
|
|
29
|
+
export declare function msalAccountFrom(user: AtlasUser | null, claims?: Record<string, unknown> | null): MsalCompatAccount | null;
|
|
30
|
+
/** `PublicClientApplication`, answered by the Atlas session. The config is accepted and ignored. */
|
|
31
|
+
export declare class MsalCompatClient {
|
|
32
|
+
constructor(_config?: unknown);
|
|
33
|
+
/** `PublicClientApplication.createPublicClientApplication(config)`. */
|
|
34
|
+
static createPublicClientApplication(config?: unknown): Promise<MsalCompatClient>;
|
|
35
|
+
initialize(): Promise<void>;
|
|
36
|
+
handleRedirectPromise(_hash?: string): Promise<MsalCompatAuthResult | null>;
|
|
37
|
+
getAllAccounts(): MsalCompatAccount[];
|
|
38
|
+
getActiveAccount(): MsalCompatAccount | null;
|
|
39
|
+
getAccountByHomeId(id: string): MsalCompatAccount | null;
|
|
40
|
+
getAccountByLocalId(id: string): MsalCompatAccount | null;
|
|
41
|
+
getAccountByUsername(username: string): MsalCompatAccount | null;
|
|
42
|
+
/** There is one account: the signed-in user. */
|
|
43
|
+
setActiveAccount(_account: MsalCompatAccount | null): void;
|
|
44
|
+
acquireTokenSilent(request?: {
|
|
45
|
+
scopes?: string[];
|
|
46
|
+
account?: unknown;
|
|
47
|
+
}): Promise<MsalCompatAuthResult>;
|
|
48
|
+
acquireTokenPopup(request?: {
|
|
49
|
+
scopes?: string[];
|
|
50
|
+
}): Promise<MsalCompatAuthResult>;
|
|
51
|
+
acquireTokenRedirect(request?: {
|
|
52
|
+
redirectUri?: string;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
loginRedirect(request?: {
|
|
55
|
+
redirectUri?: string;
|
|
56
|
+
redirectStartPage?: string;
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
/** There is no popup sign-in: this opens the sign-in page in the window. */
|
|
59
|
+
loginPopup(request?: {
|
|
60
|
+
redirectUri?: string;
|
|
61
|
+
}): Promise<MsalCompatAuthResult>;
|
|
62
|
+
logoutRedirect(request?: {
|
|
63
|
+
postLogoutRedirectUri?: string;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
logoutPopup(request?: {
|
|
66
|
+
postLogoutRedirectUri?: string;
|
|
67
|
+
mainWindowRedirectUri?: string;
|
|
68
|
+
}): Promise<void>;
|
|
69
|
+
/** MSAL events have no Atlas counterpart; the callback never fires. */
|
|
70
|
+
addEventCallback(_callback: unknown): string | null;
|
|
71
|
+
removeEventCallback(_id: string): void;
|
|
72
|
+
}
|
|
73
|
+
/** The single client `useMsalCompat().instance` returns. */
|
|
74
|
+
export declare const msalCompatInstance: MsalCompatClient;
|
|
75
|
+
/** `useMsal()`: `{ instance, accounts, inProgress }`. */
|
|
76
|
+
export declare function useMsalCompat(): {
|
|
77
|
+
instance: MsalCompatClient;
|
|
78
|
+
accounts: MsalCompatAccount[];
|
|
79
|
+
inProgress: 'startup' | 'none';
|
|
80
|
+
};
|
|
81
|
+
/** `useIsAuthenticated()`. */
|
|
82
|
+
export declare function useIsAuthenticatedCompat(_matchAccount?: unknown): boolean;
|
|
83
|
+
/** `useAccount(accountIdentifiers)`: the signed-in account, or null. */
|
|
84
|
+
export declare function useAccountCompat(_accountIdentifiers?: unknown): MsalCompatAccount | null;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.msalCompatInstance = exports.MsalCompatClient = exports.MsalCompatInteractionRequiredError = void 0;
|
|
5
|
+
exports.msalAccountFrom = msalAccountFrom;
|
|
6
|
+
exports.useMsalCompat = useMsalCompat;
|
|
7
|
+
exports.useIsAuthenticatedCompat = useIsAuthenticatedCompat;
|
|
8
|
+
exports.useAccountCompat = useAccountCompat;
|
|
9
|
+
/**
|
|
10
|
+
* MSAL (Azure AD B2C / Microsoft Entra External ID) compatibility helpers, for
|
|
11
|
+
* `atlas migrate code --from azure-ad-b2c` / `--from entra-external-id`.
|
|
12
|
+
*
|
|
13
|
+
* - `MsalCompatClient` stands in for `PublicClientApplication`: the account
|
|
14
|
+
* and token methods apps call (`getAllAccounts`, `getActiveAccount`,
|
|
15
|
+
* `acquireTokenSilent`, `loginRedirect`, `logoutRedirect`, …) answer from
|
|
16
|
+
* the `<AtlasProvider>` session; `acquireTokenSilent` resolves the Atlas
|
|
17
|
+
* session JWT as both `accessToken` and `idToken`.
|
|
18
|
+
* - `useMsalCompat`, `useIsAuthenticatedCompat`, `useAccountCompat` keep the
|
|
19
|
+
* `@azure/msal-react` hook shapes.
|
|
20
|
+
*
|
|
21
|
+
* `localAccountId` / `homeAccountId` are the ATLAS user id; the directory
|
|
22
|
+
* object id (`oid`) the user had is kept by the import as their external id.
|
|
23
|
+
*/
|
|
24
|
+
const AtlasProvider_1 = require("./AtlasProvider");
|
|
25
|
+
const components_shared_1 = require("./components-shared");
|
|
26
|
+
const compat_1 = require("./compat");
|
|
27
|
+
const active_atlas_1 = require("./active-atlas");
|
|
28
|
+
/** Thrown like MSAL's `InteractionRequiredAuthError` when nobody is signed in. */
|
|
29
|
+
class MsalCompatInteractionRequiredError extends Error {
|
|
30
|
+
errorCode = 'interaction_required';
|
|
31
|
+
constructor() {
|
|
32
|
+
super('interaction_required: no signed-in user');
|
|
33
|
+
this.name = 'InteractionRequiredAuthError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.MsalCompatInteractionRequiredError = MsalCompatInteractionRequiredError;
|
|
37
|
+
function msalAccountFrom(user, claims = null) {
|
|
38
|
+
if (!user)
|
|
39
|
+
return null;
|
|
40
|
+
const email = (0, compat_1.primaryEmail)(user)?.address;
|
|
41
|
+
const name = (0, compat_1.displayName)(user) ?? undefined;
|
|
42
|
+
return {
|
|
43
|
+
homeAccountId: user.id,
|
|
44
|
+
localAccountId: user.id,
|
|
45
|
+
environment: 'atlas',
|
|
46
|
+
tenantId: 'atlas',
|
|
47
|
+
username: email ?? user.username ?? user.id,
|
|
48
|
+
...(name ? { name } : {}),
|
|
49
|
+
idTokenClaims: { ...(claims ?? {}), ...(email ? { emails: [email], email } : {}), ...(name ? { name } : {}) },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function current() {
|
|
53
|
+
const atlas = (0, active_atlas_1.getActiveAtlas)();
|
|
54
|
+
return atlas?.status === 'signed_in' ? msalAccountFrom(atlas.user, atlas.claims ?? null) : null;
|
|
55
|
+
}
|
|
56
|
+
function goToSignIn(redirectUri) {
|
|
57
|
+
const back = redirectUri ?? (typeof window !== 'undefined' ? window.location.href : undefined);
|
|
58
|
+
(0, components_shared_1.navigateTo)((0, components_shared_1.withRedirect)('/sign-in', back));
|
|
59
|
+
}
|
|
60
|
+
/** `PublicClientApplication`, answered by the Atlas session. The config is accepted and ignored. */
|
|
61
|
+
class MsalCompatClient {
|
|
62
|
+
constructor(_config) { }
|
|
63
|
+
/** `PublicClientApplication.createPublicClientApplication(config)`. */
|
|
64
|
+
static async createPublicClientApplication(config) {
|
|
65
|
+
return new MsalCompatClient(config);
|
|
66
|
+
}
|
|
67
|
+
async initialize() { }
|
|
68
|
+
async handleRedirectPromise(_hash) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
getAllAccounts() {
|
|
72
|
+
const account = current();
|
|
73
|
+
return account ? [account] : [];
|
|
74
|
+
}
|
|
75
|
+
getActiveAccount() {
|
|
76
|
+
return current();
|
|
77
|
+
}
|
|
78
|
+
getAccountByHomeId(id) {
|
|
79
|
+
const account = current();
|
|
80
|
+
return account && account.homeAccountId === id ? account : null;
|
|
81
|
+
}
|
|
82
|
+
getAccountByLocalId(id) {
|
|
83
|
+
return this.getAccountByHomeId(id);
|
|
84
|
+
}
|
|
85
|
+
getAccountByUsername(username) {
|
|
86
|
+
const account = current();
|
|
87
|
+
return account && account.username.toLowerCase() === username.toLowerCase() ? account : null;
|
|
88
|
+
}
|
|
89
|
+
/** There is one account: the signed-in user. */
|
|
90
|
+
setActiveAccount(_account) { }
|
|
91
|
+
async acquireTokenSilent(request = {}) {
|
|
92
|
+
const atlas = (0, active_atlas_1.requireActive)('acquireTokenSilent');
|
|
93
|
+
const account = current();
|
|
94
|
+
const token = account ? await atlas.getToken() : null;
|
|
95
|
+
if (!account || !token)
|
|
96
|
+
throw new MsalCompatInteractionRequiredError();
|
|
97
|
+
const exp = typeof atlas.claims?.exp === 'number' ? new Date(atlas.claims.exp * 1000) : null;
|
|
98
|
+
return {
|
|
99
|
+
accessToken: token,
|
|
100
|
+
idToken: token,
|
|
101
|
+
account,
|
|
102
|
+
scopes: request.scopes ?? [],
|
|
103
|
+
expiresOn: exp,
|
|
104
|
+
tokenType: 'Bearer',
|
|
105
|
+
idTokenClaims: account.idTokenClaims ?? {},
|
|
106
|
+
uniqueId: account.localAccountId,
|
|
107
|
+
tenantId: account.tenantId,
|
|
108
|
+
fromCache: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async acquireTokenPopup(request = {}) {
|
|
112
|
+
return this.acquireTokenSilent(request);
|
|
113
|
+
}
|
|
114
|
+
async acquireTokenRedirect(request = {}) {
|
|
115
|
+
if (!current())
|
|
116
|
+
goToSignIn(request.redirectUri);
|
|
117
|
+
}
|
|
118
|
+
async loginRedirect(request = {}) {
|
|
119
|
+
goToSignIn(request.redirectStartPage ?? request.redirectUri);
|
|
120
|
+
}
|
|
121
|
+
/** There is no popup sign-in: this opens the sign-in page in the window. */
|
|
122
|
+
async loginPopup(request = {}) {
|
|
123
|
+
goToSignIn(request.redirectUri);
|
|
124
|
+
return new Promise(() => undefined);
|
|
125
|
+
}
|
|
126
|
+
async logoutRedirect(request = {}) {
|
|
127
|
+
await (0, active_atlas_1.requireActive)('logoutRedirect').signOut();
|
|
128
|
+
if (request.postLogoutRedirectUri)
|
|
129
|
+
(0, components_shared_1.navigateTo)(request.postLogoutRedirectUri);
|
|
130
|
+
}
|
|
131
|
+
async logoutPopup(request = {}) {
|
|
132
|
+
await this.logoutRedirect({ postLogoutRedirectUri: request.mainWindowRedirectUri ?? request.postLogoutRedirectUri });
|
|
133
|
+
}
|
|
134
|
+
/** MSAL events have no Atlas counterpart; the callback never fires. */
|
|
135
|
+
addEventCallback(_callback) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
removeEventCallback(_id) { }
|
|
139
|
+
}
|
|
140
|
+
exports.MsalCompatClient = MsalCompatClient;
|
|
141
|
+
/** The single client `useMsalCompat().instance` returns. */
|
|
142
|
+
exports.msalCompatInstance = new MsalCompatClient();
|
|
143
|
+
/** `useMsal()`: `{ instance, accounts, inProgress }`. */
|
|
144
|
+
function useMsalCompat() {
|
|
145
|
+
const atlas = (0, AtlasProvider_1.useAtlas)();
|
|
146
|
+
const account = atlas.status === 'signed_in' ? msalAccountFrom(atlas.user) : null;
|
|
147
|
+
return { instance: exports.msalCompatInstance, accounts: account ? [account] : [], inProgress: atlas.status === 'loading' ? 'startup' : 'none' };
|
|
148
|
+
}
|
|
149
|
+
/** `useIsAuthenticated()`. */
|
|
150
|
+
function useIsAuthenticatedCompat(_matchAccount) {
|
|
151
|
+
return (0, AtlasProvider_1.useAtlas)().status === 'signed_in';
|
|
152
|
+
}
|
|
153
|
+
/** `useAccount(accountIdentifiers)`: the signed-in account, or null. */
|
|
154
|
+
function useAccountCompat(_accountIdentifiers) {
|
|
155
|
+
const atlas = (0, AtlasProvider_1.useAtlas)();
|
|
156
|
+
return atlas.status === 'signed_in' ? msalAccountFrom(atlas.user) : null;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=compat-msal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-msal.js","sourceRoot":"","sources":["../src/compat-msal.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;AAwDb,0CAaC;AAgHD,sCAIC;AAGD,4DAEC;AAGD,4CAGC;AAlMD;;;;;;;;;;;;;;GAcG;AACH,mDAA2C;AAC3C,2DAA+D;AAC/D,qCAAqD;AAErD,iDAA+D;AA0B/D,kFAAkF;AAClF,MAAa,kCAAmC,SAAQ,KAAK;IAClD,SAAS,GAAG,sBAAsB,CAAC;IAC5C;QACE,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAND,gFAMC;AAED,SAAgB,eAAe,CAAC,IAAsB,EAAE,SAAyC,IAAI;IACnG,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,IAAI,SAAS,CAAC;IAC5C,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,EAAE;QACtB,cAAc,EAAE,IAAI,CAAC,EAAE;QACvB,WAAW,EAAE,OAAO;QACpB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE;QAC3C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,aAAa,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KAC9G,CAAC;AACJ,CAAC;AAED,SAAS,OAAO;IACd,MAAM,KAAK,GAAG,IAAA,6BAAc,GAAE,CAAC;IAC/B,OAAO,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAG,KAAK,CAAC,MAAyC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtI,CAAC;AAED,SAAS,UAAU,CAAC,WAAoB;IACtC,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/F,IAAA,8BAAU,EAAC,IAAA,gCAAY,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,oGAAoG;AACpG,MAAa,gBAAgB;IAC3B,YAAY,OAAiB,IAAG,CAAC;IAEjC,uEAAuE;IACvE,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,MAAgB;QACzD,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC,KAAK,CAAC,qBAAqB,CAAC,KAAc;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc;QACZ,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IAED,gBAAgB;QACd,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,kBAAkB,CAAC,EAAU;QAC3B,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,OAAO,OAAO,IAAI,OAAO,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAED,mBAAmB,CAAC,EAAU;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,oBAAoB,CAAC,QAAgB;QACnC,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,OAAO,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/F,CAAC;IAED,gDAAgD;IAChD,gBAAgB,CAAC,QAAkC,IAAS,CAAC;IAE7D,KAAK,CAAC,kBAAkB,CAAC,UAAoD,EAAE;QAC7E,MAAM,KAAK,GAAG,IAAA,4BAAa,EAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,kCAAkC,EAAE,CAAC;QACvE,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7F,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,KAAK;YACd,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;YAC1C,QAAQ,EAAE,OAAO,CAAC,cAAc;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAiC,EAAE;QACzD,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,UAAoC,EAAE;QAC/D,IAAI,CAAC,OAAO,EAAE;YAAE,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAgE,EAAE;QACpF,UAAU,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,UAAU,CAAC,UAAoC,EAAE;QACrD,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAA8C,EAAE;QACnE,MAAM,IAAA,4BAAa,EAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,qBAAqB;YAAE,IAAA,8BAAU,EAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAA8E,EAAE;QAChG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACvH,CAAC;IAED,uEAAuE;IACvE,gBAAgB,CAAC,SAAkB;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,CAAC,GAAW,IAAS,CAAC;CAC1C;AA7FD,4CA6FC;AAED,4DAA4D;AAC/C,QAAA,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEzD,yDAAyD;AACzD,SAAgB,aAAa;IAC3B,MAAM,KAAK,GAAG,IAAA,wBAAQ,GAAE,CAAC;IACzB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,EAAE,QAAQ,EAAE,0BAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3I,CAAC;AAED,8BAA8B;AAC9B,SAAgB,wBAAwB,CAAC,aAAuB;IAC9D,OAAO,IAAA,wBAAQ,GAAE,CAAC,MAAM,KAAK,WAAW,CAAC;AAC3C,CAAC;AAED,wEAAwE;AACxE,SAAgB,gBAAgB,CAAC,mBAA6B;IAC5D,MAAM,KAAK,GAAG,IAAA,wBAAQ,GAAE,CAAC;IACzB,OAAO,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC"}
|
|
@@ -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
|
+
};
|