@atlasauth/backend 0.23.0 → 0.25.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/auth0-session.d.ts +23 -0
- package/dist/auth0-session.js +80 -0
- package/dist/auth0-session.js.map +1 -0
- package/dist/better-auth.d.ts +4 -8
- package/dist/better-auth.js +42 -150
- package/dist/better-auth.js.map +1 -1
- package/dist/client/abac.d.ts +132 -0
- package/dist/client/abac.js +48 -0
- package/dist/client/abac.js.map +1 -0
- package/dist/client/access-policies.d.ts +100 -0
- package/dist/client/access-policies.js +29 -0
- package/dist/client/access-policies.js.map +1 -0
- package/dist/client/action-gallery.d.ts +1 -1
- package/dist/client/action-gallery.js.map +1 -1
- package/dist/client/actions.d.ts +129 -6
- package/dist/client/actions.js +4 -0
- package/dist/client/actions.js.map +1 -1
- package/dist/client/analytics-reports.d.ts +215 -0
- package/dist/client/analytics-reports.js +56 -0
- package/dist/client/analytics-reports.js.map +1 -0
- package/dist/client/app-catalog.d.ts +74 -0
- package/dist/client/app-catalog.js +30 -0
- package/dist/client/app-catalog.js.map +1 -0
- package/dist/client/attack-protection.d.ts +10 -0
- package/dist/client/attack-protection.js +8 -0
- package/dist/client/attack-protection.js.map +1 -1
- package/dist/client/audit-events.d.ts +71 -0
- package/dist/client/audit-events.js +28 -0
- package/dist/client/audit-events.js.map +1 -1
- package/dist/client/credentials.d.ts +8 -0
- package/dist/client/credentials.js.map +1 -1
- package/dist/client/delegated-ui-proxy.d.ts +25 -0
- package/dist/client/delegated-ui-proxy.js +46 -0
- package/dist/client/delegated-ui-proxy.js.map +1 -0
- package/dist/client/devices.d.ts +44 -0
- package/dist/client/devices.js +26 -0
- package/dist/client/devices.js.map +1 -0
- package/dist/client/email-templates.d.ts +1 -1
- package/dist/client/email-templates.js.map +1 -1
- package/dist/client/flags.d.ts +101 -0
- package/dist/client/flags.js +104 -0
- package/dist/client/flags.js.map +1 -0
- package/dist/client/groups.d.ts +146 -0
- package/dist/client/groups.js +67 -0
- package/dist/client/groups.js.map +1 -0
- package/dist/client/identity-verification.d.ts +62 -0
- package/dist/client/identity-verification.js +39 -0
- package/dist/client/identity-verification.js.map +1 -0
- package/dist/client/index.d.ts +997 -2
- package/dist/client/index.js +77 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/journeys.d.ts +108 -0
- package/dist/client/journeys.js +35 -0
- package/dist/client/journeys.js.map +1 -0
- package/dist/client/log-streams.d.ts +1 -1
- package/dist/client/marketing.d.ts +67 -0
- package/dist/client/marketing.js +26 -0
- package/dist/client/marketing.js.map +1 -0
- package/dist/client/mcp-gateways.d.ts +54 -0
- package/dist/client/mcp-gateways.js +25 -0
- package/dist/client/mcp-gateways.js.map +1 -0
- package/dist/client/messaging.d.ts +14 -3
- package/dist/client/messaging.js.map +1 -1
- package/dist/client/mfa-factors.d.ts +120 -0
- package/dist/client/mfa-factors.js +73 -0
- package/dist/client/mfa-factors.js.map +1 -0
- package/dist/client/migrations.d.ts +286 -0
- package/dist/client/migrations.js +103 -0
- package/dist/client/migrations.js.map +1 -0
- package/dist/client/network-acls.d.ts +6 -1
- package/dist/client/network-acls.js.map +1 -1
- package/dist/client/network-zones.d.ts +56 -0
- package/dist/client/network-zones.js +29 -0
- package/dist/client/network-zones.js.map +1 -0
- package/dist/client/notifications.d.ts +1 -1
- package/dist/client/notifications.js.map +1 -1
- package/dist/client/oauth-clients.d.ts +183 -3
- package/dist/client/oauth-clients.js +64 -0
- package/dist/client/oauth-clients.js.map +1 -1
- package/dist/client/org-role-grants.d.ts +57 -0
- package/dist/client/org-role-grants.js +40 -0
- package/dist/client/org-role-grants.js.map +1 -0
- package/dist/client/organizations.d.ts +52 -0
- package/dist/client/organizations.js +44 -0
- package/dist/client/organizations.js.map +1 -1
- package/dist/client/page-templates.d.ts +78 -0
- package/dist/client/page-templates.js +31 -0
- package/dist/client/page-templates.js.map +1 -0
- package/dist/client/passkey-api.d.ts +73 -0
- package/dist/client/passkey-api.js +34 -0
- package/dist/client/passkey-api.js.map +1 -0
- package/dist/client/resources.d.ts +149 -0
- package/dist/client/resources.js +73 -0
- package/dist/client/resources.js.map +1 -0
- package/dist/client/risk-based-mfa.d.ts +147 -0
- package/dist/client/risk-based-mfa.js +30 -0
- package/dist/client/risk-based-mfa.js.map +1 -1
- package/dist/client/roles.d.ts +4 -0
- package/dist/client/roles.js.map +1 -1
- package/dist/client/service-connectors.d.ts +83 -0
- package/dist/client/service-connectors.js +33 -0
- package/dist/client/service-connectors.js.map +1 -0
- package/dist/client/ssf.d.ts +111 -0
- package/dist/client/ssf.js +49 -0
- package/dist/client/ssf.js.map +1 -0
- package/dist/client/sso-onboarding.d.ts +6 -0
- package/dist/client/sso-onboarding.js.map +1 -1
- package/dist/client/users.d.ts +302 -0
- package/dist/client/users.js +125 -0
- package/dist/client/users.js.map +1 -1
- package/dist/client/vault.d.ts +85 -0
- package/dist/client/vault.js +50 -0
- package/dist/client/vault.js.map +1 -0
- package/dist/client/vc.d.ts +128 -0
- package/dist/client/vc.js +43 -0
- package/dist/client/vc.js.map +1 -0
- package/dist/client/webhooks.d.ts +31 -2
- package/dist/client/webhooks.js.map +1 -1
- package/dist/client/workflows.d.ts +131 -0
- package/dist/client/workflows.js +36 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/framework-bridge.d.ts +98 -0
- package/dist/framework-bridge.js +264 -0
- package/dist/framework-bridge.js.map +1 -0
- package/dist/framework-sessions.d.ts +147 -0
- package/dist/framework-sessions.js +544 -0
- package/dist/framework-sessions.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy-issuer-presets.d.ts +85 -0
- package/dist/legacy-issuer-presets.js +165 -0
- package/dist/legacy-issuer-presets.js.map +1 -0
- package/dist/legacy-issuers.d.ts +16 -2
- package/dist/legacy-issuers.js +16 -1
- package/dist/legacy-issuers.js.map +1 -1
- package/dist/legacy-verify.d.ts +103 -0
- package/dist/legacy-verify.js +244 -0
- package/dist/legacy-verify.js.map +1 -0
- package/dist/magic-did.d.ts +5 -0
- package/dist/magic-did.js +49 -0
- package/dist/magic-did.js.map +1 -0
- package/dist/migration-bridge.d.ts +162 -0
- package/dist/migration-bridge.js +354 -0
- package/dist/migration-bridge.js.map +1 -0
- package/dist/migration-presets-g3.d.ts +2 -0
- package/dist/migration-presets-g3.js +254 -0
- package/dist/migration-presets-g3.js.map +1 -0
- package/dist/migration-presets-g4/authentik.d.ts +14 -0
- package/dist/migration-presets-g4/authentik.js +37 -0
- package/dist/migration-presets-g4/authentik.js.map +1 -0
- package/dist/migration-presets-g4/fusionauth.d.ts +2 -0
- package/dist/migration-presets-g4/fusionauth.js +52 -0
- package/dist/migration-presets-g4/fusionauth.js.map +1 -0
- package/dist/migration-presets-g4/hanko.d.ts +12 -0
- package/dist/migration-presets-g4/hanko.js +46 -0
- package/dist/migration-presets-g4/hanko.js.map +1 -0
- package/dist/migration-presets-g4/keycloak.d.ts +16 -0
- package/dist/migration-presets-g4/keycloak.js +37 -0
- package/dist/migration-presets-g4/keycloak.js.map +1 -0
- package/dist/migration-presets-g4/logto.d.ts +12 -0
- package/dist/migration-presets-g4/logto.js +35 -0
- package/dist/migration-presets-g4/logto.js.map +1 -0
- package/dist/migration-presets-g4/ory.d.ts +2 -0
- package/dist/migration-presets-g4/ory.js +67 -0
- package/dist/migration-presets-g4/ory.js.map +1 -0
- package/dist/migration-presets-g4/supertokens.d.ts +13 -0
- package/dist/migration-presets-g4/supertokens.js +35 -0
- package/dist/migration-presets-g4/supertokens.js.map +1 -0
- package/dist/migration-presets-g4/zitadel.d.ts +2 -0
- package/dist/migration-presets-g4/zitadel.js +36 -0
- package/dist/migration-presets-g4/zitadel.js.map +1 -0
- package/dist/migration-presets-g4.d.ts +10 -0
- package/dist/migration-presets-g4.js +30 -0
- package/dist/migration-presets-g4.js.map +1 -0
- package/dist/migration-presets.d.ts +156 -0
- package/dist/migration-presets.js +536 -0
- package/dist/migration-presets.js.map +1 -0
- package/dist/request-auth.d.ts +32 -0
- package/dist/request-auth.js +72 -0
- package/dist/request-auth.js.map +1 -0
- package/dist/verify.d.ts +2 -0
- package/dist/verify.js.map +1 -1
- package/dist/workos-session.d.ts +30 -0
- package/dist/workos-session.js +123 -0
- package/dist/workos-session.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ZERO-LOGOUT BRIDGE PRESETS — per vendor, how an old session is recognised.
|
|
4
|
+
*
|
|
5
|
+
* Shared by the Atlas API (which verifies the token and resolves the user) and
|
|
6
|
+
* the SDK middleware (which knows which cookie / header carries it), so both
|
|
7
|
+
* read one table. Pure data plus a few string templates: safe on every runtime.
|
|
8
|
+
*
|
|
9
|
+
* Three modes:
|
|
10
|
+
* - `jwt`: the vendor's session (or a token inside it) is a JWT. Atlas
|
|
11
|
+
* verifies it against the vendor's issuer and keys (JWKS, or an X.509 map
|
|
12
|
+
* like Firebase session cookies use), maps `claims.subject` to the imported
|
|
13
|
+
* user (`external_id` = the source user id), and spends `claims.sessionKey`
|
|
14
|
+
* (`jti` / `sid`, falling back to the whole token) in the single-use ledger.
|
|
15
|
+
* - `session_table`: an opaque token; Atlas looks up sha256(token) among the
|
|
16
|
+
* sessions imported in the migration bundle.
|
|
17
|
+
* - `remote`: the vendor's session can only be checked by asking the vendor
|
|
18
|
+
* with the user's own token (Appwrite, PocketBase): Atlas calls
|
|
19
|
+
* `remote.url` with the token filled into `{token}` and reads the subject
|
|
20
|
+
* (and profile) from the JSON answer by dot path.
|
|
21
|
+
*
|
|
22
|
+
* Templates use `{var}` placeholders filled from the bridge settings'
|
|
23
|
+
* `preset_vars` (e.g. `{domain}`, `{region}`); {@link resolveMigrationBridgePreset}
|
|
24
|
+
* refuses a template with a missing variable.
|
|
25
|
+
*
|
|
26
|
+
* Vendor tracks register their preset (or refine the starter below) with
|
|
27
|
+
* {@link registerMigrationBridgePreset}; a test checks every preset resolves.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.PresetVariableError = void 0;
|
|
31
|
+
exports.registerMigrationBridgePreset = registerMigrationBridgePreset;
|
|
32
|
+
exports.getMigrationBridgePreset = getMigrationBridgePreset;
|
|
33
|
+
exports.listMigrationBridgePresets = listMigrationBridgePresets;
|
|
34
|
+
exports.resolveMigrationBridgePreset = resolveMigrationBridgePreset;
|
|
35
|
+
exports.cookieNameMatches = cookieNameMatches;
|
|
36
|
+
const OIDC_ALGS = ['RS256', 'RS384', 'RS512', 'PS256', 'ES256', 'ES384', 'EdDSA'];
|
|
37
|
+
const presets = new Map();
|
|
38
|
+
function registerMigrationBridgePreset(preset, options = {}) {
|
|
39
|
+
if (!/^[a-z0-9_]+$/.test(preset.id))
|
|
40
|
+
throw new Error(`Invalid bridge preset id "${preset.id}".`);
|
|
41
|
+
if (presets.has(preset.id) && !options.replace)
|
|
42
|
+
throw new Error(`Bridge preset "${preset.id}" is already registered.`);
|
|
43
|
+
if (preset.mode === 'jwt' && !preset.jwt)
|
|
44
|
+
throw new Error(`Bridge preset "${preset.id}" is mode jwt but has no jwt settings.`);
|
|
45
|
+
if (preset.mode === 'remote' && !preset.remote)
|
|
46
|
+
throw new Error(`Bridge preset "${preset.id}" is mode remote but has no remote settings.`);
|
|
47
|
+
presets.set(preset.id, preset);
|
|
48
|
+
}
|
|
49
|
+
function getMigrationBridgePreset(id) {
|
|
50
|
+
return presets.get(id);
|
|
51
|
+
}
|
|
52
|
+
function listMigrationBridgePresets() {
|
|
53
|
+
return [...presets.values()];
|
|
54
|
+
}
|
|
55
|
+
class PresetVariableError extends Error {
|
|
56
|
+
variable;
|
|
57
|
+
constructor(variable, message) {
|
|
58
|
+
super(message);
|
|
59
|
+
this.variable = variable;
|
|
60
|
+
this.name = 'PresetVariableError';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.PresetVariableError = PresetVariableError;
|
|
64
|
+
/** A preset variable must be a plain value: no scheme, path tricks or whitespace sneak into a URL. */
|
|
65
|
+
const VAR_VALUE = /^[A-Za-z0-9._:\-/]{1,253}$/;
|
|
66
|
+
function fill(template, vars) {
|
|
67
|
+
return template.replace(/\{([a-z_]+)\}/g, (match, name) => {
|
|
68
|
+
// `{token}` is the presented session token, filled by the server at call time.
|
|
69
|
+
if (name === 'token')
|
|
70
|
+
return match;
|
|
71
|
+
const v = vars[name];
|
|
72
|
+
if (v === undefined || v === '')
|
|
73
|
+
throw new PresetVariableError(name, `The preset needs "${name}".`);
|
|
74
|
+
return v;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fill a preset's templates. Throws {@link PresetVariableError} for a missing or
|
|
79
|
+
* malformed variable. Values are trimmed; a trailing slash on a URL-ish value
|
|
80
|
+
* is removed (`https://example.com/` → `https://example.com`).
|
|
81
|
+
*/
|
|
82
|
+
function resolveMigrationBridgePreset(id, rawVars = {}) {
|
|
83
|
+
const p = presets.get(id);
|
|
84
|
+
if (!p)
|
|
85
|
+
throw new PresetVariableError('preset', `Unknown bridge preset "${id}".`);
|
|
86
|
+
const vars = { ...(p.defaults ?? {}) };
|
|
87
|
+
for (const [k, v] of Object.entries(rawVars)) {
|
|
88
|
+
if (typeof v !== 'string')
|
|
89
|
+
continue;
|
|
90
|
+
const value = v.trim().replace(/\/+$/, '');
|
|
91
|
+
if (!value)
|
|
92
|
+
continue;
|
|
93
|
+
// Base URLs (`base_url`, `issuer`, `*_url`) keep their https scheme; every
|
|
94
|
+
// other variable is a bare value (a pasted `https://` is dropped, so
|
|
95
|
+
// `https://{domain}/` never doubles it).
|
|
96
|
+
const bare = value.replace(/^https:\/\//, '');
|
|
97
|
+
if (!VAR_VALUE.test(bare) || bare.includes('..') || bare.includes('//'))
|
|
98
|
+
throw new PresetVariableError(k, `"${k}" has characters a ${p.label} value never has.`);
|
|
99
|
+
const keepsScheme = k === 'issuer' || k.endsWith('url');
|
|
100
|
+
if (keepsScheme && !value.startsWith('https://'))
|
|
101
|
+
throw new PresetVariableError(k, `"${k}" must be an https URL.`);
|
|
102
|
+
vars[k] = keepsScheme ? value : bare;
|
|
103
|
+
}
|
|
104
|
+
const jwt = p.jwt;
|
|
105
|
+
return {
|
|
106
|
+
preset: p.id,
|
|
107
|
+
mode: p.mode,
|
|
108
|
+
issuer: jwt ? fill(jwt.issuer, vars) : null,
|
|
109
|
+
keysUrl: jwt?.keysUrl ? fill(jwt.keysUrl, vars) : null,
|
|
110
|
+
keysFormat: jwt?.keysFormat ?? 'jwks',
|
|
111
|
+
audience: jwt?.audience?.length ? jwt.audience.map((a) => fill(a, vars)) : null,
|
|
112
|
+
algorithms: jwt?.algorithms ?? [],
|
|
113
|
+
claims: jwt?.claims ?? { subject: 'sub' },
|
|
114
|
+
expiredGraceSeconds: jwt?.expiredGraceSeconds ?? 0,
|
|
115
|
+
cookies: p.cookies.map((c) => fill(c, vars)),
|
|
116
|
+
tokenFormat: p.tokenFormat ?? 'raw',
|
|
117
|
+
bearer: p.bearer === true,
|
|
118
|
+
clearCookies: (p.clearCookies ?? p.cookies).map((c) => fill(c, vars)),
|
|
119
|
+
sharesAtlasCookie: p.sharesAtlasCookie === true,
|
|
120
|
+
remote: p.remote
|
|
121
|
+
? {
|
|
122
|
+
...p.remote,
|
|
123
|
+
url: fill(p.remote.url, vars),
|
|
124
|
+
...(p.remote.headers ? { headers: Object.fromEntries(Object.entries(p.remote.headers).map(([k, v]) => [k, fill(v, vars)])) } : {}),
|
|
125
|
+
...(p.remote.body !== undefined ? { body: fill(p.remote.body, vars) } : {}),
|
|
126
|
+
}
|
|
127
|
+
: null,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// ── the starter presets ─────────────────────────────────────────────────────
|
|
131
|
+
const OIDC_CLAIMS = { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'jti', mfa: 'amr:mfa' };
|
|
132
|
+
for (const preset of [
|
|
133
|
+
{
|
|
134
|
+
id: 'oidc',
|
|
135
|
+
label: 'Any OpenID Connect provider',
|
|
136
|
+
mode: 'jwt',
|
|
137
|
+
vars: { issuer: 'The issuer URL (keys are found by OIDC discovery)' },
|
|
138
|
+
jwt: { issuer: '{issuer}', algorithms: OIDC_ALGS, claims: OIDC_CLAIMS },
|
|
139
|
+
cookies: [],
|
|
140
|
+
bearer: true,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: 'auth0',
|
|
144
|
+
label: 'Auth0',
|
|
145
|
+
mode: 'jwt',
|
|
146
|
+
vars: {
|
|
147
|
+
domain: 'Your Auth0 domain (tenant.us.auth0.com, or the custom domain your tokens are issued from)',
|
|
148
|
+
client_id: 'The application client id (the ID token audience)',
|
|
149
|
+
},
|
|
150
|
+
defaults: {},
|
|
151
|
+
jwt: {
|
|
152
|
+
issuer: 'https://{domain}/',
|
|
153
|
+
keysUrl: 'https://{domain}/.well-known/jwks.json',
|
|
154
|
+
// The bridge exchanges the ID token from the app session: its audience is the client id.
|
|
155
|
+
audience: ['{client_id}'],
|
|
156
|
+
algorithms: ['RS256', 'PS256'],
|
|
157
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid' },
|
|
158
|
+
// ID tokens live 10 hours by default while the app session rolls for days;
|
|
159
|
+
// nothing renews the ID token once Auth0's SDK stops running.
|
|
160
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
161
|
+
},
|
|
162
|
+
cookies: ['__session', 'appSession'],
|
|
163
|
+
// nextjs-auth0 v4 chunks a large session as __session__0, __session__1; v3 and
|
|
164
|
+
// express-openid-connect as appSession.0, appSession.1.
|
|
165
|
+
clearCookies: ['__session', '__session__*', 'appSession', 'appSession.*', 'auth_verification', '__txn_*'],
|
|
166
|
+
sharesAtlasCookie: true,
|
|
167
|
+
bearer: true,
|
|
168
|
+
notes: 'The nextjs-auth0 / express-openid-connect session cookie is encrypted with your AUTH0_SECRET: use auth0SessionTokenExtractor({ secret }) from @atlasauth/backend as the middleware extractToken so it is opened on your server and its ID token exchanged.',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: 'clerk',
|
|
172
|
+
label: 'Clerk',
|
|
173
|
+
mode: 'jwt',
|
|
174
|
+
vars: { frontend_api: 'Your Clerk Frontend API host (clerk.example.com or xxx.clerk.accounts.dev — the host your publishable key encodes)' },
|
|
175
|
+
jwt: {
|
|
176
|
+
issuer: 'https://{frontend_api}',
|
|
177
|
+
keysUrl: 'https://{frontend_api}/.well-known/jwks.json',
|
|
178
|
+
algorithms: ['RS256'],
|
|
179
|
+
claims: { subject: 'sub', sessionKey: 'sid', email: 'email' },
|
|
180
|
+
// Clerk session tokens live 60 seconds and are refreshed by clerk-js, which no longer runs after the switch.
|
|
181
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
182
|
+
},
|
|
183
|
+
cookies: ['__session'],
|
|
184
|
+
// Clerk also sets suffixed copies (__session_<suffix>, __client_uat_<suffix>) on newer SDKs.
|
|
185
|
+
clearCookies: ['__session', '__session_*', '__client_uat', '__client_uat_*', '__clerk_db_jwt', '__clerk_db_jwt_*', '__refresh_*'],
|
|
186
|
+
sharesAtlasCookie: true,
|
|
187
|
+
bearer: true,
|
|
188
|
+
notes: 'Clerk session tokens are exchanged up to 7 days after they expire (each one once): run the bridge from the day you switch. Clerk\'s __client cookie lives on the Frontend API domain and is never readable by your app.',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: 'cognito',
|
|
192
|
+
label: 'Amazon Cognito',
|
|
193
|
+
mode: 'jwt',
|
|
194
|
+
vars: { region: 'AWS region (us-east-1)', user_pool_id: 'User pool id (us-east-1_AbCdEf)', client_id: 'App client id' },
|
|
195
|
+
jwt: {
|
|
196
|
+
issuer: 'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}',
|
|
197
|
+
keysUrl: 'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/jwks.json',
|
|
198
|
+
audience: ['{client_id}'],
|
|
199
|
+
algorithms: ['RS256'],
|
|
200
|
+
claims: { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'origin_jti' },
|
|
201
|
+
},
|
|
202
|
+
cookies: ['CognitoIdentityServiceProvider.{client_id}.*.idToken'],
|
|
203
|
+
clearCookies: ['CognitoIdentityServiceProvider.{client_id}.*'],
|
|
204
|
+
bearer: true,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'firebase',
|
|
208
|
+
label: 'Firebase Authentication',
|
|
209
|
+
mode: 'jwt',
|
|
210
|
+
vars: { project_id: 'Firebase project id' },
|
|
211
|
+
jwt: {
|
|
212
|
+
issuer: 'https://securetoken.google.com/{project_id}',
|
|
213
|
+
keysUrl: 'https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com',
|
|
214
|
+
audience: ['{project_id}'],
|
|
215
|
+
algorithms: ['RS256'],
|
|
216
|
+
claims: { subject: 'user_id', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'jti' },
|
|
217
|
+
},
|
|
218
|
+
cookies: ['__session'],
|
|
219
|
+
sharesAtlasCookie: true,
|
|
220
|
+
bearer: true,
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'firebase_session_cookie',
|
|
224
|
+
label: 'Firebase session cookies',
|
|
225
|
+
mode: 'jwt',
|
|
226
|
+
vars: { project_id: 'Firebase project id' },
|
|
227
|
+
jwt: {
|
|
228
|
+
issuer: 'https://session.firebase.google.com/{project_id}',
|
|
229
|
+
keysUrl: 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys',
|
|
230
|
+
keysFormat: 'x509',
|
|
231
|
+
audience: ['{project_id}'],
|
|
232
|
+
algorithms: ['RS256'],
|
|
233
|
+
claims: { subject: 'user_id', email: 'email', emailVerified: 'email_verified', name: 'name' },
|
|
234
|
+
},
|
|
235
|
+
cookies: ['__session', 'session'],
|
|
236
|
+
sharesAtlasCookie: true,
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: 'supabase',
|
|
240
|
+
label: 'Supabase Auth',
|
|
241
|
+
mode: 'jwt',
|
|
242
|
+
vars: { project_ref: 'Project ref (the subdomain of <ref>.supabase.co)' },
|
|
243
|
+
jwt: {
|
|
244
|
+
issuer: 'https://{project_ref}.supabase.co/auth/v1',
|
|
245
|
+
keysUrl: 'https://{project_ref}.supabase.co/auth/v1/.well-known/jwks.json',
|
|
246
|
+
audience: ['authenticated'],
|
|
247
|
+
algorithms: ['ES256', 'RS256', 'HS256'],
|
|
248
|
+
claims: { subject: 'sub', email: 'email', sessionKey: 'session_id', mfa: 'claim:aal2' },
|
|
249
|
+
// The access token lives an hour; supabase-js refreshes it, which no longer happens after the switch.
|
|
250
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
251
|
+
allowSharedSecret: true,
|
|
252
|
+
},
|
|
253
|
+
cookies: ['sb-{project_ref}-auth-token'],
|
|
254
|
+
tokenFormat: 'supabase',
|
|
255
|
+
clearCookies: ['sb-{project_ref}-auth-token', 'sb-{project_ref}-auth-token.*'],
|
|
256
|
+
bearer: true,
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'workos',
|
|
260
|
+
label: 'WorkOS AuthKit',
|
|
261
|
+
mode: 'jwt',
|
|
262
|
+
vars: { client_id: 'WorkOS client id (client_…)' },
|
|
263
|
+
// api.workos.com, or your custom authentication domain when the environment has one.
|
|
264
|
+
defaults: { api_host: 'api.workos.com' },
|
|
265
|
+
jwt: {
|
|
266
|
+
issuer: 'https://{api_host}/user_management/{client_id}',
|
|
267
|
+
keysUrl: 'https://{api_host}/sso/jwks/{client_id}',
|
|
268
|
+
algorithms: ['RS256'],
|
|
269
|
+
claims: { subject: 'sub', sessionKey: 'sid' },
|
|
270
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
271
|
+
},
|
|
272
|
+
cookies: ['wos-session'],
|
|
273
|
+
clearCookies: ['wos-session'],
|
|
274
|
+
bearer: true,
|
|
275
|
+
notes: 'The wos-session cookie is sealed with your WORKOS_COOKIE_PASSWORD: pass the middleware workosSessionTokenExtractor({ password }) from @atlasauth/backend, which unseals it on your server and returns the access token. With a custom authentication domain set api_host to it. AuthKit access tokens are short-lived and signed RS256 by WorkOS; the issuer is https://{api_host}/user_management/{client_id}.',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
id: 'okta',
|
|
279
|
+
label: 'Okta',
|
|
280
|
+
mode: 'jwt',
|
|
281
|
+
vars: { domain: 'Your Okta domain (example.okta.com)' },
|
|
282
|
+
defaults: { auth_server: 'default', audience: 'api://default' },
|
|
283
|
+
jwt: {
|
|
284
|
+
// A custom authorization server: org-server access tokens are opaque to anyone but Okta.
|
|
285
|
+
issuer: 'https://{domain}/oauth2/{auth_server}',
|
|
286
|
+
keysUrl: 'https://{domain}/oauth2/{auth_server}/v1/keys',
|
|
287
|
+
audience: ['{audience}'],
|
|
288
|
+
algorithms: ['RS256'],
|
|
289
|
+
// Access tokens carry the login in `sub` and the Okta user id in `uid`.
|
|
290
|
+
claims: { ...OIDC_CLAIMS, subject: 'uid', sessionKey: 'jti' },
|
|
291
|
+
},
|
|
292
|
+
// okta-auth-js keeps tokens in browser storage, not cookies: API calls carry them as bearer tokens.
|
|
293
|
+
cookies: [],
|
|
294
|
+
bearer: true,
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: 'ping_identity',
|
|
298
|
+
label: 'Ping Identity (PingOne)',
|
|
299
|
+
mode: 'jwt',
|
|
300
|
+
vars: { environment_id: 'Your PingOne environment id (a UUID)' },
|
|
301
|
+
defaults: { region: 'com' },
|
|
302
|
+
jwt: {
|
|
303
|
+
issuer: 'https://auth.pingone.{region}/{environment_id}/as',
|
|
304
|
+
keysUrl: 'https://auth.pingone.{region}/{environment_id}/as/jwks',
|
|
305
|
+
algorithms: ['RS256', 'ES256'],
|
|
306
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid' },
|
|
307
|
+
},
|
|
308
|
+
// PingOne sessions live in the SPA (tokens in storage): API calls carry them as bearer tokens.
|
|
309
|
+
cookies: [],
|
|
310
|
+
bearer: true,
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
id: 'onelogin',
|
|
314
|
+
label: 'OneLogin',
|
|
315
|
+
mode: 'jwt',
|
|
316
|
+
vars: { subdomain: 'Your OneLogin subdomain (acme in acme.onelogin.com)' },
|
|
317
|
+
jwt: {
|
|
318
|
+
issuer: 'https://{subdomain}.onelogin.com/oidc/2',
|
|
319
|
+
keysUrl: 'https://{subdomain}.onelogin.com/oidc/2/certs',
|
|
320
|
+
algorithms: ['RS256', 'PS256', 'ES256'],
|
|
321
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'jti' },
|
|
322
|
+
},
|
|
323
|
+
cookies: [],
|
|
324
|
+
bearer: true,
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
id: 'stytch',
|
|
328
|
+
label: 'Stytch',
|
|
329
|
+
mode: 'jwt',
|
|
330
|
+
vars: { project_id: 'Stytch project id (project-live-…)' },
|
|
331
|
+
// api.stytch.com for live projects, test.stytch.com for test ones; jwks_path `b2b/sessions` for Stytch B2B (members), `sessions` for consumer.
|
|
332
|
+
defaults: { api_host: 'api.stytch.com', jwks_path: 'sessions' },
|
|
333
|
+
jwt: {
|
|
334
|
+
issuer: 'stytch.com/{project_id}',
|
|
335
|
+
keysUrl: 'https://{api_host}/v1/{jwks_path}/jwks/{project_id}',
|
|
336
|
+
audience: ['{project_id}'],
|
|
337
|
+
algorithms: ['RS256'],
|
|
338
|
+
// The session id sits inside the `https://stytch.com/session` object claim (dotted path).
|
|
339
|
+
claims: { subject: 'sub', sessionKey: 'https://stytch.com/session.id' },
|
|
340
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
341
|
+
},
|
|
342
|
+
cookies: ['stytch_session_jwt'],
|
|
343
|
+
clearCookies: ['stytch_session_jwt', 'stytch_session'],
|
|
344
|
+
notes: 'Stytch session JWTs last about five minutes and are signed by the project (RS256). Use jwks_path=b2b/sessions for Stytch B2B and api_host=test.stytch.com for a test project. The subject is the Stytch user id (consumer) or member id (B2B).',
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
id: 'keycloak',
|
|
348
|
+
label: 'Keycloak',
|
|
349
|
+
mode: 'jwt',
|
|
350
|
+
vars: { base_url: 'Keycloak base URL (https://sso.example.com)', realm: 'Realm name' },
|
|
351
|
+
jwt: {
|
|
352
|
+
issuer: '{base_url}/realms/{realm}',
|
|
353
|
+
keysUrl: '{base_url}/realms/{realm}/protocol/openid-connect/certs',
|
|
354
|
+
algorithms: ['RS256', 'ES256', 'PS256'],
|
|
355
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid', mfa: 'acr:2' },
|
|
356
|
+
},
|
|
357
|
+
cookies: [],
|
|
358
|
+
bearer: true,
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
id: 'fusionauth',
|
|
362
|
+
label: 'FusionAuth',
|
|
363
|
+
mode: 'jwt',
|
|
364
|
+
vars: { base_url: 'FusionAuth URL (https://auth.example.com)' },
|
|
365
|
+
defaults: {},
|
|
366
|
+
jwt: {
|
|
367
|
+
issuer: '{base_url}',
|
|
368
|
+
keysUrl: '{base_url}/.well-known/jwks.json',
|
|
369
|
+
algorithms: ['RS256', 'ES256'],
|
|
370
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid' },
|
|
371
|
+
},
|
|
372
|
+
cookies: ['app.at'],
|
|
373
|
+
clearCookies: ['app.at', 'app.rt', 'app.idt'],
|
|
374
|
+
bearer: true,
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
id: 'kinde',
|
|
378
|
+
label: 'Kinde',
|
|
379
|
+
mode: 'jwt',
|
|
380
|
+
vars: { domain: 'Your Kinde domain (example.kinde.com, or your custom domain)' },
|
|
381
|
+
jwt: {
|
|
382
|
+
issuer: 'https://{domain}',
|
|
383
|
+
keysUrl: 'https://{domain}/.well-known/jwks',
|
|
384
|
+
algorithms: ['RS256'],
|
|
385
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'jti' },
|
|
386
|
+
// The Kinde SDK refreshes its access token; nothing does after the switch.
|
|
387
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
388
|
+
},
|
|
389
|
+
// The Kinde Next.js SDK keeps the raw tokens in these cookies.
|
|
390
|
+
cookies: ['access_token', 'id_token'],
|
|
391
|
+
clearCookies: ['access_token', 'id_token', 'refresh_token', 'refresh_token_*', 'ac-state-key', 'user', 'post_login_redirect_url'],
|
|
392
|
+
bearer: true,
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
id: 'descope',
|
|
396
|
+
label: 'Descope',
|
|
397
|
+
mode: 'jwt',
|
|
398
|
+
vars: { project_id: 'Descope project id (P…)' },
|
|
399
|
+
defaults: { base_url: 'https://api.descope.com' },
|
|
400
|
+
jwt: {
|
|
401
|
+
// Newer projects issue `https://api.descope.com/<project id>`; older ones the
|
|
402
|
+
// bare project id (preset descope_project_issuer). Decode one DS token to check.
|
|
403
|
+
issuer: '{base_url}/{project_id}',
|
|
404
|
+
keysUrl: '{base_url}/v2/keys/{project_id}',
|
|
405
|
+
algorithms: ['RS256'],
|
|
406
|
+
claims: { subject: 'sub', email: 'email', mfa: 'amr:mfa' },
|
|
407
|
+
// Session tokens live minutes and are renewed from the DSR refresh token by the Descope SDK.
|
|
408
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
409
|
+
},
|
|
410
|
+
cookies: ['DS'],
|
|
411
|
+
clearCookies: ['DS', 'DSR'],
|
|
412
|
+
bearer: true,
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
id: 'descope_project_issuer',
|
|
416
|
+
label: 'Descope (project-id issuer)',
|
|
417
|
+
mode: 'jwt',
|
|
418
|
+
vars: { project_id: 'Descope project id (P…)' },
|
|
419
|
+
defaults: { base_url: 'https://api.descope.com' },
|
|
420
|
+
jwt: {
|
|
421
|
+
issuer: '{project_id}',
|
|
422
|
+
keysUrl: '{base_url}/v2/keys/{project_id}',
|
|
423
|
+
algorithms: ['RS256'],
|
|
424
|
+
claims: { subject: 'sub', email: 'email', mfa: 'amr:mfa' },
|
|
425
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
426
|
+
},
|
|
427
|
+
cookies: ['DS'],
|
|
428
|
+
clearCookies: ['DS', 'DSR'],
|
|
429
|
+
bearer: true,
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
id: 'frontegg',
|
|
433
|
+
label: 'Frontegg',
|
|
434
|
+
mode: 'jwt',
|
|
435
|
+
vars: { base_url: 'Your Frontegg domain (https://app-xxx.frontegg.com)' },
|
|
436
|
+
jwt: { issuer: '{base_url}', keysUrl: '{base_url}/.well-known/jwks.json', algorithms: ['RS256'], claims: { subject: 'sub', email: 'email', sessionKey: 'sid' } },
|
|
437
|
+
cookies: [],
|
|
438
|
+
bearer: true,
|
|
439
|
+
},
|
|
440
|
+
// ── propelauth ──
|
|
441
|
+
{
|
|
442
|
+
id: 'propelauth',
|
|
443
|
+
label: 'PropelAuth',
|
|
444
|
+
mode: 'jwt',
|
|
445
|
+
vars: { auth_url: 'Your PropelAuth auth URL (https://123456.propelauthtest.com or https://auth.example.com)' },
|
|
446
|
+
jwt: { issuer: '{auth_url}', keysUrl: '{auth_url}/.well-known/jwks.json', algorithms: ['RS256'], claims: { subject: 'user_id', email: 'email' }, expiredGraceSeconds: 7 * 24 * 3600 },
|
|
447
|
+
cookies: ['__pa_at'],
|
|
448
|
+
clearCookies: ['__pa_at', '__pa_rt'],
|
|
449
|
+
bearer: true,
|
|
450
|
+
notes: 'PropelAuth signs RS256 tokens (issuer = your auth URL, subject claim user_id) and publishes the verifier key as a PEM (Dashboard → Backend Integration, or PROPELAUTH_VERIFIER_KEY), not as a JWKS. Point the bridge at a JWKS URL that serves that key (jwks_url) before enabling it.',
|
|
451
|
+
},
|
|
452
|
+
// ── magic ──
|
|
453
|
+
{
|
|
454
|
+
id: 'magic',
|
|
455
|
+
label: 'Magic (magic.link)',
|
|
456
|
+
mode: 'jwt',
|
|
457
|
+
vars: { client_id: 'Your Magic client id (did:magic:…), the `aud` of your DID tokens' },
|
|
458
|
+
jwt: {
|
|
459
|
+
// Not an OIDC issuer: each DID token's `iss` is the user's own did:ethr. Kept for the settings' shape.
|
|
460
|
+
issuer: 'did:ethr',
|
|
461
|
+
tokenType: 'magic_did',
|
|
462
|
+
audience: ['{client_id}'],
|
|
463
|
+
algorithms: ['ES256K'],
|
|
464
|
+
claims: { subject: 'iss', sessionKey: 'tid' },
|
|
465
|
+
// DID tokens live 15 minutes by default; the app mints a fresh one whenever it asks Magic.
|
|
466
|
+
expiredGraceSeconds: 24 * 3600,
|
|
467
|
+
},
|
|
468
|
+
cookies: [],
|
|
469
|
+
bearer: true,
|
|
470
|
+
notes: 'Magic DID tokens travel in the Authorization header (from magic.user.getIdToken()), not a cookie, and are not JWTs: pass the middleware magicDidTokenExtractor().',
|
|
471
|
+
},
|
|
472
|
+
// ── userfront ──
|
|
473
|
+
// ── corbado ──
|
|
474
|
+
{
|
|
475
|
+
id: 'corbado',
|
|
476
|
+
label: 'Corbado',
|
|
477
|
+
mode: 'jwt',
|
|
478
|
+
vars: { project_id: 'Your Corbado project id (pro-…)' },
|
|
479
|
+
jwt: {
|
|
480
|
+
issuer: 'https://{project_id}.frontendapi.corbado.io',
|
|
481
|
+
keysUrl: 'https://{project_id}.frontendapi.corbado.io/.well-known/jwks',
|
|
482
|
+
algorithms: ['RS256'],
|
|
483
|
+
claims: { subject: 'sub', email: 'email', name: 'name' },
|
|
484
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
485
|
+
},
|
|
486
|
+
cookies: ['cbo_session_token', 'cbo_short_session'],
|
|
487
|
+
bearer: true,
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
id: 'better_auth',
|
|
491
|
+
label: 'Better Auth',
|
|
492
|
+
mode: 'session_table',
|
|
493
|
+
defaults: { cookie_prefix: 'better-auth' },
|
|
494
|
+
cookies: ['__Secure-{cookie_prefix}.session_token', '{cookie_prefix}.session_token'],
|
|
495
|
+
clearCookies: [
|
|
496
|
+
'__Secure-{cookie_prefix}.session_token',
|
|
497
|
+
'__Secure-{cookie_prefix}.session_data',
|
|
498
|
+
'__Secure-{cookie_prefix}.account_data',
|
|
499
|
+
'__Secure-{cookie_prefix}.dont_remember',
|
|
500
|
+
'{cookie_prefix}.session_token',
|
|
501
|
+
'{cookie_prefix}.session_data',
|
|
502
|
+
'{cookie_prefix}.account_data',
|
|
503
|
+
'{cookie_prefix}.dont_remember',
|
|
504
|
+
],
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
id: 'authjs',
|
|
508
|
+
label: 'Auth.js (database sessions)',
|
|
509
|
+
mode: 'session_table',
|
|
510
|
+
cookies: ['__Secure-authjs.session-token', 'authjs.session-token', '__Secure-next-auth.session-token', 'next-auth.session-token'],
|
|
511
|
+
notes: 'With the JWT session strategy the cookie is encrypted with AUTH_SECRET: pass the middleware a token extractor that decrypts it locally.',
|
|
512
|
+
},
|
|
513
|
+
{ id: 'lucia', label: 'Lucia', mode: 'session_table', defaults: { cookie_name: 'auth_session' }, cookies: ['{cookie_name}'] },
|
|
514
|
+
{ id: 'ory', label: 'Ory (Kratos)', mode: 'session_table', cookies: ['ory_kratos_session', 'ory_session_*'], bearer: true },
|
|
515
|
+
{ id: 'custom', label: 'Your own sessions', mode: 'session_table', vars: { cookie_name: 'The session cookie name' }, cookies: ['{cookie_name}'] },
|
|
516
|
+
]) {
|
|
517
|
+
registerMigrationBridgePreset(preset);
|
|
518
|
+
}
|
|
519
|
+
/** Does a cookie name match a preset pattern (`*` = any run of characters)? */
|
|
520
|
+
function cookieNameMatches(pattern, name) {
|
|
521
|
+
if (!pattern.includes('*'))
|
|
522
|
+
return pattern === name;
|
|
523
|
+
const re = new RegExp(`^${pattern.split('*').map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('.*')}$`);
|
|
524
|
+
return re.test(name);
|
|
525
|
+
}
|
|
526
|
+
// ── vendor-track presets ────────────────────────────────────────────────────
|
|
527
|
+
// Firebase, Supabase, Cognito, Azure AD B2C, Entra External ID, Nhost (replacing the starters).
|
|
528
|
+
const migration_presets_g3_1 = require("./migration-presets-g3");
|
|
529
|
+
for (const preset of migration_presets_g3_1.G3_BRIDGE_PRESETS)
|
|
530
|
+
registerMigrationBridgePreset(preset, { replace: true });
|
|
531
|
+
// ── open-source identity providers ─────────────────────────────────────────
|
|
532
|
+
// Keycloak, Ory, ZITADEL, Logto, SuperTokens, authentik, FusionAuth, Hanko.
|
|
533
|
+
const migration_presets_g4_1 = require("./migration-presets-g4");
|
|
534
|
+
for (const preset of migration_presets_g4_1.G4_BRIDGE_PRESETS)
|
|
535
|
+
registerMigrationBridgePreset(preset, { replace: true });
|
|
536
|
+
//# sourceMappingURL=migration-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-presets.js","sourceRoot":"","sources":["../src/migration-presets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ProtectCondition } from '@atlasauth/authz';
|
|
2
|
+
import type { AtlasBackend, SessionClaims } from './verify';
|
|
3
|
+
/**
|
|
4
|
+
* Framework-neutral request authentication, shared by the Koa, Hapi and GraphQL
|
|
5
|
+
* adapters: read the `__session` cookie or `Authorization: Bearer` header
|
|
6
|
+
* (the header wins), verify locally against the JWKS and return the auth state.
|
|
7
|
+
* It never throws: a missing or bad token is the signed-out state, whose
|
|
8
|
+
* `has()` is `false` and `protect()` throws.
|
|
9
|
+
*/
|
|
10
|
+
export interface RequestAuth {
|
|
11
|
+
userId: string | null;
|
|
12
|
+
sessionId: string | null;
|
|
13
|
+
orgId: string | null;
|
|
14
|
+
orgRole: string | null;
|
|
15
|
+
claims: SessionClaims | null;
|
|
16
|
+
isSignedIn: boolean;
|
|
17
|
+
/** The impersonator (RFC 8693 `act`) or null. */
|
|
18
|
+
actor: {
|
|
19
|
+
sub: string;
|
|
20
|
+
} | null;
|
|
21
|
+
has(condition?: ProtectCondition): boolean;
|
|
22
|
+
/** Assert a condition; returns the claims or throws `ForbiddenError`. */
|
|
23
|
+
protect(condition?: ProtectCondition): SessionClaims;
|
|
24
|
+
}
|
|
25
|
+
export declare function signedOutAuth(): RequestAuth;
|
|
26
|
+
export declare function signedInAuth(claims: SessionClaims): RequestAuth;
|
|
27
|
+
type HeaderValue = string | string[] | undefined;
|
|
28
|
+
/** The raw session token a request carries (bearer header first, then the `__session` cookie), or null. */
|
|
29
|
+
export declare function sessionTokenFromHeaders(headers: Record<string, HeaderValue>): string | null;
|
|
30
|
+
/** Verify a request's headers into a {@link RequestAuth}. Never throws. */
|
|
31
|
+
export declare function authenticateHeaders(backend: AtlasBackend, headers: Record<string, HeaderValue>): Promise<RequestAuth>;
|
|
32
|
+
export {};
|