@atlasauth/backend 0.34.0 → 0.36.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 +21 -0
- package/README.md +65 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/instance.d.ts +17 -0
- package/dist/client/instance.js.map +1 -1
- package/dist/client/organizations.d.ts +6 -0
- package/dist/client/organizations.js +8 -0
- package/dist/client/organizations.js.map +1 -1
- package/dist/client/sso-onboarding.d.ts +6 -0
- package/dist/client/sso-onboarding.js +8 -0
- package/dist/client/sso-onboarding.js.map +1 -1
- package/dist/csrf.d.ts +50 -0
- package/dist/csrf.js +124 -0
- package/dist/csrf.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/recent-auth.d.ts +17 -0
- package/dist/recent-auth.js +16 -0
- package/dist/recent-auth.js.map +1 -1
- package/dist/rp-sid-store.d.ts +36 -0
- package/dist/rp-sid-store.js +58 -0
- package/dist/rp-sid-store.js.map +1 -0
- package/dist/rp-testing.d.ts +38 -0
- package/dist/rp-testing.js +153 -0
- package/dist/rp-testing.js.map +1 -0
- package/dist/rp.d.ts +60 -4
- package/dist/rp.js +100 -9
- package/dist/rp.js.map +1 -1
- package/dist/sync-local-user.d.ts +59 -0
- package/dist/sync-local-user.js +82 -0
- package/dist/sync-local-user.js.map +1 -0
- package/dist/verify.d.ts +19 -0
- package/dist/verify.js.map +1 -1
- package/dist/webhook-events.d.ts +24 -0
- package/dist/webhook-events.generated.d.ts +1234 -0
- package/dist/webhook-events.generated.js +190 -0
- package/dist/webhook-events.generated.js.map +1 -0
- package/dist/webhook-events.js +29 -0
- package/dist/webhook-events.js.map +1 -0
- package/dist/webhooks-web.d.ts +3 -2
- package/dist/webhooks-web.js.map +1 -1
- package/dist/webhooks.d.ts +2 -1
- package/dist/webhooks.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memorySidStore = memorySidStore;
|
|
4
|
+
exports.sqlSidStore = sqlSidStore;
|
|
5
|
+
const ms = (at) => (at instanceof Date ? at.getTime() : at);
|
|
6
|
+
/** An in-process {@link SidStore}. Fine for one server; use a shared store (e.g. {@link sqlSidStore}) for several. */
|
|
7
|
+
function memorySidStore(now = Date.now) {
|
|
8
|
+
const bySid = new Map();
|
|
9
|
+
const sweep = (t) => {
|
|
10
|
+
for (const [sid, apps] of bySid) {
|
|
11
|
+
for (const [id, exp] of apps)
|
|
12
|
+
if (exp <= t)
|
|
13
|
+
apps.delete(id);
|
|
14
|
+
if (apps.size === 0)
|
|
15
|
+
bySid.delete(sid);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
bind(sid, appSessionId, expiresAt) {
|
|
20
|
+
sweep(now());
|
|
21
|
+
let apps = bySid.get(sid);
|
|
22
|
+
if (!apps)
|
|
23
|
+
bySid.set(sid, (apps = new Map()));
|
|
24
|
+
apps.set(appSessionId, ms(expiresAt));
|
|
25
|
+
},
|
|
26
|
+
take(sid) {
|
|
27
|
+
sweep(now());
|
|
28
|
+
const apps = bySid.get(sid);
|
|
29
|
+
bySid.delete(sid);
|
|
30
|
+
return apps ? [...apps.keys()] : [];
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A {@link SidStore} on PostgreSQL. Create the table once:
|
|
36
|
+
*
|
|
37
|
+
* create table atlas_rp_sessions (
|
|
38
|
+
* sid text not null,
|
|
39
|
+
* app_session_id text not null,
|
|
40
|
+
* expires_at timestamptz not null,
|
|
41
|
+
* primary key (sid, app_session_id)
|
|
42
|
+
* );
|
|
43
|
+
*
|
|
44
|
+
* `take` deletes every row for the sid (expired ones too) and returns the unexpired ids.
|
|
45
|
+
*/
|
|
46
|
+
function sqlSidStore({ query }) {
|
|
47
|
+
return {
|
|
48
|
+
async bind(sid, appSessionId, expiresAt) {
|
|
49
|
+
await query('insert into atlas_rp_sessions (sid, app_session_id, expires_at) values ($1, $2, $3) ' +
|
|
50
|
+
'on conflict (sid, app_session_id) do update set expires_at = excluded.expires_at', [sid, appSessionId, new Date(ms(expiresAt))]);
|
|
51
|
+
},
|
|
52
|
+
async take(sid) {
|
|
53
|
+
const { rows } = await query('delete from atlas_rp_sessions where sid = $1 returning app_session_id, expires_at > now() as live', [sid]);
|
|
54
|
+
return rows.filter((r) => r.live).map((r) => String(r.app_session_id));
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=rp-sid-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rp-sid-store.js","sourceRoot":"","sources":["../src/rp-sid-store.ts"],"names":[],"mappings":";;AAmBA,wCAsBC;AAmBD,kCAiBC;AA7DD,MAAM,EAAE,GAAG,CAAC,EAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE3E,sHAAsH;AACtH,SAAgB,cAAc,CAAC,MAAoB,IAAI,CAAC,GAAG;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI;gBAAE,IAAI,GAAG,IAAI,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS;YAC/B,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACb,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,GAAG;YACN,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAOD;;;;;;;;;;;GAWG;AACH,SAAgB,WAAW,CAAC,EAAE,KAAK,EAAsB;IACvD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS;YACrC,MAAM,KAAK,CACT,sFAAsF;gBACpF,kFAAkF,EACpF,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAC7C,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAC1B,mGAAmG,EACnG,CAAC,GAAG,CAAC,CACN,CAAC;YACF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACzE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface MockIssuerOptions {
|
|
2
|
+
/** The issuer URL (`https://...`), e.g. `https://atlasauth.net` for Sign in with Atlas. */
|
|
3
|
+
issuer: string;
|
|
4
|
+
clientId: string;
|
|
5
|
+
/** Signing algorithm. Default `RS256`. */
|
|
6
|
+
alg?: 'RS256' | 'ES256';
|
|
7
|
+
/** A clock in epoch milliseconds, for `iat` / `exp`. */
|
|
8
|
+
now?: () => number;
|
|
9
|
+
}
|
|
10
|
+
export interface MockIssuer {
|
|
11
|
+
issuer: string;
|
|
12
|
+
clientId: string;
|
|
13
|
+
/** A `fetch` serving discovery, the JWKS, the token endpoint and `/oauth2/session/touch` / `/end`; 404 otherwise. Pass it as `fetchImpl`. */
|
|
14
|
+
fetch: typeof fetch;
|
|
15
|
+
/** The public key set. */
|
|
16
|
+
jwks: {
|
|
17
|
+
keys: Record<string, unknown>[];
|
|
18
|
+
};
|
|
19
|
+
/** The discovery document `fetch` serves. */
|
|
20
|
+
discovery: Record<string, unknown>;
|
|
21
|
+
/** Claims merged into the ID token of the next code redeemed at the token endpoint (then cleared). */
|
|
22
|
+
nextClaims: Record<string, unknown>;
|
|
23
|
+
/**
|
|
24
|
+
* Play the user signing in: pass the authorize URL `rp.start` redirected to,
|
|
25
|
+
* get the callback URL (`code`, `state`, `iss`) to request with the sign-in cookie.
|
|
26
|
+
*/
|
|
27
|
+
authorize(authorizeUrl: string): string;
|
|
28
|
+
/** A signed ID token: `iss`, `aud`, `sub`, `iat`, `exp`, `auth_time`, `sid`, `email`, `email_verified`, then `claims`. Its `sid` becomes live for touch/end. */
|
|
29
|
+
idToken(claims?: Record<string, unknown>): Promise<string>;
|
|
30
|
+
/** A signed back-channel logout token for `sid` (and `sub`), as Atlas POSTs it. */
|
|
31
|
+
logoutToken(options: {
|
|
32
|
+
sid: string;
|
|
33
|
+
sub?: string;
|
|
34
|
+
}): Promise<string>;
|
|
35
|
+
/** The sids `/oauth2/session/touch` and `/end` treat as live sign-ins. */
|
|
36
|
+
liveSids: Set<string>;
|
|
37
|
+
}
|
|
38
|
+
export declare function mockIssuer(options: MockIssuerOptions): Promise<MockIssuer>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockIssuer = mockIssuer;
|
|
4
|
+
/**
|
|
5
|
+
* `@atlasauth/rp/testing`: an offline issuer for testing an app built on
|
|
6
|
+
* `createRelyingParty`, with no network and no Atlas account.
|
|
7
|
+
*
|
|
8
|
+
* const issuer = await mockIssuer({ issuer: 'https://atlasauth.net', clientId: 'client_test' });
|
|
9
|
+
* const rp = createRelyingParty({ ...settings, issuer: issuer.issuer, clientId: issuer.clientId, fetchImpl: issuer.fetch });
|
|
10
|
+
* const started = await rp.start(new Request('https://app.test/auth/sign-in'));
|
|
11
|
+
* const callbackUrl = issuer.authorize(started.headers.get('location')!); // the user signs in
|
|
12
|
+
*
|
|
13
|
+
* Web standards and `jose` only, like the relying party itself.
|
|
14
|
+
*/
|
|
15
|
+
const jose_1 = require("jose");
|
|
16
|
+
const logout_token_1 = require("./logout-token");
|
|
17
|
+
async function mockIssuer(options) {
|
|
18
|
+
const issuer = options.issuer.replace(/\/+$/, '');
|
|
19
|
+
const { clientId } = options;
|
|
20
|
+
const alg = options.alg ?? 'RS256';
|
|
21
|
+
const clock = options.now ?? Date.now;
|
|
22
|
+
const kid = 'mock-key-1';
|
|
23
|
+
const { privateKey, publicKey } = await (0, jose_1.generateKeyPair)(alg);
|
|
24
|
+
const jwks = { keys: [{ ...(await (0, jose_1.exportJWK)(publicKey)), kid, alg, use: 'sig' }] };
|
|
25
|
+
const discovery = {
|
|
26
|
+
issuer,
|
|
27
|
+
authorization_endpoint: `${issuer}/oauth2/authorize`,
|
|
28
|
+
token_endpoint: `${issuer}/oauth2/token`,
|
|
29
|
+
jwks_uri: `${issuer}/.well-known/jwks.json`,
|
|
30
|
+
end_session_endpoint: `${issuer}/oauth2/logout`,
|
|
31
|
+
response_types_supported: ['code'],
|
|
32
|
+
subject_types_supported: ['public'],
|
|
33
|
+
id_token_signing_alg_values_supported: [alg],
|
|
34
|
+
code_challenge_methods_supported: ['S256'],
|
|
35
|
+
token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post'],
|
|
36
|
+
};
|
|
37
|
+
const liveSids = new Set();
|
|
38
|
+
const codes = new Map();
|
|
39
|
+
const sign = (payload, typ) => new jose_1.SignJWT(payload).setProtectedHeader({ alg, kid, typ }).sign(privateKey);
|
|
40
|
+
const mock = {
|
|
41
|
+
issuer,
|
|
42
|
+
clientId,
|
|
43
|
+
jwks,
|
|
44
|
+
discovery,
|
|
45
|
+
nextClaims: {},
|
|
46
|
+
liveSids,
|
|
47
|
+
fetch: undefined,
|
|
48
|
+
authorize(authorizeUrl) {
|
|
49
|
+
const p = new URL(authorizeUrl).searchParams;
|
|
50
|
+
const redirectUri = p.get('redirect_uri');
|
|
51
|
+
if (!redirectUri)
|
|
52
|
+
throw new Error('mockIssuer.authorize: the authorize URL has no redirect_uri.');
|
|
53
|
+
if (p.get('client_id') !== clientId)
|
|
54
|
+
throw new Error(`mockIssuer.authorize: client_id ${p.get('client_id')} is not ${clientId}.`);
|
|
55
|
+
const code = `code_${randomId()}`;
|
|
56
|
+
codes.set(code, { redirectUri, nonce: p.get('nonce'), challenge: p.get('code_challenge') });
|
|
57
|
+
const back = new URL(redirectUri);
|
|
58
|
+
back.searchParams.set('code', code);
|
|
59
|
+
if (p.get('state') !== null)
|
|
60
|
+
back.searchParams.set('state', p.get('state'));
|
|
61
|
+
back.searchParams.set('iss', issuer);
|
|
62
|
+
return back.toString();
|
|
63
|
+
},
|
|
64
|
+
async idToken(claims = {}) {
|
|
65
|
+
const iat = Math.floor(clock() / 1000);
|
|
66
|
+
const payload = {
|
|
67
|
+
iss: issuer,
|
|
68
|
+
aud: clientId,
|
|
69
|
+
sub: 'user_test',
|
|
70
|
+
iat,
|
|
71
|
+
exp: iat + 3600,
|
|
72
|
+
auth_time: iat,
|
|
73
|
+
sid: 'sid_test',
|
|
74
|
+
email: 'user@example.com',
|
|
75
|
+
email_verified: true,
|
|
76
|
+
...claims,
|
|
77
|
+
};
|
|
78
|
+
if (typeof payload.sid === 'string')
|
|
79
|
+
liveSids.add(payload.sid);
|
|
80
|
+
return sign(payload, 'JWT');
|
|
81
|
+
},
|
|
82
|
+
async logoutToken({ sid, sub }) {
|
|
83
|
+
const iat = Math.floor(clock() / 1000);
|
|
84
|
+
return sign({ iss: issuer, aud: clientId, iat, exp: iat + 120, jti: randomId(), sid, ...(sub ? { sub } : {}), events: { [logout_token_1.BACKCHANNEL_LOGOUT_EVENT]: {} } }, 'logout+jwt');
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const json = (status, body) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json', 'cache-control': 'no-store' } });
|
|
88
|
+
async function token(form) {
|
|
89
|
+
if (form.get('grant_type') !== 'authorization_code')
|
|
90
|
+
return json(400, { error: 'unsupported_grant_type' });
|
|
91
|
+
const code = form.get('code') ?? '';
|
|
92
|
+
const pending = codes.get(code);
|
|
93
|
+
codes.delete(code); // single use
|
|
94
|
+
if (!pending || pending.redirectUri !== form.get('redirect_uri'))
|
|
95
|
+
return json(400, { error: 'invalid_grant' });
|
|
96
|
+
if (pending.challenge && (await s256(form.get('code_verifier') ?? '')) !== pending.challenge) {
|
|
97
|
+
return json(400, { error: 'invalid_grant', error_description: 'PKCE verification failed' });
|
|
98
|
+
}
|
|
99
|
+
const claims = mock.nextClaims;
|
|
100
|
+
mock.nextClaims = {};
|
|
101
|
+
const idToken = await mock.idToken({ ...(pending.nonce ? { nonce: pending.nonce } : {}), ...claims });
|
|
102
|
+
return json(200, { access_token: `at_${randomId()}`, token_type: 'Bearer', expires_in: 3600, id_token: idToken });
|
|
103
|
+
}
|
|
104
|
+
function session(action, form) {
|
|
105
|
+
const sid = form.get('sid')?.trim() ?? '';
|
|
106
|
+
if (!sid)
|
|
107
|
+
return json(400, { error: 'invalid_request', error_description: 'Missing sid.' });
|
|
108
|
+
if (!liveSids.has(sid))
|
|
109
|
+
return json(404, { error: 'session_not_found', error_description: 'No live sign-in of this app has that sid.' });
|
|
110
|
+
if (action === 'touch') {
|
|
111
|
+
return json(200, { object: 'oauth_session', sid, active: true, grants_touched: 0, idle_expires_at: clock() + 30 * 86_400_000, expires_at: null });
|
|
112
|
+
}
|
|
113
|
+
liveSids.delete(sid);
|
|
114
|
+
return json(200, { object: 'oauth_session', sid, active: false, ended: true, grants_revoked: 0, backchannel_logouts: 1 });
|
|
115
|
+
}
|
|
116
|
+
mock.fetch = (async (input, init) => {
|
|
117
|
+
const request = new Request(input, init);
|
|
118
|
+
const url = new URL(request.url);
|
|
119
|
+
const target = `${url.origin}${url.pathname}`;
|
|
120
|
+
if (request.method === 'GET' && target === `${issuer}/.well-known/openid-configuration`)
|
|
121
|
+
return json(200, discovery);
|
|
122
|
+
if (request.method === 'GET' && target === discovery.jwks_uri)
|
|
123
|
+
return json(200, jwks);
|
|
124
|
+
if (request.method === 'POST' && target.startsWith(`${issuer}/oauth2/`)) {
|
|
125
|
+
const form = new URLSearchParams(await request.text());
|
|
126
|
+
// Confidential clients only, like the token endpoint: Basic or client_secret in the body.
|
|
127
|
+
const basic = request.headers.get('authorization')?.startsWith('Basic ');
|
|
128
|
+
const id = basic ? decodeURIComponent(atob(request.headers.get('authorization').slice(6)).split(':')[0]) : form.get('client_id');
|
|
129
|
+
if (id !== clientId || (!basic && !form.get('client_secret')))
|
|
130
|
+
return json(401, { error: 'invalid_client' });
|
|
131
|
+
const path = target.slice(issuer.length);
|
|
132
|
+
if (path === '/oauth2/token')
|
|
133
|
+
return token(form);
|
|
134
|
+
if (path === '/oauth2/session/touch')
|
|
135
|
+
return session('touch', form);
|
|
136
|
+
if (path === '/oauth2/session/end')
|
|
137
|
+
return session('end', form);
|
|
138
|
+
}
|
|
139
|
+
return json(404, { error: 'not_found' });
|
|
140
|
+
});
|
|
141
|
+
return mock;
|
|
142
|
+
}
|
|
143
|
+
function randomId() {
|
|
144
|
+
return Array.from(crypto.getRandomValues(new Uint8Array(16)), (b) => b.toString(16).padStart(2, '0')).join('');
|
|
145
|
+
}
|
|
146
|
+
async function s256(value) {
|
|
147
|
+
const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value)));
|
|
148
|
+
let bin = '';
|
|
149
|
+
for (const b of digest)
|
|
150
|
+
bin += String.fromCharCode(b);
|
|
151
|
+
return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=rp-testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rp-testing.js","sourceRoot":"","sources":["../src/rp-testing.ts"],"names":[],"mappings":"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"}
|
package/dist/rp.d.ts
CHANGED
|
@@ -29,9 +29,16 @@
|
|
|
29
29
|
* the Atlas session calls a relying party that keeps its own session needs:
|
|
30
30
|
* keep-alive (`POST /v1/sessions/{id}/touch`) and server-side sign-out
|
|
31
31
|
* (`POST /v1/sessions/{id}/revoke`, or with `serverSignOut` the one-call
|
|
32
|
-
* `POST /v1/oauth_clients/{id}/logout`).
|
|
32
|
+
* `POST /v1/oauth_clients/{id}/logout`). An app with no instance secret key
|
|
33
|
+
* (Sign in with Atlas: issuer `https://atlasauth.net`) keeps its own sign-in
|
|
34
|
+
* alive and ends it with its client credentials instead
|
|
35
|
+
* (`POST {issuer}/oauth2/session/touch` and `/oauth2/session/end`).
|
|
33
36
|
*/
|
|
34
37
|
import { AtlasOidcError, type OidcClientAuth, type OidcIdentity, type OidcStartOptions } from './oidc';
|
|
38
|
+
import type { LogoutTokenClaims } from './logout-token';
|
|
39
|
+
import type { SidStore } from './rp-sid-store';
|
|
40
|
+
export { memorySidStore, sqlSidStore } from './rp-sid-store';
|
|
41
|
+
export type { SidStore, SqlSidStoreOptions } from './rp-sid-store';
|
|
35
42
|
export { AtlasOidcError, isSafeReturnTo, oidcCallback, oidcLogoutUrl, oidcStart, oidcVerifyIdToken, resetOidcCaches } from './oidc';
|
|
36
43
|
export type { OidcIdentity, OidcStartOptions, OidcCallbackOptions, AtlasOidcErrorCode } from './oidc';
|
|
37
44
|
export { AtlasApiError } from './client/error';
|
|
@@ -49,7 +56,10 @@ export interface RelyingPartyConfig {
|
|
|
49
56
|
issuer: string;
|
|
50
57
|
/** The OAuth client id. */
|
|
51
58
|
clientId: string;
|
|
52
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* The client secret (a confidential client). Without a `secretKey`, it also
|
|
61
|
+
* authenticates `touchIfDue` and `endAppSession` (the app's own sign-in).
|
|
62
|
+
*/
|
|
53
63
|
clientSecret?: string;
|
|
54
64
|
/** Token-endpoint authentication. Default `client_secret_basic` with a secret. */
|
|
55
65
|
clientAuth?: OidcClientAuth;
|
|
@@ -63,7 +73,11 @@ export interface RelyingPartyConfig {
|
|
|
63
73
|
afterSignInPath?: string;
|
|
64
74
|
/** Where Atlas sends the browser after sign-out. Must be registered on the client exactly. */
|
|
65
75
|
postLogoutRedirectUri?: string;
|
|
66
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* The instance secret key (`sk_...`, scope `sessions:write`). Used by
|
|
78
|
+
* `touchIfDue` and needed for server-side revoke. A Sign in with Atlas app has
|
|
79
|
+
* none: leave it unset and `touchIfDue` uses the client credentials.
|
|
80
|
+
*/
|
|
67
81
|
secretKey?: string;
|
|
68
82
|
/** The Backend API origin. Default `https://api.atlasauth.net`. */
|
|
69
83
|
apiUrl?: string;
|
|
@@ -98,7 +112,20 @@ export interface RelyingPartyConfig {
|
|
|
98
112
|
signIn?: string;
|
|
99
113
|
callback?: string;
|
|
100
114
|
signOut?: string;
|
|
115
|
+
backchannelLogout?: string;
|
|
101
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* Where you record which of your app sessions each Atlas `sid` backs (see
|
|
119
|
+
* {@link RelyingParty.bindSession}), so a back-channel logout can end them.
|
|
120
|
+
*/
|
|
121
|
+
sidStore?: SidStore;
|
|
122
|
+
/**
|
|
123
|
+
* Called by {@link RelyingParty.backchannelLogout} with the app sessions to
|
|
124
|
+
* end: those bound to the token's `sid` in `sidStore` (taken out of it), or
|
|
125
|
+
* `[]` when there is no store, no binding or no `sid` (then end by
|
|
126
|
+
* `claims.sub`). Throwing answers 503 and keeps the bindings, so Atlas retries.
|
|
127
|
+
*/
|
|
128
|
+
onBackchannelLogout?: (appSessionIds: string[], claims: LogoutTokenClaims) => Promise<void> | void;
|
|
102
129
|
/**
|
|
103
130
|
* Called by {@link RelyingParty.handle} after a verified sign-in: create your
|
|
104
131
|
* own session here. Return a `Response` to answer with it, or nothing to
|
|
@@ -220,6 +247,10 @@ export interface RelyingParty {
|
|
|
220
247
|
* Keep the Atlas session alive while the user is active in your app, at
|
|
221
248
|
* most once per `touchIntervalMs` per session. Call it on each authenticated
|
|
222
249
|
* request with the `sid` and the time you last touched (0 or null at first).
|
|
250
|
+
* With a `secretKey` it touches the Atlas session (`/v1/sessions/{id}/touch`);
|
|
251
|
+
* without one but with a `clientSecret` it touches this app's own sign-in
|
|
252
|
+
* (`POST {issuer}/oauth2/session/touch`), where a sid with no live sign-in of
|
|
253
|
+
* this app is `{ status: 'ended', reason: 'not_found' }`. Neither: a TypeError.
|
|
223
254
|
*/
|
|
224
255
|
touchIfDue(sid: string, lastTouchedAt: number | null | undefined): Promise<TouchResult>;
|
|
225
256
|
/**
|
|
@@ -229,6 +260,30 @@ export interface RelyingParty {
|
|
|
229
260
|
* session (check you use the same instance's secret key). Other failures throw.
|
|
230
261
|
*/
|
|
231
262
|
revokeSession(sid: string): Promise<'revoked' | 'not_found'>;
|
|
263
|
+
/**
|
|
264
|
+
* End THIS app's sign-in under `sid` with the app's client credentials
|
|
265
|
+
* (`POST {issuer}/oauth2/session/end`): its refresh grants are revoked and
|
|
266
|
+
* Atlas sends the app a back-channel logout, so every server of yours hears
|
|
267
|
+
* it. The Atlas session and other apps are untouched. `not_found`: no live
|
|
268
|
+
* sign-in of this app has that sid. Needs `clientSecret`; other failures throw.
|
|
269
|
+
*/
|
|
270
|
+
endAppSession(sid: string): Promise<'ended' | 'not_found'>;
|
|
271
|
+
/**
|
|
272
|
+
* Record that your app session `appSessionId` is backed by the Atlas `sid`
|
|
273
|
+
* (the user's `sid` from the callback), until `expiresAt` (epoch ms or Date).
|
|
274
|
+
* Call it when you create your app session, after MFA if you gate on it. A
|
|
275
|
+
* step-up callback carries the same `sid`: bind again only if you rotate
|
|
276
|
+
* your session id then. Needs `sidStore`.
|
|
277
|
+
*/
|
|
278
|
+
bindSession(sid: string, appSessionId: string, expiresAt: number | Date): Promise<void>;
|
|
279
|
+
/**
|
|
280
|
+
* The back-channel logout receiver: verifies the `logout_token` (issuer and
|
|
281
|
+
* client id from the config), takes the app sessions bound to its `sid` from
|
|
282
|
+
* `sidStore` and passes them to `onBackchannelLogout`. Answers 200 when
|
|
283
|
+
* handled (or a replay), 400 for a bad token, 503 (with `Retry-After`) when
|
|
284
|
+
* the keys could not be loaded or `onBackchannelLogout` threw.
|
|
285
|
+
*/
|
|
286
|
+
backchannelLogout(request: Request): Promise<Response>;
|
|
232
287
|
/**
|
|
233
288
|
* Sign-out: with a `sid` and a `secretKey`, revokes the Atlas session
|
|
234
289
|
* server-side first, then 302s the browser to `/oauth2/logout`. With
|
|
@@ -240,7 +295,8 @@ export interface RelyingParty {
|
|
|
240
295
|
/**
|
|
241
296
|
* All three routes in one handler: `GET` on the sign-in path runs `start`,
|
|
242
297
|
* `GET` on the callback path runs `callback` then `onSignedIn`, and `POST`
|
|
243
|
-
* or `GET` on the sign-out path runs `onSignOut` then `signOut
|
|
298
|
+
* or `GET` on the sign-out path runs `onSignOut` then `signOut`, and with
|
|
299
|
+
* `routes.backchannelLogout` set, `POST` there runs `backchannelLogout`. Any other
|
|
244
300
|
* request gets `null`, so your app answers it. Needs `onSignedIn`.
|
|
245
301
|
*
|
|
246
302
|
* export default { fetch: async (req) => (await rp.handle(req)) ?? app(req) };
|
package/dist/rp.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CONFIRM_NOW_WINDOW_SECONDS = exports.usedMultiFactor = exports.authenticatedWithin = exports.verifyAtlasWebhookRequest = exports.verifyAtlasWebhook = exports.ATLAS_WEBHOOK_HEADERS = exports.handleBackchannelLogout = exports.fetchBackchannelLogout = exports.fastifyBackchannelLogoutPlugin = exports.fastifyBackchannelLogout = exports.expressBackchannelLogout = exports.verifyLogoutToken = exports.memoryLogoutReplayStore = exports.LogoutTokenVerifier = exports.BACKCHANNEL_LOGOUT_EVENT = exports.AtlasApiError = exports.resetOidcCaches = exports.oidcVerifyIdToken = exports.oidcStart = exports.oidcLogoutUrl = exports.oidcCallback = exports.isSafeReturnTo = exports.AtlasOidcError = void 0;
|
|
3
|
+
exports.CONFIRM_NOW_WINDOW_SECONDS = exports.usedMultiFactor = exports.authenticatedWithin = exports.verifyAtlasWebhookRequest = exports.verifyAtlasWebhook = exports.ATLAS_WEBHOOK_HEADERS = exports.handleBackchannelLogout = exports.fetchBackchannelLogout = exports.fastifyBackchannelLogoutPlugin = exports.fastifyBackchannelLogout = exports.expressBackchannelLogout = exports.verifyLogoutToken = exports.memoryLogoutReplayStore = exports.LogoutTokenVerifier = exports.BACKCHANNEL_LOGOUT_EVENT = exports.AtlasApiError = exports.resetOidcCaches = exports.oidcVerifyIdToken = exports.oidcStart = exports.oidcLogoutUrl = exports.oidcCallback = exports.isSafeReturnTo = exports.AtlasOidcError = exports.sqlSidStore = exports.memorySidStore = void 0;
|
|
4
4
|
exports.createRelyingParty = createRelyingParty;
|
|
5
5
|
/**
|
|
6
6
|
* `@atlasauth/backend/rp` (also published alone as `@atlasauth/rp`, whose
|
|
@@ -33,11 +33,18 @@ exports.createRelyingParty = createRelyingParty;
|
|
|
33
33
|
* the Atlas session calls a relying party that keeps its own session needs:
|
|
34
34
|
* keep-alive (`POST /v1/sessions/{id}/touch`) and server-side sign-out
|
|
35
35
|
* (`POST /v1/sessions/{id}/revoke`, or with `serverSignOut` the one-call
|
|
36
|
-
* `POST /v1/oauth_clients/{id}/logout`).
|
|
36
|
+
* `POST /v1/oauth_clients/{id}/logout`). An app with no instance secret key
|
|
37
|
+
* (Sign in with Atlas: issuer `https://atlasauth.net`) keeps its own sign-in
|
|
38
|
+
* alive and ends it with its client credentials instead
|
|
39
|
+
* (`POST {issuer}/oauth2/session/touch` and `/oauth2/session/end`).
|
|
37
40
|
*/
|
|
38
41
|
const oidc_1 = require("./oidc");
|
|
39
42
|
const error_1 = require("./client/error");
|
|
40
43
|
const request_1 = require("./client/request");
|
|
44
|
+
const backchannel_handlers_1 = require("./backchannel-handlers");
|
|
45
|
+
var rp_sid_store_1 = require("./rp-sid-store");
|
|
46
|
+
Object.defineProperty(exports, "memorySidStore", { enumerable: true, get: function () { return rp_sid_store_1.memorySidStore; } });
|
|
47
|
+
Object.defineProperty(exports, "sqlSidStore", { enumerable: true, get: function () { return rp_sid_store_1.sqlSidStore; } });
|
|
41
48
|
var oidc_2 = require("./oidc");
|
|
42
49
|
Object.defineProperty(exports, "AtlasOidcError", { enumerable: true, get: function () { return oidc_2.AtlasOidcError; } });
|
|
43
50
|
Object.defineProperty(exports, "isSafeReturnTo", { enumerable: true, get: function () { return oidc_2.isSafeReturnTo; } });
|
|
@@ -54,12 +61,12 @@ Object.defineProperty(exports, "BACKCHANNEL_LOGOUT_EVENT", { enumerable: true, g
|
|
|
54
61
|
Object.defineProperty(exports, "LogoutTokenVerifier", { enumerable: true, get: function () { return logout_token_1.LogoutTokenVerifier; } });
|
|
55
62
|
Object.defineProperty(exports, "memoryLogoutReplayStore", { enumerable: true, get: function () { return logout_token_1.memoryLogoutReplayStore; } });
|
|
56
63
|
Object.defineProperty(exports, "verifyLogoutToken", { enumerable: true, get: function () { return logout_token_1.verifyLogoutToken; } });
|
|
57
|
-
var
|
|
58
|
-
Object.defineProperty(exports, "expressBackchannelLogout", { enumerable: true, get: function () { return
|
|
59
|
-
Object.defineProperty(exports, "fastifyBackchannelLogout", { enumerable: true, get: function () { return
|
|
60
|
-
Object.defineProperty(exports, "fastifyBackchannelLogoutPlugin", { enumerable: true, get: function () { return
|
|
61
|
-
Object.defineProperty(exports, "fetchBackchannelLogout", { enumerable: true, get: function () { return
|
|
62
|
-
Object.defineProperty(exports, "handleBackchannelLogout", { enumerable: true, get: function () { return
|
|
64
|
+
var backchannel_handlers_2 = require("./backchannel-handlers");
|
|
65
|
+
Object.defineProperty(exports, "expressBackchannelLogout", { enumerable: true, get: function () { return backchannel_handlers_2.expressBackchannelLogout; } });
|
|
66
|
+
Object.defineProperty(exports, "fastifyBackchannelLogout", { enumerable: true, get: function () { return backchannel_handlers_2.fastifyBackchannelLogout; } });
|
|
67
|
+
Object.defineProperty(exports, "fastifyBackchannelLogoutPlugin", { enumerable: true, get: function () { return backchannel_handlers_2.fastifyBackchannelLogoutPlugin; } });
|
|
68
|
+
Object.defineProperty(exports, "fetchBackchannelLogout", { enumerable: true, get: function () { return backchannel_handlers_2.fetchBackchannelLogout; } });
|
|
69
|
+
Object.defineProperty(exports, "handleBackchannelLogout", { enumerable: true, get: function () { return backchannel_handlers_2.handleBackchannelLogout; } });
|
|
63
70
|
// Webhooks, verified with Web Crypto.
|
|
64
71
|
var webhook_common_1 = require("./webhook-common");
|
|
65
72
|
Object.defineProperty(exports, "ATLAS_WEBHOOK_HEADERS", { enumerable: true, get: function () { return webhook_common_1.ATLAS_WEBHOOK_HEADERS; } });
|
|
@@ -202,11 +209,49 @@ function createRelyingParty(config) {
|
|
|
202
209
|
const url = `${(config.apiUrl ?? request_1.DEFAULT_API_URL).replace(/\/+$/, '')}/v1/sessions/${encodeURIComponent(sid)}/${action}`;
|
|
203
210
|
return doFetch(url, { method: 'POST', headers: { authorization: `Bearer ${config.secretKey}`, accept: 'application/json' } });
|
|
204
211
|
}
|
|
212
|
+
/** The app's own sign-in, authenticated like the token endpoint (`/oauth2/session/touch` or `/end`). */
|
|
213
|
+
function appSessionCall(sid, action, caller) {
|
|
214
|
+
const method = config.clientAuth ?? (config.clientSecret ? 'client_secret_basic' : 'none');
|
|
215
|
+
if (method === 'none' || !config.clientSecret) {
|
|
216
|
+
throw new TypeError(`${caller}: configure \`clientSecret\` (the app's client credentials)${action === 'touch' ? ' or `secretKey`' : ''}; a public client cannot call it.`);
|
|
217
|
+
}
|
|
218
|
+
if (typeof sid !== 'string' || !sid)
|
|
219
|
+
throw new TypeError('A session id (`sid`) is required.');
|
|
220
|
+
const body = new URLSearchParams({ sid });
|
|
221
|
+
const headers = { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' };
|
|
222
|
+
if (method === 'client_secret_basic') {
|
|
223
|
+
// RFC 6749 §2.3.1: both halves are form-encoded before Basic encoding.
|
|
224
|
+
headers.authorization = `Basic ${btoa(`${encodeURIComponent(config.clientId)}:${encodeURIComponent(config.clientSecret)}`)}`;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
body.set('client_id', config.clientId);
|
|
228
|
+
body.set('client_secret', config.clientSecret);
|
|
229
|
+
}
|
|
230
|
+
return doFetch(`${config.issuer.replace(/\/+$/, '')}/oauth2/session/${action}`, { method: 'POST', headers, body });
|
|
231
|
+
}
|
|
232
|
+
/** The OAuth error body of `/oauth2/session/*` as an {@link AtlasApiError}. */
|
|
233
|
+
function oauthFailure(res, body) {
|
|
234
|
+
const code = typeof body?.error === 'string' ? body.error : 'request_failed';
|
|
235
|
+
const message = typeof body?.error_description === 'string' ? body.error_description : `The issuer answered ${res.status}.`;
|
|
236
|
+
return new error_1.AtlasApiError(res.status, [{ code, message }]);
|
|
237
|
+
}
|
|
205
238
|
async function touchIfDue(sid, lastTouchedAt) {
|
|
206
239
|
const now = clock();
|
|
207
240
|
if (typeof lastTouchedAt === 'number' && now - lastTouchedAt < interval && now >= lastTouchedAt) {
|
|
208
241
|
return { status: 'skipped', lastTouchedAt };
|
|
209
242
|
}
|
|
243
|
+
if (!config.secretKey) {
|
|
244
|
+
const res = await appSessionCall(sid, 'touch', 'touchIfDue');
|
|
245
|
+
const body = (await res.json().catch(() => null));
|
|
246
|
+
if (res.ok) {
|
|
247
|
+
const idle = body?.idle_expires_at;
|
|
248
|
+
const idleExpiresAt = typeof idle === 'number' ? new Date(idle).toISOString() : typeof idle === 'string' ? idle : null;
|
|
249
|
+
return { status: 'touched', lastTouchedAt: now, idleExpiresAt };
|
|
250
|
+
}
|
|
251
|
+
if (res.status === 404 && body?.error === 'session_not_found')
|
|
252
|
+
return { status: 'ended', reason: 'not_found' };
|
|
253
|
+
throw oauthFailure(res, body);
|
|
254
|
+
}
|
|
210
255
|
const res = await sessionCall(sid, 'touch');
|
|
211
256
|
const body = (await res.json().catch(() => null));
|
|
212
257
|
if (res.ok) {
|
|
@@ -233,6 +278,50 @@ function createRelyingParty(config) {
|
|
|
233
278
|
return 'not_found';
|
|
234
279
|
throw new error_1.AtlasApiError(res.status, errorsOf(await res.json().catch(() => null)));
|
|
235
280
|
}
|
|
281
|
+
async function endAppSession(sid) {
|
|
282
|
+
const res = await appSessionCall(sid, 'end', 'endAppSession');
|
|
283
|
+
const body = (await res.json().catch(() => null));
|
|
284
|
+
if (res.ok)
|
|
285
|
+
return 'ended';
|
|
286
|
+
if (res.status === 404 && body?.error === 'session_not_found')
|
|
287
|
+
return 'not_found';
|
|
288
|
+
throw oauthFailure(res, body);
|
|
289
|
+
}
|
|
290
|
+
async function bindSession(sid, appSessionId, expiresAt) {
|
|
291
|
+
if (!config.sidStore)
|
|
292
|
+
throw new TypeError('bindSession: `sidStore` is not configured.');
|
|
293
|
+
if (typeof sid !== 'string' || !sid || typeof appSessionId !== 'string' || !appSessionId) {
|
|
294
|
+
throw new TypeError('bindSession: `sid` and `appSessionId` are required.');
|
|
295
|
+
}
|
|
296
|
+
await config.sidStore.bind(sid, appSessionId, expiresAt);
|
|
297
|
+
}
|
|
298
|
+
// Built on first use so its key cache lives as long as the relying party.
|
|
299
|
+
let backchannel;
|
|
300
|
+
async function backchannelLogout(request) {
|
|
301
|
+
const onLogout = config.onBackchannelLogout;
|
|
302
|
+
if (!onLogout)
|
|
303
|
+
throw new TypeError('backchannelLogout: `onBackchannelLogout` is not configured.');
|
|
304
|
+
backchannel ??= (0, backchannel_handlers_1.fetchBackchannelLogout)({
|
|
305
|
+
issuer: config.issuer,
|
|
306
|
+
clientId: config.clientId,
|
|
307
|
+
fetchImpl: config.fetchImpl,
|
|
308
|
+
now: config.now,
|
|
309
|
+
async onLogout(claims) {
|
|
310
|
+
const store = config.sidStore;
|
|
311
|
+
const ids = claims.sid && store ? await store.take(claims.sid) : [];
|
|
312
|
+
try {
|
|
313
|
+
await onLogout(ids, claims);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
// Put the bindings back so Atlas's retry finds them; the app sessions are ending anyway.
|
|
317
|
+
for (const id of ids)
|
|
318
|
+
await store.bind(claims.sid, id, clock() + 86_400_000);
|
|
319
|
+
throw error;
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
return backchannel(request);
|
|
324
|
+
}
|
|
236
325
|
async function signOut(options = {}) {
|
|
237
326
|
if (config.serverSignOut && options.sid && config.secretKey) {
|
|
238
327
|
const url = `${(config.apiUrl ?? request_1.DEFAULT_API_URL).replace(/\/+$/, '')}/v1/oauth_clients/${encodeURIComponent(config.clientId)}/logout`;
|
|
@@ -265,6 +354,8 @@ function createRelyingParty(config) {
|
|
|
265
354
|
const { pathname } = new URL(request.url);
|
|
266
355
|
const method = request.method.toUpperCase();
|
|
267
356
|
const routes = config.routes ?? {};
|
|
357
|
+
if (method === 'POST' && routes.backchannelLogout && pathname === routes.backchannelLogout)
|
|
358
|
+
return backchannelLogout(request);
|
|
268
359
|
if (method === 'GET' && pathname === (routes.signIn ?? '/auth/sign-in'))
|
|
269
360
|
return start(request);
|
|
270
361
|
if (method === 'GET' && pathname === (routes.callback ?? new URL(config.redirectUri).pathname)) {
|
|
@@ -288,7 +379,7 @@ function createRelyingParty(config) {
|
|
|
288
379
|
}
|
|
289
380
|
return null;
|
|
290
381
|
}
|
|
291
|
-
return { start, callback, requireRecentAuth, touchIfDue, revokeSession, signOut, handle };
|
|
382
|
+
return { start, callback, requireRecentAuth, touchIfDue, revokeSession, endAppSession, bindSession, backchannelLogout, signOut, handle };
|
|
292
383
|
}
|
|
293
384
|
/** A copy of `response` with mutable headers and one more `Set-Cookie`. */
|
|
294
385
|
function withCookie(response, cookie) {
|
package/dist/rp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rp.js","sourceRoot":"","sources":["../src/rp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rp.js","sourceRoot":"","sources":["../src/rp.ts"],"names":[],"mappings":"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"}
|