@atlasauth/emulator-core 0.2.0 → 0.3.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/dist/custom-html.d.ts +57 -0
- package/dist/custom-html.js +491 -0
- package/dist/custom-html.js.map +1 -0
- package/dist/engine.d.ts +1 -1
- package/dist/engine.js +4 -0
- package/dist/engine.js.map +1 -1
- package/dist/error-catalog.js +8 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/event-gate.js +60 -2
- package/dist/event-gate.js.map +1 -1
- package/dist/generic.js +5 -1
- package/dist/generic.js.map +1 -1
- package/dist/handlers/access-signals.d.ts +48 -0
- package/dist/handlers/access-signals.js +76 -0
- package/dist/handlers/access-signals.js.map +1 -0
- package/dist/handlers/approvals.js +54 -1
- package/dist/handlers/approvals.js.map +1 -1
- package/dist/handlers/authz-data.d.ts +2 -0
- package/dist/handlers/authz-data.js +627 -0
- package/dist/handlers/authz-data.js.map +1 -0
- package/dist/handlers/authz-layers.d.ts +229 -0
- package/dist/handlers/authz-layers.js +786 -0
- package/dist/handlers/authz-layers.js.map +1 -0
- package/dist/handlers/authz-state.d.ts +80 -0
- package/dist/handlers/authz-state.js +175 -0
- package/dist/handlers/authz-state.js.map +1 -0
- package/dist/handlers/authz.js +240 -177
- package/dist/handlers/authz.js.map +1 -1
- package/dist/handlers/billing.d.ts +99 -1
- package/dist/handlers/billing.js +556 -77
- package/dist/handlers/billing.js.map +1 -1
- package/dist/handlers/cedar-ext.d.ts +35 -0
- package/dist/handlers/cedar-ext.js +174 -0
- package/dist/handlers/cedar-ext.js.map +1 -0
- package/dist/handlers/cedar.d.ts +146 -0
- package/dist/handlers/cedar.js +689 -0
- package/dist/handlers/cedar.js.map +1 -0
- package/dist/handlers/connections.d.ts +4 -1
- package/dist/handlers/connections.js +267 -38
- package/dist/handlers/connections.js.map +1 -1
- package/dist/handlers/control.js +6 -1
- package/dist/handlers/control.js.map +1 -1
- package/dist/handlers/device.js +18 -1
- package/dist/handlers/device.js.map +1 -1
- package/dist/handlers/emu3-misc.d.ts +38 -0
- package/dist/handlers/emu3-misc.js +1056 -0
- package/dist/handlers/emu3-misc.js.map +1 -0
- package/dist/handlers/emu4-actions-access.d.ts +46 -0
- package/dist/handlers/emu4-actions-access.js +107 -0
- package/dist/handlers/emu4-actions-access.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
- package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog.js +143 -0
- package/dist/handlers/emu4-actions-catalog.js.map +1 -0
- package/dist/handlers/emu4-actions-def.d.ts +50 -0
- package/dist/handlers/emu4-actions-def.js +250 -0
- package/dist/handlers/emu4-actions-def.js.map +1 -0
- package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
- package/dist/handlers/emu4-actions-sandbox.js +318 -0
- package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
- package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
- package/dist/handlers/emu4-actions-typegen.js +73 -0
- package/dist/handlers/emu4-actions-typegen.js.map +1 -0
- package/dist/handlers/emu4-actions.d.ts +2 -0
- package/dist/handlers/emu4-actions.js +506 -0
- package/dist/handlers/emu4-actions.js.map +1 -0
- package/dist/handlers/emu4-authz-trust.d.ts +40 -0
- package/dist/handlers/emu4-authz-trust.js +488 -0
- package/dist/handlers/emu4-authz-trust.js.map +1 -0
- package/dist/handlers/emu4-authz.d.ts +2 -0
- package/dist/handlers/emu4-authz.js +752 -0
- package/dist/handlers/emu4-authz.js.map +1 -0
- package/dist/handlers/emu4-billing-core.d.ts +23 -0
- package/dist/handlers/emu4-billing-core.js +22 -0
- package/dist/handlers/emu4-billing-core.js.map +1 -0
- package/dist/handlers/emu4-billing-x.d.ts +2 -0
- package/dist/handlers/emu4-billing-x.js +489 -0
- package/dist/handlers/emu4-billing-x.js.map +1 -0
- package/dist/handlers/emu4-billing.d.ts +14 -0
- package/dist/handlers/emu4-billing.js +846 -0
- package/dist/handlers/emu4-billing.js.map +1 -0
- package/dist/handlers/emu4-clones.d.ts +2 -0
- package/dist/handlers/emu4-clones.js +322 -0
- package/dist/handlers/emu4-clones.js.map +1 -0
- package/dist/handlers/emu4-compliance.d.ts +8 -0
- package/dist/handlers/emu4-compliance.js +39 -0
- package/dist/handlers/emu4-compliance.js.map +1 -0
- package/dist/handlers/emu4-config.d.ts +14 -0
- package/dist/handlers/emu4-config.js +148 -0
- package/dist/handlers/emu4-config.js.map +1 -0
- package/dist/handlers/emu4-cookies.d.ts +8 -0
- package/dist/handlers/emu4-cookies.js +248 -0
- package/dist/handlers/emu4-cookies.js.map +1 -0
- package/dist/handlers/emu4-erasure.d.ts +2 -0
- package/dist/handlers/emu4-erasure.js +587 -0
- package/dist/handlers/emu4-erasure.js.map +1 -0
- package/dist/handlers/emu4-federation.d.ts +8 -0
- package/dist/handlers/emu4-federation.js +18 -0
- package/dist/handlers/emu4-federation.js.map +1 -0
- package/dist/handlers/emu4-journey-math.d.ts +42 -0
- package/dist/handlers/emu4-journey-math.js +99 -0
- package/dist/handlers/emu4-journey-math.js.map +1 -0
- package/dist/handlers/emu4-messaging.d.ts +21 -0
- package/dist/handlers/emu4-messaging.js +595 -0
- package/dist/handlers/emu4-messaging.js.map +1 -0
- package/dist/handlers/emu4-minors.d.ts +7 -0
- package/dist/handlers/emu4-minors.js +408 -0
- package/dist/handlers/emu4-minors.js.map +1 -0
- package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
- package/dist/handlers/emu4-oauth-audit.js +17 -0
- package/dist/handlers/emu4-oauth-audit.js.map +1 -0
- package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
- package/dist/handlers/emu4-oauth-auth.js +363 -0
- package/dist/handlers/emu4-oauth-auth.js.map +1 -0
- package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
- package/dist/handlers/emu4-oauth-delivery.js +207 -0
- package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
- package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
- package/dist/handlers/emu4-oauth-keys.js +268 -0
- package/dist/handlers/emu4-oauth-keys.js.map +1 -0
- package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
- package/dist/handlers/emu4-oauth-pub.js +420 -0
- package/dist/handlers/emu4-oauth-pub.js.map +1 -0
- package/dist/handlers/emu4-oauth.d.ts +10 -0
- package/dist/handlers/emu4-oauth.js +23 -0
- package/dist/handlers/emu4-oauth.js.map +1 -0
- package/dist/handlers/emu4-policies.d.ts +2 -0
- package/dist/handlers/emu4-policies.js +408 -0
- package/dist/handlers/emu4-policies.js.map +1 -0
- package/dist/handlers/emu4-region.d.ts +2 -0
- package/dist/handlers/emu4-region.js +189 -0
- package/dist/handlers/emu4-region.js.map +1 -0
- package/dist/handlers/emu4-saml.d.ts +12 -0
- package/dist/handlers/emu4-saml.js +532 -0
- package/dist/handlers/emu4-saml.js.map +1 -0
- package/dist/handlers/emu4-shared.d.ts +44 -0
- package/dist/handlers/emu4-shared.js +90 -0
- package/dist/handlers/emu4-shared.js.map +1 -0
- package/dist/handlers/emu4-snapshots.d.ts +38 -0
- package/dist/handlers/emu4-snapshots.js +231 -0
- package/dist/handlers/emu4-snapshots.js.map +1 -0
- package/dist/handlers/emu4-sns.d.ts +9 -0
- package/dist/handlers/emu4-sns.js +21 -0
- package/dist/handlers/emu4-sns.js.map +1 -0
- package/dist/handlers/emu4-trust-binding.d.ts +27 -0
- package/dist/handlers/emu4-trust-binding.js +344 -0
- package/dist/handlers/emu4-trust-binding.js.map +1 -0
- package/dist/handlers/emu4-trust.d.ts +35 -0
- package/dist/handlers/emu4-trust.js +543 -0
- package/dist/handlers/emu4-trust.js.map +1 -0
- package/dist/handlers/fga-engine.d.ts +78 -0
- package/dist/handlers/fga-engine.js +663 -0
- package/dist/handlers/fga-engine.js.map +1 -0
- package/dist/handlers/hooks.js +13 -0
- package/dist/handlers/hooks.js.map +1 -1
- package/dist/handlers/index.js +14 -1
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/machines.js +6 -0
- package/dist/handlers/machines.js.map +1 -1
- package/dist/handlers/messaging.d.ts +3 -1
- package/dist/handlers/messaging.js +455 -48
- package/dist/handlers/messaging.js.map +1 -1
- package/dist/handlers/oauth-adv.d.ts +191 -0
- package/dist/handlers/oauth-adv.js +1305 -0
- package/dist/handlers/oauth-adv.js.map +1 -0
- package/dist/handlers/oauth-flows.d.ts +25 -1
- package/dist/handlers/oauth-flows.js +111 -50
- package/dist/handlers/oauth-flows.js.map +1 -1
- package/dist/handlers/oauth.d.ts +24 -3
- package/dist/handlers/oauth.js +245 -60
- package/dist/handlers/oauth.js.map +1 -1
- package/dist/handlers/orgs.js +6 -0
- package/dist/handlers/orgs.js.map +1 -1
- package/dist/handlers/platform.d.ts +5 -0
- package/dist/handlers/platform.js +33 -15
- package/dist/handlers/platform.js.map +1 -1
- package/dist/handlers/scim.d.ts +2 -0
- package/dist/handlers/scim.js +198 -11
- package/dist/handlers/scim.js.map +1 -1
- package/dist/handlers/sessions.d.ts +2 -0
- package/dist/handlers/sessions.js +24 -16
- package/dist/handlers/sessions.js.map +1 -1
- package/dist/handlers/users.js +3 -0
- package/dist/handlers/users.js.map +1 -1
- package/dist/jwe.d.ts +18 -0
- package/dist/jwe.js +101 -0
- package/dist/jwe.js.map +1 -0
- package/dist/jws.js +2 -0
- package/dist/jws.js.map +1 -1
- package/dist/messaging-callbacks.d.ts +100 -0
- package/dist/messaging-callbacks.js +767 -0
- package/dist/messaging-callbacks.js.map +1 -0
- package/dist/openapi.js +41 -1
- package/dist/openapi.js.map +1 -1
- package/dist/parity-emu3-authz.d.ts +3 -0
- package/dist/parity-emu3-authz.js +61 -0
- package/dist/parity-emu3-authz.js.map +1 -0
- package/dist/parity-emu3-billing.d.ts +3 -0
- package/dist/parity-emu3-billing.js +25 -0
- package/dist/parity-emu3-billing.js.map +1 -0
- package/dist/parity-emu3-messaging.d.ts +3 -0
- package/dist/parity-emu3-messaging.js +27 -0
- package/dist/parity-emu3-messaging.js.map +1 -0
- package/dist/parity-emu3-misc.d.ts +2 -0
- package/dist/parity-emu3-misc.js +63 -0
- package/dist/parity-emu3-misc.js.map +1 -0
- package/dist/parity-emu3-oauth.d.ts +2 -0
- package/dist/parity-emu3-oauth.js +39 -0
- package/dist/parity-emu3-oauth.js.map +1 -0
- package/dist/parity-emu4-actions.d.ts +2 -0
- package/dist/parity-emu4-actions.js +38 -0
- package/dist/parity-emu4-actions.js.map +1 -0
- package/dist/parity-emu4-authz.d.ts +3 -0
- package/dist/parity-emu4-authz.js +68 -0
- package/dist/parity-emu4-authz.js.map +1 -0
- package/dist/parity-emu4-billing.d.ts +6 -0
- package/dist/parity-emu4-billing.js +44 -0
- package/dist/parity-emu4-billing.js.map +1 -0
- package/dist/parity-emu4-compliance.d.ts +2 -0
- package/dist/parity-emu4-compliance.js +92 -0
- package/dist/parity-emu4-compliance.js.map +1 -0
- package/dist/parity-emu4-federation.d.ts +2 -0
- package/dist/parity-emu4-federation.js +33 -0
- package/dist/parity-emu4-federation.js.map +1 -0
- package/dist/parity-emu4-messaging.d.ts +3 -0
- package/dist/parity-emu4-messaging.js +42 -0
- package/dist/parity-emu4-messaging.js.map +1 -0
- package/dist/parity-emu4-oauth.d.ts +2 -0
- package/dist/parity-emu4-oauth.js +55 -0
- package/dist/parity-emu4-oauth.js.map +1 -0
- package/dist/parity-emu4-trust.d.ts +2 -0
- package/dist/parity-emu4-trust.js +41 -0
- package/dist/parity-emu4-trust.js.map +1 -0
- package/dist/parity-routes.js +19 -1
- package/dist/parity-routes.js.map +1 -1
- package/dist/sns-cert.d.ts +9 -0
- package/dist/sns-cert.js +101 -0
- package/dist/sns-cert.js.map +1 -0
- package/dist/tokens.d.ts +69 -4
- package/dist/tokens.js +164 -38
- package/dist/tokens.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Engine, Reply, RouteDef } from '../engine';
|
|
2
|
+
import type { Obj } from '../openapi';
|
|
3
|
+
/**
|
|
4
|
+
* Client authentication with a signed assertion (`private_key_jwt`, RFC 7523), encryption keys for request objects,
|
|
5
|
+
* the response modes `form_post` and the JARM family (`jwt`, `query.jwt`, `fragment.jwt`, `form_post.jwt`), pairwise
|
|
6
|
+
* subject identifiers and software statements for dynamic registration.
|
|
7
|
+
*/
|
|
8
|
+
export declare const ASSERTION_TYPE = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer";
|
|
9
|
+
/** The algorithms the OP signs ID tokens, user info and authorization responses (JARM) with. */
|
|
10
|
+
export declare const OP_SIGNING_ALGS: string[];
|
|
11
|
+
export declare const EXT_RESPONSE_MODES: string[];
|
|
12
|
+
interface Issuer {
|
|
13
|
+
issuer: string;
|
|
14
|
+
jwks?: {
|
|
15
|
+
keys: Obj[];
|
|
16
|
+
};
|
|
17
|
+
jwks_uri?: string;
|
|
18
|
+
}
|
|
19
|
+
interface AuthState {
|
|
20
|
+
seen: Map<string, number>;
|
|
21
|
+
pairwiseSecret: Uint8Array;
|
|
22
|
+
dcr: {
|
|
23
|
+
require_software_statement: boolean;
|
|
24
|
+
software_statement_issuers: Issuer[];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare const dcrConfig: (e: Engine) => AuthState["dcr"];
|
|
28
|
+
/** The client a `client_assertion` names (its `iss`), for requests that carry no client_id. */
|
|
29
|
+
export declare function assertionClientId(body: Obj): string | undefined;
|
|
30
|
+
/** Authenticate a `private_key_jwt` client; null on success, else the `invalid_client` description. Mirrors the real order of checks. */
|
|
31
|
+
export declare function verifyClientAssertion(e: Engine, body: Obj, client: Obj): Promise<string | null>;
|
|
32
|
+
/** The message when a keyed client authentication method has no key to authenticate with, else null. */
|
|
33
|
+
export declare const keyedClientProblem: (method: unknown, jwks: unknown, jwksUri: unknown) => string | null;
|
|
34
|
+
export declare const AUTH_METHODS: string[];
|
|
35
|
+
/** Publish (make) the encryption key of every algorithm a client registered `request_object_encryption_alg` for. */
|
|
36
|
+
export declare function ensureRegisteredEncryptionKeys(e: Engine): Promise<void>;
|
|
37
|
+
/** The `sub` a client sees for a user: the user id, or for a pairwise client HMAC-SHA256(secret, sector NUL user id). */
|
|
38
|
+
export declare function subjectFor(e: Engine, client: Obj | undefined, userId: string): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* The subject settings of a registration (OIDC Registration section 2), as the real validator words them. Returns the
|
|
41
|
+
* fields to store, or a message and the parameter. `existing` is the stored client on an update.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveSubject(e: Engine, input: {
|
|
44
|
+
subject_type?: unknown;
|
|
45
|
+
sector_identifier_uri?: unknown;
|
|
46
|
+
redirect_uris: string[];
|
|
47
|
+
redirectUrisChanged: boolean;
|
|
48
|
+
existing?: Obj;
|
|
49
|
+
publisherSector?: string | null;
|
|
50
|
+
}): Promise<{
|
|
51
|
+
ok: true;
|
|
52
|
+
value: Obj;
|
|
53
|
+
} | {
|
|
54
|
+
ok: false;
|
|
55
|
+
message: string;
|
|
56
|
+
param: string;
|
|
57
|
+
}>;
|
|
58
|
+
/** The claims of a software statement signed by an approved publisher, or the registration error. */
|
|
59
|
+
export declare function verifySoftwareStatement(e: Engine, statement: string): Promise<{
|
|
60
|
+
ok: true;
|
|
61
|
+
claims: Obj;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
error: string;
|
|
65
|
+
message: string;
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* Deliver an authorization response. `location` is the redirect the plain modes use (parameters in its query or
|
|
69
|
+
* fragment); `form_post` answers an auto-submitting form instead and a JARM mode packs the parameters into one signed
|
|
70
|
+
* `response` (iss, aud, exp = ten minutes) in the client's `authorization_signed_response_alg`.
|
|
71
|
+
*/
|
|
72
|
+
export declare function authReply(e: Engine, client: Obj | undefined, redirectUri: string, location: string, mode: string | null): Promise<Reply>;
|
|
73
|
+
export declare function clientExtras(c: Obj): Obj;
|
|
74
|
+
/** Validate the fields this module adds to a client create/update body; only keys present are returned. */
|
|
75
|
+
export declare function parseExtraClientFields(body: Obj): {
|
|
76
|
+
ok: true;
|
|
77
|
+
value: Obj;
|
|
78
|
+
} | {
|
|
79
|
+
ok: false;
|
|
80
|
+
message: string;
|
|
81
|
+
};
|
|
82
|
+
export declare function emu4AuthHandlers(): RouteDef[];
|
|
83
|
+
export {};
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUTH_METHODS = exports.keyedClientProblem = exports.dcrConfig = exports.EXT_RESPONSE_MODES = exports.OP_SIGNING_ALGS = exports.ASSERTION_TYPE = void 0;
|
|
4
|
+
exports.assertionClientId = assertionClientId;
|
|
5
|
+
exports.verifyClientAssertion = verifyClientAssertion;
|
|
6
|
+
exports.ensureRegisteredEncryptionKeys = ensureRegisteredEncryptionKeys;
|
|
7
|
+
exports.subjectFor = subjectFor;
|
|
8
|
+
exports.resolveSubject = resolveSubject;
|
|
9
|
+
exports.verifySoftwareStatement = verifySoftwareStatement;
|
|
10
|
+
exports.authReply = authReply;
|
|
11
|
+
exports.clientExtras = clientExtras;
|
|
12
|
+
exports.parseExtraClientFields = parseExtraClientFields;
|
|
13
|
+
exports.emu4AuthHandlers = emu4AuthHandlers;
|
|
14
|
+
const crypto_util_1 = require("../crypto-util");
|
|
15
|
+
const errors_1 = require("../errors");
|
|
16
|
+
const jws_1 = require("../jws");
|
|
17
|
+
const jwe_1 = require("../jwe");
|
|
18
|
+
const oauth_adv_1 = require("./oauth-adv");
|
|
19
|
+
const emu4_oauth_audit_1 = require("./emu4-oauth-audit");
|
|
20
|
+
const support_1 = require("./support");
|
|
21
|
+
/**
|
|
22
|
+
* Client authentication with a signed assertion (`private_key_jwt`, RFC 7523), encryption keys for request objects,
|
|
23
|
+
* the response modes `form_post` and the JARM family (`jwt`, `query.jwt`, `fragment.jwt`, `form_post.jwt`), pairwise
|
|
24
|
+
* subject identifiers and software statements for dynamic registration.
|
|
25
|
+
*/
|
|
26
|
+
exports.ASSERTION_TYPE = 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer';
|
|
27
|
+
/** The algorithms the OP signs ID tokens, user info and authorization responses (JARM) with. */
|
|
28
|
+
exports.OP_SIGNING_ALGS = ['RS256', 'PS256', 'ES256', 'ES384', 'EdDSA'];
|
|
29
|
+
exports.EXT_RESPONSE_MODES = ['form_post', 'jwt', 'query.jwt', 'fragment.jwt', 'form_post.jwt'];
|
|
30
|
+
const CLOCK_SKEW_S = 5;
|
|
31
|
+
const authState = (0, support_1.engineState)(() => ({ seen: new Map(), pairwiseSecret: crypto.getRandomValues(new Uint8Array(32)), dcr: { require_software_statement: false, software_statement_issuers: [] } }));
|
|
32
|
+
const dcrConfig = (e) => authState(e).dcr;
|
|
33
|
+
exports.dcrConfig = dcrConfig;
|
|
34
|
+
const fetchOf = (e) => e.options.fetch ?? fetch;
|
|
35
|
+
/** The public keys of a client (inline `jwks`, else fetched from `jwks_uri`), narrowed to the signing keys named by `kid`. */
|
|
36
|
+
async function signingKeysOf(e, holder, kid) {
|
|
37
|
+
let keys = Array.isArray(holder.jwks?.keys) ? holder.jwks.keys : [];
|
|
38
|
+
if (!keys.length && holder.jwks_uri) {
|
|
39
|
+
try {
|
|
40
|
+
const res = await fetchOf(e)(holder.jwks_uri);
|
|
41
|
+
keys = res.ok ? ((await res.json()).keys ?? []) : [];
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
keys = [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return keys.filter((k) => k.use !== 'enc' && (!kid || k.kid === kid));
|
|
48
|
+
}
|
|
49
|
+
/** The client a `client_assertion` names (its `iss`), for requests that carry no client_id. */
|
|
50
|
+
function assertionClientId(body) {
|
|
51
|
+
const a = typeof body.client_assertion === 'string' ? (0, jws_1.decodeJwt)(body.client_assertion) : null;
|
|
52
|
+
return typeof a?.payload.iss === 'string' ? a.payload.iss : undefined;
|
|
53
|
+
}
|
|
54
|
+
/** Authenticate a `private_key_jwt` client; null on success, else the `invalid_client` description. Mirrors the real order of checks. */
|
|
55
|
+
async function verifyClientAssertion(e, body, client) {
|
|
56
|
+
const assertion = body.client_assertion;
|
|
57
|
+
if (body.client_assertion_type !== exports.ASSERTION_TYPE || typeof assertion !== 'string' || !assertion)
|
|
58
|
+
return 'This client must authenticate with a private_key_jwt client assertion.';
|
|
59
|
+
const jwt = (0, jws_1.decodeJwt)(assertion);
|
|
60
|
+
const alg = String(jwt?.header.alg ?? '');
|
|
61
|
+
if (!jwt || !oauth_adv_1.REQUEST_OBJECT_ALGS.includes(alg))
|
|
62
|
+
return 'The client assertion signature is invalid or expired.';
|
|
63
|
+
const keys = await signingKeysOf(e, client, typeof jwt.header.kid === 'string' ? jwt.header.kid : undefined);
|
|
64
|
+
if (!keys.length)
|
|
65
|
+
return 'The client has no resolvable keys for its assertion.';
|
|
66
|
+
let verified = false;
|
|
67
|
+
for (const k of keys)
|
|
68
|
+
if ((verified = await (0, jws_1.verifyJws)(jwt, k)))
|
|
69
|
+
break;
|
|
70
|
+
const nowS = e.clock.now() / 1000;
|
|
71
|
+
const c = jwt.payload;
|
|
72
|
+
if (!verified || (typeof c.exp === 'number' && c.exp + CLOCK_SKEW_S <= nowS) || (typeof c.nbf === 'number' && c.nbf - CLOCK_SKEW_S > nowS))
|
|
73
|
+
return 'The client assertion signature is invalid or expired.';
|
|
74
|
+
if (c.iss !== client.id || c.sub !== client.id)
|
|
75
|
+
return 'The client assertion iss and sub must equal the client_id.';
|
|
76
|
+
const auds = Array.isArray(c.aud) ? c.aud : [c.aud];
|
|
77
|
+
const accepted = [`${e.issuer}/oauth2/token`, `${e.issuer}/oauth2/par`, e.issuer];
|
|
78
|
+
if (!auds.some((a) => typeof a === 'string' && accepted.includes(a)))
|
|
79
|
+
return 'The client assertion audience does not match this endpoint.';
|
|
80
|
+
if (typeof c.exp !== 'number')
|
|
81
|
+
return 'The client assertion must carry an exp.';
|
|
82
|
+
if (typeof c.jti !== 'string' || !c.jti)
|
|
83
|
+
return 'The client assertion must carry a jti.';
|
|
84
|
+
// Single use until the assertion's own expiry.
|
|
85
|
+
const seen = authState(e).seen;
|
|
86
|
+
const now = e.clock.now();
|
|
87
|
+
for (const [k, until] of seen)
|
|
88
|
+
if (until <= now)
|
|
89
|
+
seen.delete(k);
|
|
90
|
+
const key = `${client.id}:${c.jti}`;
|
|
91
|
+
if (seen.has(key))
|
|
92
|
+
return 'The client assertion has already been used.';
|
|
93
|
+
seen.set(key, c.exp * 1000);
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
/** The message when a keyed client authentication method has no key to authenticate with, else null. */
|
|
97
|
+
const keyedClientProblem = (method, jwks, jwksUri) => (method === 'private_key_jwt' && !jwks && !jwksUri ? 'private_key_jwt needs jwks or jwks_uri.' : null);
|
|
98
|
+
exports.keyedClientProblem = keyedClientProblem;
|
|
99
|
+
exports.AUTH_METHODS = ['none', 'client_secret_basic', 'client_secret_post', 'private_key_jwt'];
|
|
100
|
+
// ── encryption keys for request objects ─────────────────────────────
|
|
101
|
+
/** Publish (make) the encryption key of every algorithm a client registered `request_object_encryption_alg` for. */
|
|
102
|
+
async function ensureRegisteredEncryptionKeys(e) {
|
|
103
|
+
for (const c of e.db.oauthClients.all()) {
|
|
104
|
+
if (!c.deleted && (0, jwe_1.isOpDecryptAlg)(c.request_object_encryption_alg))
|
|
105
|
+
await e.tokens.ensureEncryptionKey(c.request_object_encryption_alg);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// ── pairwise subject identifiers (OIDC Core section 8) ─────────────
|
|
109
|
+
const pairwiseOf = (c) => c.subject_type === 'pairwise' && typeof c.sector_identifier === 'string' && !!c.sector_identifier;
|
|
110
|
+
/** The `sub` a client sees for a user: the user id, or for a pairwise client HMAC-SHA256(secret, sector NUL user id). */
|
|
111
|
+
async function subjectFor(e, client, userId) {
|
|
112
|
+
if (!client || !pairwiseOf(client))
|
|
113
|
+
return userId;
|
|
114
|
+
const key = await crypto.subtle.importKey('raw', authState(e).pairwiseSecret, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
115
|
+
return (0, crypto_util_1.bytesToB64url)(new Uint8Array(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(`${client.sector_identifier}\u0000${userId}`))));
|
|
116
|
+
}
|
|
117
|
+
const redirectSector = (uri) => {
|
|
118
|
+
try {
|
|
119
|
+
const u = new URL(uri);
|
|
120
|
+
return u.hostname ? u.hostname.toLowerCase() : u.protocol.replace(/:$/, '').toLowerCase() || undefined;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* The subject settings of a registration (OIDC Registration section 2), as the real validator words them. Returns the
|
|
128
|
+
* fields to store, or a message and the parameter. `existing` is the stored client on an update.
|
|
129
|
+
*/
|
|
130
|
+
async function resolveSubject(e, input) {
|
|
131
|
+
const fail = (message, param) => ({ ok: false, message, param });
|
|
132
|
+
if (input.publisherSector) {
|
|
133
|
+
if (input.subject_type !== undefined || input.sector_identifier_uri !== undefined)
|
|
134
|
+
return fail(`This client belongs to a publisher that shares the sector ${input.publisherSector}. Detach it from the publisher before changing subject_type or sector_identifier_uri.`, input.subject_type !== undefined ? 'subject_type' : 'sector_identifier_uri');
|
|
135
|
+
return { ok: true, value: {} };
|
|
136
|
+
}
|
|
137
|
+
if (input.subject_type !== undefined && input.subject_type !== 'public' && input.subject_type !== 'pairwise')
|
|
138
|
+
return fail('subject_type must be public or pairwise.', 'subject_type');
|
|
139
|
+
let sectorUri;
|
|
140
|
+
if (input.sector_identifier_uri !== undefined) {
|
|
141
|
+
const raw = input.sector_identifier_uri;
|
|
142
|
+
if (raw === null || raw === '')
|
|
143
|
+
sectorUri = null;
|
|
144
|
+
else if (typeof raw !== 'string')
|
|
145
|
+
return fail('sector_identifier_uri must be an https URL.', 'sector_identifier_uri');
|
|
146
|
+
else {
|
|
147
|
+
let url;
|
|
148
|
+
try {
|
|
149
|
+
url = new URL(raw.trim());
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return fail('sector_identifier_uri must be an https URL.', 'sector_identifier_uri');
|
|
153
|
+
}
|
|
154
|
+
if (url.protocol !== 'https:' || url.hash || url.username || url.password)
|
|
155
|
+
return fail('sector_identifier_uri must be an https URL with no fragment or credentials.', 'sector_identifier_uri');
|
|
156
|
+
sectorUri = url.toString();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (input.subject_type === undefined && input.sector_identifier_uri === undefined && !input.redirectUrisChanged)
|
|
160
|
+
return { ok: true, value: {} };
|
|
161
|
+
const subjectType = input.subject_type ?? input.existing?.subject_type ?? 'public';
|
|
162
|
+
const effectiveUri = sectorUri !== undefined ? sectorUri : (input.existing?.sector_identifier_uri ?? null);
|
|
163
|
+
if (effectiveUri && (sectorUri !== undefined || input.redirectUrisChanged)) {
|
|
164
|
+
let listed;
|
|
165
|
+
try {
|
|
166
|
+
const res = await fetchOf(e)(effectiveUri, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'manual' });
|
|
167
|
+
if (res.status !== 200)
|
|
168
|
+
return fail(`The sector_identifier_uri answered ${res.status}; it must answer 200 with a JSON array.`, 'sector_identifier_uri');
|
|
169
|
+
listed = JSON.parse(await res.text());
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return fail(err instanceof SyntaxError ? 'The sector_identifier_uri must serve a JSON array of redirect URIs.' : 'The sector_identifier_uri could not be fetched.', 'sector_identifier_uri');
|
|
173
|
+
}
|
|
174
|
+
if (!Array.isArray(listed) || !listed.every((u) => typeof u === 'string'))
|
|
175
|
+
return fail('The sector_identifier_uri must serve a JSON array of redirect URIs.', 'sector_identifier_uri');
|
|
176
|
+
const missing = input.redirect_uris.filter((u) => !listed.includes(u));
|
|
177
|
+
if (missing.length)
|
|
178
|
+
return fail(`The sector_identifier_uri does not list every redirect_uri (missing: ${missing.join(', ')}).`, 'sector_identifier_uri');
|
|
179
|
+
}
|
|
180
|
+
let sector = null;
|
|
181
|
+
if (subjectType === 'pairwise') {
|
|
182
|
+
if (effectiveUri)
|
|
183
|
+
sector = new URL(effectiveUri).hostname.toLowerCase();
|
|
184
|
+
else {
|
|
185
|
+
const hosts = [...new Set(input.redirect_uris.map(redirectSector))];
|
|
186
|
+
if (hosts.length !== 1 || !hosts[0])
|
|
187
|
+
return fail('A pairwise client whose redirect_uris span more than one host must register a sector_identifier_uri.', 'sector_identifier_uri');
|
|
188
|
+
sector = hosts[0];
|
|
189
|
+
}
|
|
190
|
+
const previous = input.existing?.subject_type === 'pairwise' ? input.existing.sector_identifier : null;
|
|
191
|
+
if (previous && previous !== sector)
|
|
192
|
+
return fail(`This change would move the client's sector from ${previous} to ${sector}, which changes every user's subject identifier. Register a sector_identifier_uri on ${previous} that lists the new redirect_uris instead.`, input.redirectUrisChanged && sectorUri === undefined ? 'redirect_uris' : 'sector_identifier_uri');
|
|
193
|
+
}
|
|
194
|
+
const value = { sector_identifier: sector };
|
|
195
|
+
if (input.subject_type !== undefined || !input.existing)
|
|
196
|
+
value.subject_type = subjectType;
|
|
197
|
+
if (sectorUri !== undefined)
|
|
198
|
+
value.sector_identifier_uri = sectorUri;
|
|
199
|
+
return { ok: true, value };
|
|
200
|
+
}
|
|
201
|
+
// ── software statements (RFC 7591 section 2.3) ─────────────────────
|
|
202
|
+
const REGISTERED = new Set(['iss', 'sub', 'aud', 'exp', 'nbf', 'iat', 'jti']);
|
|
203
|
+
/** The claims of a software statement signed by an approved publisher, or the registration error. */
|
|
204
|
+
async function verifySoftwareStatement(e, statement) {
|
|
205
|
+
const jwt = (0, jws_1.decodeJwt)(statement);
|
|
206
|
+
if (!jwt)
|
|
207
|
+
return { ok: false, error: 'invalid_software_statement', message: 'The software statement is not a JWT.' };
|
|
208
|
+
const trusted = (0, exports.dcrConfig)(e).software_statement_issuers.find((i) => i.issuer === jwt.payload.iss);
|
|
209
|
+
if (!trusted)
|
|
210
|
+
return { ok: false, error: 'unapproved_software_statement', message: 'The software statement publisher is not approved on this server.' };
|
|
211
|
+
const keys = await signingKeysOf(e, trusted, typeof jwt.header.kid === 'string' ? jwt.header.kid : undefined);
|
|
212
|
+
if (!keys.length)
|
|
213
|
+
return { ok: false, error: 'invalid_software_statement', message: 'The software publisher keys could not be loaded.' };
|
|
214
|
+
let ok = false;
|
|
215
|
+
if (oauth_adv_1.REQUEST_OBJECT_ALGS.includes(String(jwt.header.alg)))
|
|
216
|
+
for (const k of keys)
|
|
217
|
+
if ((ok = await (0, jws_1.verifyJws)(jwt, k)))
|
|
218
|
+
break;
|
|
219
|
+
const nowS = e.clock.now() / 1000;
|
|
220
|
+
const p = jwt.payload;
|
|
221
|
+
if (!ok || (typeof p.exp === 'number' && p.exp + CLOCK_SKEW_S <= nowS) || (typeof p.nbf === 'number' && p.nbf - CLOCK_SKEW_S > nowS))
|
|
222
|
+
return { ok: false, error: 'invalid_software_statement', message: 'The software statement signature or claims are invalid.' };
|
|
223
|
+
return { ok: true, claims: Object.fromEntries(Object.entries(p).filter(([k]) => !REGISTERED.has(k))) };
|
|
224
|
+
}
|
|
225
|
+
// ── response modes ──────────────────────────────────────────────────
|
|
226
|
+
const esc = (s) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
227
|
+
function formPost(redirectUri, params) {
|
|
228
|
+
const fields = Object.entries(params).map(([k, v]) => `<input type="hidden" name="${esc(k)}" value="${esc(v)}">`).join('\n');
|
|
229
|
+
const html = `<!doctype html>\n<html lang="en"><head><meta charset="utf-8"><title>Signing in...</title></head>\n<body><form method="post" action="${esc(redirectUri)}">\n${fields}\n<noscript><p>Your browser has JavaScript disabled. Continue to finish signing in.</p><button type="submit">Continue</button></noscript>\n</form><script>document.forms[0].submit();</script></body></html>`;
|
|
230
|
+
return { status: 200, raw: html, headers: { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store', pragma: 'no-cache', 'referrer-policy': 'no-referrer', 'x-frame-options': 'DENY' } };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Deliver an authorization response. `location` is the redirect the plain modes use (parameters in its query or
|
|
234
|
+
* fragment); `form_post` answers an auto-submitting form instead and a JARM mode packs the parameters into one signed
|
|
235
|
+
* `response` (iss, aud, exp = ten minutes) in the client's `authorization_signed_response_alg`.
|
|
236
|
+
*/
|
|
237
|
+
async function authReply(e, client, redirectUri, location, mode) {
|
|
238
|
+
const plain = { status: 302, headers: { location, 'cache-control': 'no-store' } };
|
|
239
|
+
if (!mode || !exports.EXT_RESPONSE_MODES.includes(mode))
|
|
240
|
+
return plain;
|
|
241
|
+
const u = new URL(location);
|
|
242
|
+
const inFragment = u.hash.length > 1;
|
|
243
|
+
const found = new URLSearchParams(inFragment ? u.hash.slice(1) : u.search);
|
|
244
|
+
if (!inFragment)
|
|
245
|
+
for (const k of new URL(redirectUri).searchParams.keys())
|
|
246
|
+
found.delete(k);
|
|
247
|
+
const params = Object.fromEntries(found.entries());
|
|
248
|
+
if (mode === 'form_post')
|
|
249
|
+
return formPost(redirectUri, params);
|
|
250
|
+
const claims = { ...params, iss: e.issuer, aud: client?.id, sub: undefined, token_use: undefined };
|
|
251
|
+
const jwt = await e.tokens.signClaimsAs(client?.authorization_signed_response_alg ?? null, claims, 600);
|
|
252
|
+
const base = new URL(redirectUri);
|
|
253
|
+
if (mode === 'form_post.jwt')
|
|
254
|
+
return formPost(redirectUri, { response: jwt });
|
|
255
|
+
// A response that may carry tokens never rides in the query: `query.jwt` and `jwt` answer in the fragment then.
|
|
256
|
+
const fragment = mode === 'fragment.jwt' || (inFragment && (mode === 'jwt' || mode === 'query.jwt'));
|
|
257
|
+
if (fragment)
|
|
258
|
+
base.hash = new URLSearchParams({ response: jwt }).toString();
|
|
259
|
+
else
|
|
260
|
+
base.searchParams.set('response', jwt);
|
|
261
|
+
return { status: 302, headers: { location: base.toString(), 'cache-control': 'no-store' } };
|
|
262
|
+
}
|
|
263
|
+
// ── client fields this module adds to a client's view ──────────────
|
|
264
|
+
function clientExtras(c) {
|
|
265
|
+
return {
|
|
266
|
+
...(c.authorization_signed_response_alg ? { authorization_signed_response_alg: c.authorization_signed_response_alg } : {}),
|
|
267
|
+
...(c.request_object_encryption_alg ? { request_object_encryption_alg: c.request_object_encryption_alg, request_object_encryption_enc: c.request_object_encryption_enc ?? 'A128CBC-HS256' } : {}),
|
|
268
|
+
...(c.id_token_signed_response_alg ? { id_token_signed_response_alg: c.id_token_signed_response_alg } : {}),
|
|
269
|
+
homepage_url: c.homepage_url ?? null,
|
|
270
|
+
subject_type: c.subject_type ?? 'public',
|
|
271
|
+
sector_identifier_uri: c.sector_identifier_uri ?? null,
|
|
272
|
+
sector_identifier: c.sector_identifier ?? null,
|
|
273
|
+
publisher_id: c.publisher_id ?? null,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/** Validate the fields this module adds to a client create/update body; only keys present are returned. */
|
|
277
|
+
function parseExtraClientFields(body) {
|
|
278
|
+
const out = {};
|
|
279
|
+
const bad = (message) => ({ ok: false, message });
|
|
280
|
+
if (body.authorization_signed_response_alg !== undefined) {
|
|
281
|
+
const v = body.authorization_signed_response_alg;
|
|
282
|
+
if (v === null)
|
|
283
|
+
out.authorization_signed_response_alg = null;
|
|
284
|
+
else if (typeof v !== 'string' || !exports.OP_SIGNING_ALGS.includes(v))
|
|
285
|
+
return bad(`authorization_signed_response_alg must be one of: ${exports.OP_SIGNING_ALGS.join(', ')}.`);
|
|
286
|
+
else
|
|
287
|
+
out.authorization_signed_response_alg = v;
|
|
288
|
+
}
|
|
289
|
+
if (body.id_token_signed_response_alg !== undefined) {
|
|
290
|
+
const v = body.id_token_signed_response_alg;
|
|
291
|
+
if (v === null)
|
|
292
|
+
out.id_token_signed_response_alg = null;
|
|
293
|
+
else if (typeof v !== 'string' || !exports.OP_SIGNING_ALGS.includes(v))
|
|
294
|
+
return bad(`id_token_signed_response_alg must be one of: ${exports.OP_SIGNING_ALGS.join(', ')}.`);
|
|
295
|
+
else
|
|
296
|
+
out.id_token_signed_response_alg = v;
|
|
297
|
+
}
|
|
298
|
+
if (body.request_object_encryption_alg !== undefined) {
|
|
299
|
+
const v = body.request_object_encryption_alg;
|
|
300
|
+
if (v === null)
|
|
301
|
+
out.request_object_encryption_alg = null;
|
|
302
|
+
else if (typeof v !== 'string' || !jwe_1.OP_DECRYPT_ALGS.includes(v))
|
|
303
|
+
return bad(`request_object_encryption_alg must be one of: ${jwe_1.OP_DECRYPT_ALGS.join(', ')}.`);
|
|
304
|
+
else
|
|
305
|
+
out.request_object_encryption_alg = v;
|
|
306
|
+
}
|
|
307
|
+
if (body.request_object_encryption_enc !== undefined) {
|
|
308
|
+
const v = body.request_object_encryption_enc;
|
|
309
|
+
if (v === null)
|
|
310
|
+
out.request_object_encryption_enc = null;
|
|
311
|
+
else if (typeof v !== 'string' || !jwe_1.JWE_ENCS.includes(v))
|
|
312
|
+
return bad(`request_object_encryption_enc must be one of: ${jwe_1.JWE_ENCS.join(', ')}.`);
|
|
313
|
+
else
|
|
314
|
+
out.request_object_encryption_enc = v;
|
|
315
|
+
}
|
|
316
|
+
if (body.homepage_url !== undefined) {
|
|
317
|
+
const v = body.homepage_url;
|
|
318
|
+
if (v === null || v === '')
|
|
319
|
+
out.homepage_url = null;
|
|
320
|
+
else {
|
|
321
|
+
let ok = typeof v === 'string' && v.length <= 2048;
|
|
322
|
+
try {
|
|
323
|
+
ok = ok && new URL(v).protocol === 'https:';
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
ok = false;
|
|
327
|
+
}
|
|
328
|
+
if (!ok)
|
|
329
|
+
return bad('homepage_url must be an absolute https URL.');
|
|
330
|
+
out.homepage_url = v;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return { ok: true, value: out };
|
|
334
|
+
}
|
|
335
|
+
function emu4AuthHandlers() {
|
|
336
|
+
return [
|
|
337
|
+
{
|
|
338
|
+
// Which publishers may sign a software statement, and whether dynamic registration demands one.
|
|
339
|
+
method: 'POST',
|
|
340
|
+
pattern: '/__emulator/oauth/dcr',
|
|
341
|
+
public: true,
|
|
342
|
+
handler: (c) => {
|
|
343
|
+
const cfg = (0, exports.dcrConfig)(c.engine);
|
|
344
|
+
if (c.body.require_software_statement !== undefined) {
|
|
345
|
+
if (typeof c.body.require_software_statement !== 'boolean')
|
|
346
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'require_software_statement must be true or false.', 'require_software_statement');
|
|
347
|
+
cfg.require_software_statement = c.body.require_software_statement;
|
|
348
|
+
}
|
|
349
|
+
const issuers = c.body.software_statement_issuers;
|
|
350
|
+
if (issuers !== undefined) {
|
|
351
|
+
if (!Array.isArray(issuers) || issuers.some((i) => !i || typeof i.issuer !== 'string' || (!i.jwks && !i.jwks_uri)))
|
|
352
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'software_statement_issuers must be a list of { issuer, jwks | jwks_uri }.', 'software_statement_issuers');
|
|
353
|
+
cfg.software_statement_issuers = issuers;
|
|
354
|
+
}
|
|
355
|
+
return { body: { ...cfg } };
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
// The audit rows the signing-key, publisher and delivery routes wrote (newest last); `action` narrows them.
|
|
359
|
+
{ method: 'GET', pattern: '/__emulator/oauth/audit', public: true, handler: (c) => ({ body: { object: 'list', data: (0, emu4_oauth_audit_1.auditOf)(c.engine).filter((r) => !c.query.get('action') || r.action === c.query.get('action')) } }) },
|
|
360
|
+
{ method: 'GET', pattern: '/__emulator/oauth/dcr', public: true, handler: (c) => ({ body: { ...(0, exports.dcrConfig)(c.engine) } }) },
|
|
361
|
+
];
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=emu4-oauth-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emu4-oauth-auth.js","sourceRoot":"","sources":["../../src/handlers/emu4-oauth-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Engine, RouteDef } from '../engine';
|
|
2
|
+
import type { Obj } from '../openapi';
|
|
3
|
+
/**
|
|
4
|
+
* Queued, retried delivery of back-channel logout tokens and CIBA ping/push notifications, on the engine clock.
|
|
5
|
+
*
|
|
6
|
+
* The first attempt is made at once (the request that caused the delivery waits for it); a failure is retried on the
|
|
7
|
+
* real schedule (5 s, 5 min, 30 min, 2 h, 5 h, 10 h: six attempts in all) when the clock reaches it. Time moves with
|
|
8
|
+
* `POST /__emulator/time/advance` (which runs everything that came due) or `POST /__emulator/oauth/deliveries/run`;
|
|
9
|
+
* every attempt is kept so a test can read what the receiver saw. An OIDC relying party that answers and refuses
|
|
10
|
+
* (4xx other than 408 and 429) is not retried (back-channel logout section 2.5), nor is a test send.
|
|
11
|
+
*/
|
|
12
|
+
export declare const RETRY_SCHEDULE_MS: number[];
|
|
13
|
+
export declare const MAX_ATTEMPTS: number;
|
|
14
|
+
interface Attempt {
|
|
15
|
+
attempt: number;
|
|
16
|
+
at: number;
|
|
17
|
+
http_status: number | null;
|
|
18
|
+
error: string | null;
|
|
19
|
+
success: boolean;
|
|
20
|
+
location: string | null;
|
|
21
|
+
}
|
|
22
|
+
interface Delivery {
|
|
23
|
+
id: string;
|
|
24
|
+
kind: 'backchannel_logout' | 'ciba_ping' | 'ciba_push';
|
|
25
|
+
client_id: string;
|
|
26
|
+
endpoint: string;
|
|
27
|
+
/** Logout: the user and session the token names. */
|
|
28
|
+
user_id: string | null;
|
|
29
|
+
sid: string | null;
|
|
30
|
+
/** CIBA: the request, the bearer token and the JSON body. */
|
|
31
|
+
request_id: string | null;
|
|
32
|
+
bearer: string | null;
|
|
33
|
+
payload: Obj | null;
|
|
34
|
+
is_test: boolean;
|
|
35
|
+
status: 'pending' | 'success' | 'failed';
|
|
36
|
+
attempt_number: number;
|
|
37
|
+
http_status: number | null;
|
|
38
|
+
latency_ms: number | null;
|
|
39
|
+
error: string | null;
|
|
40
|
+
location: string | null;
|
|
41
|
+
response_snippet: string | null;
|
|
42
|
+
next_retry_at: number | null;
|
|
43
|
+
attempted_at: number | null;
|
|
44
|
+
delivered_at: number | null;
|
|
45
|
+
created_at: number;
|
|
46
|
+
attempts: Attempt[];
|
|
47
|
+
}
|
|
48
|
+
/** Queue a back-channel logout for a client's session and make the first attempt. */
|
|
49
|
+
export declare function enqueueBackchannelLogout(e: Engine, client: Obj, input: {
|
|
50
|
+
userId: string;
|
|
51
|
+
sid: string;
|
|
52
|
+
}): Promise<Delivery>;
|
|
53
|
+
/** Queue a CIBA ping (only the `auth_req_id`) or push (the token response or the refusal) and make the first attempt. */
|
|
54
|
+
export declare function enqueueCiba(e: Engine, input: {
|
|
55
|
+
kind: 'ciba_ping' | 'ciba_push';
|
|
56
|
+
clientId: string;
|
|
57
|
+
requestId: string;
|
|
58
|
+
endpoint: string;
|
|
59
|
+
token: string;
|
|
60
|
+
payload: Obj;
|
|
61
|
+
}): Promise<Delivery>;
|
|
62
|
+
/**
|
|
63
|
+
* Everything the clock made due: push requests that expired undecided are announced (`expired_token`), then every
|
|
64
|
+
* delivery whose retry time has come is attempted, oldest first. Returns how many attempts ran.
|
|
65
|
+
*/
|
|
66
|
+
export declare function runDueDeliveries(e: Engine): Promise<number>;
|
|
67
|
+
export declare function emu4DeliveryHandlers(): RouteDef[];
|
|
68
|
+
export {};
|