@atlasauth/backend 0.15.0 → 0.17.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 +27 -0
- package/dist/better-auth.d.ts +157 -0
- package/dist/better-auth.js +245 -0
- package/dist/better-auth.js.map +1 -0
- package/dist/botid.d.ts +70 -0
- package/dist/botid.js +88 -0
- package/dist/botid.js.map +1 -0
- package/dist/client/action-gallery.d.ts +215 -0
- package/dist/client/action-gallery.js +66 -0
- package/dist/client/action-gallery.js.map +1 -0
- package/dist/client/actions.d.ts +21 -0
- package/dist/client/actions.js.map +1 -1
- package/dist/client/attack-protection.d.ts +33 -1
- package/dist/client/attack-protection.js.map +1 -1
- package/dist/client/better-auth-imports.d.ts +205 -0
- package/dist/client/better-auth-imports.js +107 -0
- package/dist/client/better-auth-imports.js.map +1 -0
- package/dist/client/billing-plans.d.ts +93 -0
- package/dist/client/billing-plans.js +31 -0
- package/dist/client/billing-plans.js.map +1 -1
- package/dist/client/custom-oauth-providers.d.ts +243 -0
- package/dist/client/custom-oauth-providers.js +60 -0
- package/dist/client/custom-oauth-providers.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/index.d.ts +154 -0
- package/dist/client/index.js +11 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/instance-security.d.ts +70 -0
- package/dist/client/instance-security.js +20 -0
- package/dist/client/instance-security.js.map +1 -1
- package/dist/client/oauth-clients.d.ts +29 -2
- package/dist/client/oauth-clients.js.map +1 -1
- package/dist/client/resource-servers.d.ts +22 -2
- package/dist/client/resource-servers.js.map +1 -1
- package/dist/client/risk-based-mfa.d.ts +3 -0
- package/dist/client/risk-based-mfa.js.map +1 -1
- package/dist/client/sessions.d.ts +16 -0
- package/dist/client/sessions.js +15 -0
- package/dist/client/sessions.js.map +1 -1
- package/dist/client/sso-connections.d.ts +83 -0
- package/dist/client/sso-connections.js +29 -0
- package/dist/client/sso-connections.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy-issuers.d.ts +65 -0
- package/dist/legacy-issuers.js +140 -0
- package/dist/legacy-issuers.js.map +1 -0
- package/dist/oauth-resource.d.ts +81 -1
- package/dist/oauth-resource.js +204 -29
- package/dist/oauth-resource.js.map +1 -1
- package/dist/verify.d.ts +22 -0
- package/dist/verify.js +32 -0
- package/dist/verify.js.map +1 -1
- package/package.json +3 -3
package/dist/oauth-resource.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ import { type Jwks } from './jwks-cache';
|
|
|
16
16
|
* which is exactly what an MCP client needs to discover how to sign in;
|
|
17
17
|
* - builds the RFC 9728 protected-resource metadata document to serve at
|
|
18
18
|
* `/.well-known/oauth-protected-resource` on your API's host.
|
|
19
|
+
* - accepts OPAQUE access tokens too (an API, client or instance set to the
|
|
20
|
+
* `opaque` format): with `introspection` configured, a token that is not a
|
|
21
|
+
* JWT is validated at Atlas's introspection endpoint (RFC 7662) with your
|
|
22
|
+
* API's own client credentials, and the answer is cached briefly;
|
|
19
23
|
* Framework-agnostic: hand it any request with `method`, `url` and `headers`.
|
|
20
24
|
*/
|
|
21
25
|
/** Clock skew tolerated on `exp`/`nbf` and on DPoP proof `iat`. */
|
|
@@ -52,6 +56,37 @@ export interface DpopReplayStore {
|
|
|
52
56
|
/** Record `jti` until `expiresAt` (ms); return false when it was already seen. */
|
|
53
57
|
claim(jti: string, expiresAt: number): Promise<boolean> | boolean;
|
|
54
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Server-provided DPoP nonces (RFC 9449 §8). `current()` is the nonce the API
|
|
61
|
+
* hands out in the `DPoP-Nonce` response header; `valid()` accepts the nonces
|
|
62
|
+
* still in force. A verifier given a source requires every DPoP proof to carry
|
|
63
|
+
* one, answering `use_dpop_nonce` (with a fresh nonce) otherwise.
|
|
64
|
+
*/
|
|
65
|
+
export interface DpopNonceSource {
|
|
66
|
+
current(): string | Promise<string>;
|
|
67
|
+
valid(nonce: string): boolean | Promise<boolean>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* An in-process nonce source: a random nonce per window; the current and the
|
|
71
|
+
* previous window's nonce are accepted. Use it when one process serves the API
|
|
72
|
+
* (or with sticky routing); behind several processes, use
|
|
73
|
+
* {@link hmacDpopNonceSource} with a shared secret.
|
|
74
|
+
*/
|
|
75
|
+
export declare function memoryDpopNonceSource(options?: {
|
|
76
|
+
windowSeconds?: number;
|
|
77
|
+
now?: () => number;
|
|
78
|
+
}): DpopNonceSource;
|
|
79
|
+
/**
|
|
80
|
+
* A stateless nonce source shared by every process holding the same secret (at
|
|
81
|
+
* least 32 bytes): the nonce for a window is base64url(HMAC-SHA256(secret,
|
|
82
|
+
* "atlas-dpop-nonce:" ‖ uint64-BE(window number))). A nonce is good in the window
|
|
83
|
+
* it was issued in and the next one. The derivation is the same in every Atlas
|
|
84
|
+
* server SDK, so services in different languages sharing the secret agree.
|
|
85
|
+
*/
|
|
86
|
+
export declare function hmacDpopNonceSource(secret: string | Uint8Array, options?: {
|
|
87
|
+
windowSeconds?: number;
|
|
88
|
+
now?: () => number;
|
|
89
|
+
}): DpopNonceSource;
|
|
55
90
|
export declare function memoryDpopReplayStore(max?: number): DpopReplayStore;
|
|
56
91
|
export interface AccessTokenVerifierOptions {
|
|
57
92
|
/** Your Atlas instance's issuer (frontend API origin), e.g. https://clerk.example.com. */
|
|
@@ -79,12 +114,53 @@ export interface AccessTokenVerifierOptions {
|
|
|
79
114
|
/** The public origin of this API, for DPoP `htu` when `request.url` is a path. */
|
|
80
115
|
publicOrigin?: string;
|
|
81
116
|
dpopReplayStore?: DpopReplayStore;
|
|
117
|
+
/**
|
|
118
|
+
* Require a server-provided nonce in every DPoP proof (RFC 9449 §8). A proof
|
|
119
|
+
* without a valid one is refused with `use_dpop_nonce`; every result carries
|
|
120
|
+
* `dpopNonce`, to send as the `DPoP-Nonce` response header (the framework
|
|
121
|
+
* adapters do). See {@link memoryDpopNonceSource} / {@link hmacDpopNonceSource}.
|
|
122
|
+
*/
|
|
123
|
+
dpopNonces?: DpopNonceSource;
|
|
82
124
|
/** `WWW-Authenticate` realm. */
|
|
83
125
|
realm?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Validate opaque access tokens (and, with `introspectJwts`, JWTs too) at
|
|
128
|
+
* Atlas's introspection endpoint. The client must be a confidential client
|
|
129
|
+
* your API lists in its `introspection_client_ids` (or the client the tokens
|
|
130
|
+
* are issued to).
|
|
131
|
+
*/
|
|
132
|
+
introspection?: IntrospectionOptions;
|
|
84
133
|
fetchImpl?: typeof fetch;
|
|
85
134
|
now?: () => number;
|
|
86
135
|
}
|
|
87
|
-
export
|
|
136
|
+
export interface IntrospectionOptions {
|
|
137
|
+
clientId: string;
|
|
138
|
+
clientSecret: string;
|
|
139
|
+
/** Default `${issuer}/oauth2/introspect`. */
|
|
140
|
+
endpoint?: string;
|
|
141
|
+
/** How long an active answer is reused, in seconds (default 60; never past the token's `exp`). */
|
|
142
|
+
cacheTtlSeconds?: number;
|
|
143
|
+
/** How long an inactive answer is reused, in seconds (default 10; 0 disables). */
|
|
144
|
+
negativeCacheTtlSeconds?: number;
|
|
145
|
+
/** Most answers kept (default 10 000). */
|
|
146
|
+
cacheMax?: number;
|
|
147
|
+
/**
|
|
148
|
+
* Also introspect JWT access tokens, so a revoked grant or a banned user is
|
|
149
|
+
* refused before the token expires (one cached call per token). Default false:
|
|
150
|
+
* JWTs are verified locally.
|
|
151
|
+
*/
|
|
152
|
+
introspectJwts?: boolean;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* RFC 7662 introspection with a small TTL cache keyed by the token's SHA-256
|
|
156
|
+
* (the token itself is never kept). Returns the claims of an active token, or
|
|
157
|
+
* null for an inactive one; throws when Atlas could not be reached.
|
|
158
|
+
*/
|
|
159
|
+
export declare function createIntrospector(issuer: string, options: IntrospectionOptions, deps?: {
|
|
160
|
+
fetchImpl?: typeof fetch;
|
|
161
|
+
now?: () => number;
|
|
162
|
+
}): (token: string) => Promise<AccessTokenClaims | null>;
|
|
163
|
+
export type AccessTokenErrorCode = 'invalid_request' | 'invalid_token' | 'insufficient_scope' | 'invalid_dpop_proof' | 'use_dpop_nonce';
|
|
88
164
|
export type AccessTokenResult = {
|
|
89
165
|
ok: true;
|
|
90
166
|
claims: AccessTokenClaims;
|
|
@@ -92,6 +168,8 @@ export type AccessTokenResult = {
|
|
|
92
168
|
subject: string;
|
|
93
169
|
clientId: string | null;
|
|
94
170
|
dpopBound: boolean;
|
|
171
|
+
/** With `dpopNonces`: send as the `DPoP-Nonce` response header. */
|
|
172
|
+
dpopNonce?: string;
|
|
95
173
|
} | {
|
|
96
174
|
ok: false;
|
|
97
175
|
status: 400 | 401 | 403;
|
|
@@ -99,6 +177,8 @@ export type AccessTokenResult = {
|
|
|
99
177
|
description: string;
|
|
100
178
|
/** Set this response header verbatim. */
|
|
101
179
|
wwwAuthenticate: string;
|
|
180
|
+
/** With `dpopNonces`: send as the `DPoP-Nonce` response header (always, on `use_dpop_nonce`). */
|
|
181
|
+
dpopNonce?: string;
|
|
102
182
|
};
|
|
103
183
|
/**
|
|
104
184
|
* Build an RFC 6750 / RFC 9449 / RFC 9728 `WWW-Authenticate` challenge.
|
package/dist/oauth-resource.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DPOP_PROOF_MAX_AGE_SECONDS = exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS = void 0;
|
|
4
|
+
exports.memoryDpopNonceSource = memoryDpopNonceSource;
|
|
5
|
+
exports.hmacDpopNonceSource = hmacDpopNonceSource;
|
|
4
6
|
exports.memoryDpopReplayStore = memoryDpopReplayStore;
|
|
7
|
+
exports.createIntrospector = createIntrospector;
|
|
5
8
|
exports.buildWwwAuthenticate = buildWwwAuthenticate;
|
|
6
9
|
exports.createAccessTokenVerifier = createAccessTokenVerifier;
|
|
7
10
|
exports.verifyAccessToken = verifyAccessToken;
|
|
@@ -27,6 +30,10 @@ const algs_1 = require("./algs");
|
|
|
27
30
|
* which is exactly what an MCP client needs to discover how to sign in;
|
|
28
31
|
* - builds the RFC 9728 protected-resource metadata document to serve at
|
|
29
32
|
* `/.well-known/oauth-protected-resource` on your API's host.
|
|
33
|
+
* - accepts OPAQUE access tokens too (an API, client or instance set to the
|
|
34
|
+
* `opaque` format): with `introspection` configured, a token that is not a
|
|
35
|
+
* JWT is validated at Atlas's introspection endpoint (RFC 7662) with your
|
|
36
|
+
* API's own client credentials, and the answer is cached briefly;
|
|
30
37
|
* Framework-agnostic: hand it any request with `method`, `url` and `headers`.
|
|
31
38
|
*/
|
|
32
39
|
/** Clock skew tolerated on `exp`/`nbf` and on DPoP proof `iat`. */
|
|
@@ -34,6 +41,86 @@ exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS = 5;
|
|
|
34
41
|
/** How old a DPoP proof may be. */
|
|
35
42
|
exports.DPOP_PROOF_MAX_AGE_SECONDS = 300;
|
|
36
43
|
const DPOP_ALGS = ['ES256', 'ES384', 'ES512', 'RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'EdDSA'];
|
|
44
|
+
const DEFAULT_NONCE_WINDOW_SECONDS = 300;
|
|
45
|
+
/**
|
|
46
|
+
* An in-process nonce source: a random nonce per window; the current and the
|
|
47
|
+
* previous window's nonce are accepted. Use it when one process serves the API
|
|
48
|
+
* (or with sticky routing); behind several processes, use
|
|
49
|
+
* {@link hmacDpopNonceSource} with a shared secret.
|
|
50
|
+
*/
|
|
51
|
+
function memoryDpopNonceSource(options = {}) {
|
|
52
|
+
const window = (options.windowSeconds ?? DEFAULT_NONCE_WINDOW_SECONDS) * 1000;
|
|
53
|
+
const now = options.now ?? Date.now;
|
|
54
|
+
const issued = new Map();
|
|
55
|
+
const random = () => {
|
|
56
|
+
const bytes = crypto.getRandomValues(new Uint8Array(32));
|
|
57
|
+
let bin = '';
|
|
58
|
+
for (const b of bytes)
|
|
59
|
+
bin += String.fromCharCode(b);
|
|
60
|
+
return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
61
|
+
};
|
|
62
|
+
const at = (epoch) => {
|
|
63
|
+
let n = issued.get(epoch);
|
|
64
|
+
if (!n) {
|
|
65
|
+
n = random();
|
|
66
|
+
issued.set(epoch, n);
|
|
67
|
+
for (const e of issued.keys())
|
|
68
|
+
if (e < epoch - 1)
|
|
69
|
+
issued.delete(e);
|
|
70
|
+
}
|
|
71
|
+
return n;
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
current: () => at(Math.floor(now() / window)),
|
|
75
|
+
valid: (nonce) => {
|
|
76
|
+
const epoch = Math.floor(now() / window);
|
|
77
|
+
return nonce === at(epoch) || nonce === issued.get(epoch - 1);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A stateless nonce source shared by every process holding the same secret (at
|
|
83
|
+
* least 32 bytes): the nonce for a window is base64url(HMAC-SHA256(secret,
|
|
84
|
+
* "atlas-dpop-nonce:" ‖ uint64-BE(window number))). A nonce is good in the window
|
|
85
|
+
* it was issued in and the next one. The derivation is the same in every Atlas
|
|
86
|
+
* server SDK, so services in different languages sharing the secret agree.
|
|
87
|
+
*/
|
|
88
|
+
function hmacDpopNonceSource(secret, options = {}) {
|
|
89
|
+
const key = typeof secret === 'string' ? new TextEncoder().encode(secret) : secret;
|
|
90
|
+
if (key.length < 32)
|
|
91
|
+
throw new Error('The DPoP nonce secret must be at least 32 bytes.');
|
|
92
|
+
const window = (options.windowSeconds ?? DEFAULT_NONCE_WINDOW_SECONDS) * 1000;
|
|
93
|
+
const now = options.now ?? Date.now;
|
|
94
|
+
const imported = crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
95
|
+
const at = async (epoch) => {
|
|
96
|
+
const prefix = new TextEncoder().encode('atlas-dpop-nonce:');
|
|
97
|
+
const msg = new Uint8Array(prefix.length + 8);
|
|
98
|
+
msg.set(prefix);
|
|
99
|
+
new DataView(msg.buffer).setBigUint64(prefix.length, BigInt(epoch));
|
|
100
|
+
const mac = new Uint8Array(await crypto.subtle.sign('HMAC', await imported, msg));
|
|
101
|
+
let bin = '';
|
|
102
|
+
for (const b of mac)
|
|
103
|
+
bin += String.fromCharCode(b);
|
|
104
|
+
return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
105
|
+
};
|
|
106
|
+
const epoch = () => Math.floor(now() / window);
|
|
107
|
+
return {
|
|
108
|
+
current: () => at(epoch()),
|
|
109
|
+
valid: async (nonce) => {
|
|
110
|
+
const e = epoch();
|
|
111
|
+
const [a, b] = await Promise.all([at(e), at(e - 1)]);
|
|
112
|
+
return constantTimeEqual(nonce, a) || constantTimeEqual(nonce, b);
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function constantTimeEqual(a, b) {
|
|
117
|
+
if (a.length !== b.length)
|
|
118
|
+
return false;
|
|
119
|
+
let diff = 0;
|
|
120
|
+
for (let i = 0; i < a.length; i++)
|
|
121
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
122
|
+
return diff === 0;
|
|
123
|
+
}
|
|
37
124
|
function memoryDpopReplayStore(max = 10_000) {
|
|
38
125
|
const seen = new Map();
|
|
39
126
|
return {
|
|
@@ -53,6 +140,56 @@ function memoryDpopReplayStore(max = 10_000) {
|
|
|
53
140
|
},
|
|
54
141
|
};
|
|
55
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* RFC 7662 introspection with a small TTL cache keyed by the token's SHA-256
|
|
145
|
+
* (the token itself is never kept). Returns the claims of an active token, or
|
|
146
|
+
* null for an inactive one; throws when Atlas could not be reached.
|
|
147
|
+
*/
|
|
148
|
+
function createIntrospector(issuer, options, deps = {}) {
|
|
149
|
+
const endpoint = options.endpoint ?? `${issuer.replace(/\/+$/, '')}/oauth2/introspect`;
|
|
150
|
+
const now = deps.now ?? Date.now;
|
|
151
|
+
const doFetch = deps.fetchImpl ?? fetch;
|
|
152
|
+
const ttl = (options.cacheTtlSeconds ?? 60) * 1000;
|
|
153
|
+
const negativeTtl = (options.negativeCacheTtlSeconds ?? 10) * 1000;
|
|
154
|
+
const max = options.cacheMax ?? 10_000;
|
|
155
|
+
const cache = new Map();
|
|
156
|
+
const basic = `Basic ${btoa(`${encodeURIComponent(options.clientId)}:${encodeURIComponent(options.clientSecret)}`)}`;
|
|
157
|
+
return async (token) => {
|
|
158
|
+
const key = await sha256b64u(token);
|
|
159
|
+
const hit = cache.get(key);
|
|
160
|
+
if (hit && hit.until > now())
|
|
161
|
+
return hit.claims;
|
|
162
|
+
if (hit)
|
|
163
|
+
cache.delete(key);
|
|
164
|
+
const res = await doFetch(endpoint, {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: {
|
|
167
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
168
|
+
accept: 'application/json',
|
|
169
|
+
authorization: basic,
|
|
170
|
+
},
|
|
171
|
+
body: new URLSearchParams({ token, token_type_hint: 'access_token' }).toString(),
|
|
172
|
+
});
|
|
173
|
+
if (!res.ok)
|
|
174
|
+
throw new Error(`Introspection failed with HTTP ${res.status}.`);
|
|
175
|
+
const body = (await res.json());
|
|
176
|
+
const claims = body.active === true && body.token_use !== 'refresh_token' ? body : null;
|
|
177
|
+
const until = claims
|
|
178
|
+
? Math.min(now() + ttl, typeof claims.exp === 'number' ? claims.exp * 1000 : now() + ttl)
|
|
179
|
+
: now() + negativeTtl;
|
|
180
|
+
if (until > now()) {
|
|
181
|
+
cache.set(key, { claims, until });
|
|
182
|
+
if (cache.size > max) {
|
|
183
|
+
for (const [k, v] of cache)
|
|
184
|
+
if (v.until <= now())
|
|
185
|
+
cache.delete(k);
|
|
186
|
+
while (cache.size > max)
|
|
187
|
+
cache.delete(cache.keys().next().value);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return claims;
|
|
191
|
+
};
|
|
192
|
+
}
|
|
56
193
|
function header(req, name) {
|
|
57
194
|
const h = req.headers;
|
|
58
195
|
if (typeof h.get === 'function')
|
|
@@ -118,9 +255,13 @@ function createAccessTokenVerifier(options) {
|
|
|
118
255
|
});
|
|
119
256
|
const audiences = options.audience === false ? null : typeof options.audience === 'string' ? [options.audience] : [...options.audience];
|
|
120
257
|
const replay = options.dpopReplayStore ?? memoryDpopReplayStore();
|
|
258
|
+
const introspect = options.introspection
|
|
259
|
+
? createIntrospector(issuer, options.introspection, { fetchImpl: options.fetchImpl, now: options.now })
|
|
260
|
+
: null;
|
|
121
261
|
return async (request, extra) => {
|
|
122
262
|
const required = [...(options.requiredScopes ?? []), ...(extra?.requiredScopes ?? [])];
|
|
123
263
|
const scheme = options.requireDpop ? 'DPoP' : 'Bearer';
|
|
264
|
+
const nonce = options.dpopNonces ? await options.dpopNonces.current() : undefined;
|
|
124
265
|
const fail = (status, error, description, challengeScheme = scheme) => ({
|
|
125
266
|
ok: false,
|
|
126
267
|
status,
|
|
@@ -135,6 +276,7 @@ function createAccessTokenVerifier(options) {
|
|
|
135
276
|
resourceMetadataUrl: options.resourceMetadataUrl,
|
|
136
277
|
dpopAlgs: DPOP_ALGS,
|
|
137
278
|
}),
|
|
279
|
+
...(nonce ? { dpopNonce: nonce } : {}),
|
|
138
280
|
});
|
|
139
281
|
const authz = header(request, 'authorization');
|
|
140
282
|
if (!authz)
|
|
@@ -144,23 +286,47 @@ function createAccessTokenVerifier(options) {
|
|
|
144
286
|
return fail(400, 'invalid_request', 'Malformed Authorization header.');
|
|
145
287
|
const presentedScheme = m[1].toLowerCase() === 'dpop' ? 'DPoP' : 'Bearer';
|
|
146
288
|
const token = m[2];
|
|
147
|
-
|
|
148
|
-
return fail(401, 'invalid_token', 'The access token is malformed.');
|
|
149
|
-
const keys = await jwks.get((0, jwks_cache_1.readKid)(token));
|
|
150
|
-
if (!keys || keys.keys.length === 0)
|
|
151
|
-
return fail(401, 'invalid_token', 'No signing keys are available to verify the token.');
|
|
289
|
+
const isJwt = token.split('.').length === 3;
|
|
152
290
|
let claims;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
291
|
+
if (!isJwt || (introspect && options.introspection?.introspectJwts)) {
|
|
292
|
+
// An opaque token (or a JWT the caller wants checked live) is validated by
|
|
293
|
+
// Atlas itself.
|
|
294
|
+
if (!introspect) {
|
|
295
|
+
return fail(401, 'invalid_token', 'The access token is not a JWT; configure `introspection` to accept opaque tokens.');
|
|
296
|
+
}
|
|
297
|
+
let active;
|
|
298
|
+
try {
|
|
299
|
+
active = await introspect(token);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return fail(401, 'invalid_token', 'The access token could not be validated right now.');
|
|
303
|
+
}
|
|
304
|
+
if (!active)
|
|
305
|
+
return fail(401, 'invalid_token', 'The access token is invalid or expired.');
|
|
306
|
+
if (active.iss !== undefined && String(active.iss).replace(/\/+$/, '') !== issuer) {
|
|
307
|
+
return fail(401, 'invalid_token', 'The access token was issued by another authorization server.');
|
|
308
|
+
}
|
|
309
|
+
if (typeof active.exp === 'number' && active.exp * 1000 + exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS * 1000 <= now()) {
|
|
310
|
+
return fail(401, 'invalid_token', 'The access token is invalid or expired.');
|
|
311
|
+
}
|
|
312
|
+
claims = active;
|
|
161
313
|
}
|
|
162
|
-
|
|
163
|
-
|
|
314
|
+
else {
|
|
315
|
+
const keys = await jwks.get((0, jwks_cache_1.readKid)(token));
|
|
316
|
+
if (!keys || keys.keys.length === 0)
|
|
317
|
+
return fail(401, 'invalid_token', 'No signing keys are available to verify the token.');
|
|
318
|
+
try {
|
|
319
|
+
const { payload } = await (0, jose_1.jwtVerify)(token, (0, jose_1.createLocalJWKSet)(keys), {
|
|
320
|
+
issuer,
|
|
321
|
+
algorithms: algs_1.ATLAS_SIGNING_ALGS,
|
|
322
|
+
clockTolerance: exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS,
|
|
323
|
+
currentDate: new Date(now()),
|
|
324
|
+
});
|
|
325
|
+
claims = payload;
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
return fail(401, 'invalid_token', 'The access token is invalid or expired.');
|
|
329
|
+
}
|
|
164
330
|
}
|
|
165
331
|
if (claims.token_use !== undefined && claims.token_use !== 'access_token') {
|
|
166
332
|
return fail(401, 'invalid_token', 'The token is not an access token.');
|
|
@@ -190,9 +356,10 @@ function createAccessTokenVerifier(options) {
|
|
|
190
356
|
publicOrigin: options.publicOrigin,
|
|
191
357
|
now: now(),
|
|
192
358
|
replay,
|
|
359
|
+
nonces: options.dpopNonces,
|
|
193
360
|
});
|
|
194
361
|
if (proofError)
|
|
195
|
-
return fail(401,
|
|
362
|
+
return fail(401, proofError.code, proofError.message, 'DPoP');
|
|
196
363
|
}
|
|
197
364
|
const scopes = (claims.scope ?? '').split(' ').filter(Boolean);
|
|
198
365
|
const granted = new Set([...scopes, ...(claims.permissions ?? [])]);
|
|
@@ -207,27 +374,29 @@ function createAccessTokenVerifier(options) {
|
|
|
207
374
|
subject: claims.sub,
|
|
208
375
|
clientId: (claims.client_id ?? claims.azp ?? null),
|
|
209
376
|
dpopBound: !!jkt,
|
|
377
|
+
...(nonce ? { dpopNonce: nonce } : {}),
|
|
210
378
|
};
|
|
211
379
|
};
|
|
212
380
|
}
|
|
213
381
|
async function checkDpopProof(proof, ctx) {
|
|
382
|
+
const refuse = (message) => ({ code: 'invalid_dpop_proof', message });
|
|
214
383
|
let jwk;
|
|
215
384
|
let alg;
|
|
216
385
|
try {
|
|
217
386
|
const h = (0, jose_1.decodeProtectedHeader)(proof);
|
|
218
387
|
if (h.typ !== 'dpop+jwt')
|
|
219
|
-
return 'The DPoP proof must have typ dpop+jwt.';
|
|
388
|
+
return refuse('The DPoP proof must have typ dpop+jwt.');
|
|
220
389
|
if (!h.alg || !DPOP_ALGS.includes(h.alg))
|
|
221
|
-
return 'The DPoP proof uses an unsupported algorithm.';
|
|
390
|
+
return refuse('The DPoP proof uses an unsupported algorithm.');
|
|
222
391
|
if (!h.jwk || typeof h.jwk !== 'object')
|
|
223
|
-
return 'The DPoP proof must carry its public key.';
|
|
392
|
+
return refuse('The DPoP proof must carry its public key.');
|
|
224
393
|
jwk = h.jwk;
|
|
225
394
|
if ('d' in jwk || 'k' in jwk)
|
|
226
|
-
return 'The DPoP proof key must be a public key.';
|
|
395
|
+
return refuse('The DPoP proof key must be a public key.');
|
|
227
396
|
alg = h.alg;
|
|
228
397
|
}
|
|
229
398
|
catch {
|
|
230
|
-
return 'The DPoP proof is malformed.';
|
|
399
|
+
return refuse('The DPoP proof is malformed.');
|
|
231
400
|
}
|
|
232
401
|
let payload;
|
|
233
402
|
try {
|
|
@@ -235,30 +404,36 @@ async function checkDpopProof(proof, ctx) {
|
|
|
235
404
|
({ payload } = await (0, jose_1.jwtVerify)(proof, key, { algorithms: [alg], typ: 'dpop+jwt', currentDate: new Date(ctx.now) }));
|
|
236
405
|
}
|
|
237
406
|
catch {
|
|
238
|
-
return 'The DPoP proof signature is invalid.';
|
|
407
|
+
return refuse('The DPoP proof signature is invalid.');
|
|
239
408
|
}
|
|
240
409
|
if ((await (0, jose_1.calculateJwkThumbprint)(jwk, 'sha256')) !== ctx.jkt) {
|
|
241
|
-
return 'The DPoP proof key does not match the token binding.';
|
|
410
|
+
return refuse('The DPoP proof key does not match the token binding.');
|
|
242
411
|
}
|
|
243
412
|
if (payload.htm !== ctx.method)
|
|
244
|
-
return 'The DPoP proof htm does not match the request method.';
|
|
413
|
+
return refuse('The DPoP proof htm does not match the request method.');
|
|
245
414
|
const absolute = /^https?:\/\//i.test(ctx.url) ? ctx.url : ctx.publicOrigin ? new URL(ctx.url, ctx.publicOrigin).toString() : null;
|
|
246
415
|
const expected = absolute ? htuOf(absolute) : null;
|
|
247
416
|
if (!expected || typeof payload.htu !== 'string' || htuOf(payload.htu) !== expected) {
|
|
248
|
-
return 'The DPoP proof htu does not match the request URL.';
|
|
417
|
+
return refuse('The DPoP proof htu does not match the request URL.');
|
|
249
418
|
}
|
|
250
419
|
const iat = typeof payload.iat === 'number' ? payload.iat * 1000 : NaN;
|
|
251
420
|
if (!Number.isFinite(iat) ||
|
|
252
421
|
iat > ctx.now + exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS * 1000 ||
|
|
253
422
|
ctx.now - iat > exports.DPOP_PROOF_MAX_AGE_SECONDS * 1000) {
|
|
254
|
-
return 'The DPoP proof is too old or from the future.';
|
|
423
|
+
return refuse('The DPoP proof is too old or from the future.');
|
|
255
424
|
}
|
|
256
425
|
if (payload.ath !== (await sha256b64u(ctx.token)))
|
|
257
|
-
return 'The DPoP proof ath does not match the access token.';
|
|
426
|
+
return refuse('The DPoP proof ath does not match the access token.');
|
|
258
427
|
if (typeof payload.jti !== 'string' || !payload.jti)
|
|
259
|
-
return 'The DPoP proof needs a jti.';
|
|
428
|
+
return refuse('The DPoP proof needs a jti.');
|
|
429
|
+
if (ctx.nonces) {
|
|
430
|
+
const nonce = typeof payload.nonce === 'string' ? payload.nonce : '';
|
|
431
|
+
if (!nonce || !(await ctx.nonces.valid(nonce))) {
|
|
432
|
+
return { code: 'use_dpop_nonce', message: 'The DPoP proof must carry the nonce from the DPoP-Nonce header.' };
|
|
433
|
+
}
|
|
434
|
+
}
|
|
260
435
|
if (!(await ctx.replay.claim(`${ctx.jkt}:${payload.jti}`, iat + exports.DPOP_PROOF_MAX_AGE_SECONDS * 1000))) {
|
|
261
|
-
return 'The DPoP proof has already been used.';
|
|
436
|
+
return refuse('The DPoP proof has already been used.');
|
|
262
437
|
}
|
|
263
438
|
return null;
|
|
264
439
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-resource.js","sourceRoot":"","sources":["../src/oauth-resource.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oauth-resource.js","sourceRoot":"","sources":["../src/oauth-resource.ts"],"names":[],"mappings":"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"}
|
package/dist/verify.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface AtlasBackendOidc {
|
|
|
17
17
|
clearCookie: typeof oidcClearCookie;
|
|
18
18
|
}
|
|
19
19
|
export { type AuthzClaims, type ProtectCondition, type ProtectOutcome, type ProtectReason, evaluate, hasFromClaims, protectFromClaims, ForbiddenError, isRoleKey, isPermissionKey, } from '@atlasauth/authz';
|
|
20
|
+
import { type LegacyIssuer } from './legacy-issuers';
|
|
20
21
|
/**
|
|
21
22
|
* §7.3 verification by customer backends.
|
|
22
23
|
*
|
|
@@ -89,6 +90,16 @@ export interface SessionClaims {
|
|
|
89
90
|
* `email` under the same opt-in, and only when the user carries one.
|
|
90
91
|
*/
|
|
91
92
|
external_id?: string;
|
|
93
|
+
/**
|
|
94
|
+
* Present ONLY on a token accepted through `legacyIssuers` (a cutover from
|
|
95
|
+
* another provider): which issuer minted it and the subject it carried there.
|
|
96
|
+
* `sub` is already the Atlas user id.
|
|
97
|
+
*/
|
|
98
|
+
legacy?: {
|
|
99
|
+
kind: string;
|
|
100
|
+
issuer: string;
|
|
101
|
+
sub: string;
|
|
102
|
+
};
|
|
92
103
|
[claim: string]: unknown;
|
|
93
104
|
}
|
|
94
105
|
/**
|
|
@@ -175,10 +186,21 @@ export interface AtlasBackendOptions {
|
|
|
175
186
|
bapiBaseUrl?: string;
|
|
176
187
|
fetchImpl?: typeof fetch;
|
|
177
188
|
now?: () => number;
|
|
189
|
+
/**
|
|
190
|
+
* Cutover from another auth provider (Better Auth): ALSO accept JWTs from
|
|
191
|
+
* these issuers until each one's `until`, verified against that issuer's own
|
|
192
|
+
* key set, with `sub` mapped to the Atlas user id (the old id is the user's
|
|
193
|
+
* `external_id`; mapped through the Backend API unless the issuer has a
|
|
194
|
+
* `resolveSubject`). The verified claims carry `sub` = the Atlas user id,
|
|
195
|
+
* `external_id` = the old id and `legacy` = `{ kind, issuer, sub }`, so code
|
|
196
|
+
* that needs to tell the two apart can. Atlas tokens are unaffected.
|
|
197
|
+
*/
|
|
198
|
+
legacyIssuers?: readonly LegacyIssuer[];
|
|
178
199
|
}
|
|
179
200
|
export declare class AtlasBackend {
|
|
180
201
|
private readonly options;
|
|
181
202
|
private readonly jwks;
|
|
203
|
+
private readonly legacy?;
|
|
182
204
|
/**
|
|
183
205
|
* The server-side OIDC relying party (hosted-redirect sign-in) for this
|
|
184
206
|
* instance: `start`, `callback`, `logoutUrl`, `verifyIdToken`. `issuer`,
|
package/dist/verify.js
CHANGED
|
@@ -24,6 +24,7 @@ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: functi
|
|
|
24
24
|
Object.defineProperty(exports, "isRoleKey", { enumerable: true, get: function () { return authz_2.isRoleKey; } });
|
|
25
25
|
Object.defineProperty(exports, "isPermissionKey", { enumerable: true, get: function () { return authz_2.isPermissionKey; } });
|
|
26
26
|
const algs_1 = require("./algs");
|
|
27
|
+
const legacy_issuers_1 = require("./legacy-issuers");
|
|
27
28
|
/**
|
|
28
29
|
* §7.3 verification by customer backends.
|
|
29
30
|
*
|
|
@@ -64,6 +65,7 @@ function authorized(claims) {
|
|
|
64
65
|
class AtlasBackend {
|
|
65
66
|
options;
|
|
66
67
|
jwks;
|
|
68
|
+
legacy;
|
|
67
69
|
/**
|
|
68
70
|
* The server-side OIDC relying party (hosted-redirect sign-in) for this
|
|
69
71
|
* instance: `start`, `callback`, `logoutUrl`, `verifyIdToken`. `issuer`,
|
|
@@ -110,6 +112,19 @@ class AtlasBackend {
|
|
|
110
112
|
verifyIdToken: (token, o) => (0, oidc_1.oidcVerifyIdToken)(token, bind(o)),
|
|
111
113
|
clearCookie: oidc_1.oidcClearCookie,
|
|
112
114
|
};
|
|
115
|
+
if (options.legacyIssuers && options.legacyIssuers.length > 0) {
|
|
116
|
+
if (options.legacyIssuers.some((l) => l.issuer === options.issuer)) {
|
|
117
|
+
throw new Error('AtlasBackend: a legacy issuer cannot be the Atlas `issuer` itself.');
|
|
118
|
+
}
|
|
119
|
+
this.legacy = new legacy_issuers_1.LegacyIssuerVerifier({
|
|
120
|
+
issuers: options.legacyIssuers,
|
|
121
|
+
secretKey: options.secretKey,
|
|
122
|
+
bapiBaseUrl: options.bapiBaseUrl,
|
|
123
|
+
fetchImpl: options.fetchImpl,
|
|
124
|
+
now: options.now,
|
|
125
|
+
clockToleranceSeconds: exports.CLOCK_SKEW_SECONDS,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
113
128
|
this.jwks = new jwks_cache_1.JwksCache({
|
|
114
129
|
url: hasUrl ? options.jwksUrl : undefined,
|
|
115
130
|
staticJwks: options.jwks,
|
|
@@ -137,6 +152,23 @@ class AtlasBackend {
|
|
|
137
152
|
async verify(token) {
|
|
138
153
|
if (!token || token.split('.').length !== 3)
|
|
139
154
|
return { ok: false, reason: 'malformed' };
|
|
155
|
+
// A token from a configured legacy issuer (within its window) is verified
|
|
156
|
+
// against THAT issuer's keys only — never the Atlas keys, and an Atlas
|
|
157
|
+
// token never reaches the legacy path (the `iss` routes, the signature decides).
|
|
158
|
+
if (this.legacy) {
|
|
159
|
+
const entry = this.legacy.match((0, legacy_issuers_1.peekIssuer)(token));
|
|
160
|
+
if (entry) {
|
|
161
|
+
const outcome = await this.legacy.verify(token, entry);
|
|
162
|
+
if (!outcome.ok)
|
|
163
|
+
return { ok: false, reason: outcome.reason };
|
|
164
|
+
const claims = outcome.claims;
|
|
165
|
+
if (this.options.authorizedParties?.length && claims.azp !== undefined) {
|
|
166
|
+
if (!this.options.authorizedParties.includes(claims.azp))
|
|
167
|
+
return { ok: false, reason: 'unauthorized_party' };
|
|
168
|
+
}
|
|
169
|
+
return authorized(claims);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
140
172
|
const keys = await this.jwks.get((0, jwks_cache_1.readKid)(token));
|
|
141
173
|
if (!keys || keys.keys.length === 0) {
|
|
142
174
|
return this.jwks.lastError
|