@seamless-auth/oidc-provider 0.0.0-stage → 0.1.1

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.
Files changed (91) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +201 -0
  3. package/README.md +273 -2
  4. package/dist/adapter.d.ts +44 -0
  5. package/dist/adapter.js +249 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/apiClient.d.ts +35 -0
  8. package/dist/apiClient.js +217 -0
  9. package/dist/apiClient.js.map +1 -0
  10. package/dist/authRequirements.d.ts +37 -0
  11. package/dist/authRequirements.js +58 -0
  12. package/dist/authRequirements.js.map +1 -0
  13. package/dist/clientSecrets.d.ts +10 -0
  14. package/dist/clientSecrets.js +102 -0
  15. package/dist/clientSecrets.js.map +1 -0
  16. package/dist/configCache.d.ts +14 -0
  17. package/dist/configCache.js +45 -0
  18. package/dist/configCache.js.map +1 -0
  19. package/dist/createOidcEdge.d.ts +45 -0
  20. package/dist/createOidcEdge.js +132 -0
  21. package/dist/createOidcEdge.js.map +1 -0
  22. package/dist/deviceFlow.d.ts +53 -0
  23. package/dist/deviceFlow.js +168 -0
  24. package/dist/deviceFlow.js.map +1 -0
  25. package/dist/env.d.ts +16 -0
  26. package/dist/env.js +36 -0
  27. package/dist/env.js.map +1 -0
  28. package/dist/errors.d.ts +18 -0
  29. package/dist/errors.js +40 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/firstPartySession.d.ts +21 -0
  32. package/dist/firstPartySession.js +28 -0
  33. package/dist/firstPartySession.js.map +1 -0
  34. package/dist/hostedPages.d.ts +51 -0
  35. package/dist/hostedPages.js +172 -0
  36. package/dist/hostedPages.js.map +1 -0
  37. package/dist/index.d.ts +20 -0
  38. package/dist/index.js +20 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/interactions.d.ts +17 -0
  41. package/dist/interactions.js +209 -0
  42. package/dist/interactions.js.map +1 -0
  43. package/dist/jwtAccessTokens.d.ts +23 -0
  44. package/dist/jwtAccessTokens.js +125 -0
  45. package/dist/jwtAccessTokens.js.map +1 -0
  46. package/dist/logout.d.ts +22 -0
  47. package/dist/logout.js +86 -0
  48. package/dist/logout.js.map +1 -0
  49. package/dist/originGuard.d.ts +10 -0
  50. package/dist/originGuard.js +32 -0
  51. package/dist/originGuard.js.map +1 -0
  52. package/dist/pkce.d.ts +16 -0
  53. package/dist/pkce.js +32 -0
  54. package/dist/pkce.js.map +1 -0
  55. package/dist/providerConfig.d.ts +50 -0
  56. package/dist/providerConfig.js +305 -0
  57. package/dist/providerConfig.js.map +1 -0
  58. package/dist/rateLimit.d.ts +13 -0
  59. package/dist/rateLimit.js +36 -0
  60. package/dist/rateLimit.js.map +1 -0
  61. package/dist/refreshReuse.d.ts +3 -0
  62. package/dist/refreshReuse.js +56 -0
  63. package/dist/refreshReuse.js.map +1 -0
  64. package/dist/requestContext.d.ts +40 -0
  65. package/dist/requestContext.js +43 -0
  66. package/dist/requestContext.js.map +1 -0
  67. package/dist/resourceServers.d.ts +16 -0
  68. package/dist/resourceServers.js +59 -0
  69. package/dist/resourceServers.js.map +1 -0
  70. package/dist/resumeCookie.d.ts +8 -0
  71. package/dist/resumeCookie.js +46 -0
  72. package/dist/resumeCookie.js.map +1 -0
  73. package/dist/server.d.ts +2 -0
  74. package/dist/server.js +36 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/signingKey.d.ts +29 -0
  77. package/dist/signingKey.js +142 -0
  78. package/dist/signingKey.js.map +1 -0
  79. package/dist/startup.d.ts +4 -0
  80. package/dist/startup.js +19 -0
  81. package/dist/startup.js.map +1 -0
  82. package/dist/tokenAudit.d.ts +4 -0
  83. package/dist/tokenAudit.js +42 -0
  84. package/dist/tokenAudit.js.map +1 -0
  85. package/dist/tokenLifetimes.d.ts +31 -0
  86. package/dist/tokenLifetimes.js +51 -0
  87. package/dist/tokenLifetimes.js.map +1 -0
  88. package/dist/ui/assets/index-CydLXRvo.js +18 -0
  89. package/dist/ui/assets/index-y3LME-Gv.css +1 -0
  90. package/dist/ui/index.html +15 -0
  91. package/package.json +115 -4
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright © 2026 Fells Code, LLC
3
+ * Licensed under the Apache License, Version 2.0
4
+ * See LICENSE file in the project root for full license information
5
+ */
6
+ /**
7
+ * The library scopes its resume cookie to `Path=/authorize/<uid>`, and a `__Host-` cookie
8
+ * must have `Path=/`. This moves it to `Path=/` so a sibling subdomain cannot plant one, and,
9
+ * since one browser now holds a single resume cookie, refuses to resume an authorization
10
+ * whose uid is not the cookie's (the library would otherwise resume the cookie's).
11
+ */
12
+ export function hostOnlyResumeCookie(cookieName, resumePath) {
13
+ const pattern = new RegExp(`^${escapeRegExp(resumePath)}/([^/]+)$`);
14
+ const prefixes = [`${cookieName}=`, `${cookieName}.sig=`];
15
+ return async (ctx, next) => {
16
+ const match = pattern.exec(ctx.path);
17
+ if (match && ctx.method === 'GET') {
18
+ const value = ctx.cookies.get(cookieName, { signed: true });
19
+ if (value !== undefined && value !== decodeURIComponent(match[1])) {
20
+ dropRequestCookie(ctx.req.headers, prefixes);
21
+ }
22
+ }
23
+ await next();
24
+ const header = ctx.res.getHeader('set-cookie');
25
+ if (!Array.isArray(header)) {
26
+ return;
27
+ }
28
+ ctx.res.setHeader('set-cookie', header.map((line) => prefixes.some((prefix) => line.startsWith(prefix))
29
+ ? line.replace(/;\s*path=[^;]*/i, '; path=/')
30
+ : line));
31
+ };
32
+ }
33
+ function dropRequestCookie(headers, prefixes) {
34
+ if (!headers.cookie) {
35
+ return;
36
+ }
37
+ headers.cookie = headers.cookie
38
+ .split(';')
39
+ .map((part) => part.trim())
40
+ .filter((part) => !prefixes.some((prefix) => part.startsWith(prefix)))
41
+ .join('; ');
42
+ }
43
+ function escapeRegExp(value) {
44
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
45
+ }
46
+ //# sourceMappingURL=resumeCookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumeCookie.js","sourceRoot":"","sources":["../src/resumeCookie.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,UAAkB;IACzE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,GAAG,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;IAE1D,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;gBACnE,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,SAAS,CACf,YAAY,EACZ,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC;YAC7C,CAAC,CAAC,IAAI,CACT,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAwC,EAAE,QAAkB;IACrF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;SAC5B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/server.js ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Copyright © 2026 Fells Code, LLC
4
+ * Licensed under the Apache License, Version 2.0
5
+ * See LICENSE file in the project root for full license information
6
+ */
7
+ import express from 'express';
8
+ import { createOidcEdge } from './createOidcEdge.js';
9
+ import { parseEnv } from './env.js';
10
+ async function main() {
11
+ const env = parseEnv();
12
+ const edge = await createOidcEdge({
13
+ apiUrl: env.SEAMLESS_API_URL,
14
+ ...(env.SEAMLESS_API_ISSUER ? { apiIssuer: env.SEAMLESS_API_ISSUER } : {}),
15
+ serviceSecret: env.SEAMLESS_OIDC_SERVICE_TOKEN,
16
+ ...(env.SEAMLESS_JWKS_KID ? { serviceTokenKid: env.SEAMLESS_JWKS_KID } : {}),
17
+ cookieKeys: env.OIDC_COOKIE_KEYS,
18
+ adapterCookieSecret: env.SEAMLESS_COOKIE_SECRET,
19
+ trustProxy: env.TRUST_PROXY,
20
+ });
21
+ const app = express();
22
+ app.disable('x-powered-by');
23
+ app.set('trust proxy', env.TRUST_PROXY ? 1 : false);
24
+ app.get('/healthz', (_req, res) => {
25
+ res.json({ status: 'ok' });
26
+ });
27
+ app.use(edge.router);
28
+ app.listen(env.PORT, () => {
29
+ console.log(`Seamless OpenID Provider listening on ${env.PORT}, issuer ${edge.issuer}`);
30
+ });
31
+ }
32
+ main().catch((error) => {
33
+ console.error(error instanceof Error ? error.message : error);
34
+ process.exit(1);
35
+ });
36
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,gBAAgB;QAC5B,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,aAAa,EAAE,GAAG,CAAC,2BAA2B;QAC9C,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,UAAU,EAAE,GAAG,CAAC,gBAAgB;QAChC,mBAAmB,EAAE,GAAG,CAAC,sBAAsB;QAC/C,UAAU,EAAE,GAAG,CAAC,WAAW;KAC5B,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAErB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,yCAAyC,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type KeyObject } from 'node:crypto';
2
+ import type { OidcJwksResponse, OidcPublicJwk, OidcSignKind } from '@seamless-auth/types';
3
+ import { ExternalSigningKey } from 'oidc-provider';
4
+ import type { OidcApiClient } from './apiClient.js';
5
+ export declare class UnsignableTokenError extends Error {
6
+ constructor(reason: string);
7
+ }
8
+ type JsonObject = Record<string, unknown>;
9
+ interface Classified {
10
+ kind: OidcSignKind;
11
+ clientId: string;
12
+ }
13
+ export declare function classifyToken(header: JsonObject, payload: JsonObject, sessionId: string | undefined): Classified;
14
+ /**
15
+ * A provider key whose private half stays in the API. `sign` sends the JWS signing
16
+ * input to `POST /oidc/sign`, which checks the claims before it signs.
17
+ */
18
+ export declare class ApiSigningKey extends ExternalSigningKey {
19
+ #private;
20
+ constructor(jwk: OidcPublicJwk, client: OidcApiClient, active: boolean);
21
+ get kid(): string;
22
+ get alg(): string;
23
+ get active(): boolean;
24
+ keyObject(): KeyObject;
25
+ sign(data: Uint8Array): Promise<Uint8Array>;
26
+ }
27
+ /** The active key comes first, which is the one the library selects to sign with. */
28
+ export declare function signingKeysFrom(jwks: OidcJwksResponse, client: OidcApiClient): ApiSigningKey[];
29
+ export {};
@@ -0,0 +1,142 @@
1
+ /*
2
+ * Copyright © 2026 Fells Code, LLC
3
+ * Licensed under the Apache License, Version 2.0
4
+ * See LICENSE file in the project root for full license information
5
+ */
6
+ import { createPublicKey } from 'node:crypto';
7
+ import { errors, ExternalSigningKey } from 'oidc-provider';
8
+ import { DEVICE_CODE_GRANT } from './deviceFlow.js';
9
+ import { OidcSignRefusedError } from './errors.js';
10
+ import { currentRequestContext } from './requestContext.js';
11
+ export class UnsignableTokenError extends Error {
12
+ constructor(reason) {
13
+ super(`This service does not sign this token: ${reason}`);
14
+ this.name = 'UnsignableTokenError';
15
+ }
16
+ }
17
+ function decodePart(part) {
18
+ if (!part) {
19
+ throw new UnsignableTokenError('malformed signing input');
20
+ }
21
+ const value = JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
22
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
23
+ throw new UnsignableTokenError('malformed signing input');
24
+ }
25
+ return value;
26
+ }
27
+ function stringClaim(payload, name) {
28
+ const value = payload[name];
29
+ return typeof value === 'string' && value ? value : undefined;
30
+ }
31
+ export function classifyToken(header, payload, sessionId) {
32
+ const typ = header.typ;
33
+ if (typ === 'logout+jwt') {
34
+ throw new UnsignableTokenError('the API sends back-channel logout tokens itself');
35
+ }
36
+ if (typ === 'at+jwt') {
37
+ const clientId = stringClaim(payload, 'client_id');
38
+ if (!clientId) {
39
+ throw new UnsignableTokenError('access token without client_id');
40
+ }
41
+ const kind = !sessionId && stringClaim(payload, 'sub') === clientId
42
+ ? 'client_credentials'
43
+ : 'access_token';
44
+ return { kind, clientId };
45
+ }
46
+ if (typ === undefined) {
47
+ const aud = payload.aud;
48
+ const firstAud = Array.isArray(aud) ? aud[0] : aud;
49
+ const clientId = stringClaim(payload, 'azp') ?? (typeof firstAud === 'string' ? firstAud : undefined);
50
+ if (!clientId) {
51
+ throw new UnsignableTokenError('ID token without an audience');
52
+ }
53
+ return { kind: 'id_token', clientId };
54
+ }
55
+ throw new UnsignableTokenError(`unexpected typ ${String(typ)}`);
56
+ }
57
+ /**
58
+ * A provider key whose private half stays in the API. `sign` sends the JWS signing
59
+ * input to `POST /oidc/sign`, which checks the claims before it signs.
60
+ */
61
+ export class ApiSigningKey extends ExternalSigningKey {
62
+ #kid;
63
+ #alg;
64
+ #keyObject;
65
+ #client;
66
+ #active;
67
+ constructor(jwk, client, active) {
68
+ super();
69
+ this.#kid = jwk.kid;
70
+ this.#alg = jwk.alg;
71
+ this.#keyObject = createPublicKey({ key: jwk, format: 'jwk' });
72
+ this.#client = client;
73
+ this.#active = active;
74
+ }
75
+ get kid() {
76
+ return this.#kid;
77
+ }
78
+ get alg() {
79
+ return this.#alg;
80
+ }
81
+ get active() {
82
+ return this.#active;
83
+ }
84
+ keyObject() {
85
+ return this.#keyObject;
86
+ }
87
+ async sign(data) {
88
+ if (!this.#active) {
89
+ throw new UnsignableTokenError(`key ${this.#kid} is published but not active`);
90
+ }
91
+ const signingInput = Buffer.from(data).toString('utf8');
92
+ const [headerPart, payloadPart, extra] = signingInput.split('.');
93
+ if (extra !== undefined) {
94
+ throw new UnsignableTokenError('malformed signing input');
95
+ }
96
+ const header = decodePart(headerPart);
97
+ if (header.alg !== this.#alg) {
98
+ throw new UnsignableTokenError(`alg ${String(header.alg)} does not match key ${this.#kid}`);
99
+ }
100
+ const sessionId = currentRequestContext()?.sessionId;
101
+ const { kind, clientId } = classifyToken(header, decodePart(payloadPart), sessionId);
102
+ const context = currentRequestContext();
103
+ const { signature } = await this.#signOrRefuse({
104
+ kind,
105
+ kid: this.#kid,
106
+ clientId,
107
+ signingInput,
108
+ ...(sessionId ? { sessionId } : {}),
109
+ ...(kind === 'client_credentials'
110
+ ? {}
111
+ : { grantType: context?.deviceFlow ? DEVICE_CODE_GRANT : 'authorization_code' }),
112
+ });
113
+ return Buffer.from(signature, 'base64url');
114
+ }
115
+ // A session that ended while the request ran (a concurrent refresh found reuse, say) is
116
+ // a grant that is no longer valid, which the client should hear as such, not a 500.
117
+ async #signOrRefuse(body) {
118
+ try {
119
+ return await this.#client.sign(body);
120
+ }
121
+ catch (error) {
122
+ if (error instanceof OidcSignRefusedError && error.code === 'session_revoked') {
123
+ throw new errors.InvalidGrant('the session behind this grant has ended');
124
+ }
125
+ throw error;
126
+ }
127
+ }
128
+ }
129
+ /** The active key comes first, which is the one the library selects to sign with. */
130
+ export function signingKeysFrom(jwks, client) {
131
+ const active = jwks.keys.find((key) => key.kid === jwks.activeKid);
132
+ if (!active) {
133
+ throw new Error(`The API's active provider key ${jwks.activeKid} is not in its JWKS`);
134
+ }
135
+ return [
136
+ new ApiSigningKey(active, client, true),
137
+ ...jwks.keys
138
+ .filter((key) => key.kid !== jwks.activeKid)
139
+ .map((key) => new ApiSigningKey(key, client, false)),
140
+ ];
141
+ }
142
+ //# sourceMappingURL=signingKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signingKey.js","sourceRoot":"","sources":["../src/signingKey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type OidcEdgeConfigResponse } from '@seamless-auth/types';
2
+ import type { OidcApiClient } from './apiClient.js';
3
+ /** Refuses to start against an API with the provider off or on another contract version. */
4
+ export declare function checkApiCompatibility(client: OidcApiClient): Promise<OidcEdgeConfigResponse>;
@@ -0,0 +1,19 @@
1
+ /*
2
+ * Copyright © 2026 Fells Code, LLC
3
+ * Licensed under the Apache License, Version 2.0
4
+ * See LICENSE file in the project root for full license information
5
+ */
6
+ import { OIDC_EDGE_CONTRACT_VERSION } from '@seamless-auth/types';
7
+ import { OidcContractMismatchError, OidcProviderDisabledError } from './errors.js';
8
+ /** Refuses to start against an API with the provider off or on another contract version. */
9
+ export async function checkApiCompatibility(client) {
10
+ const config = await client.config();
11
+ if (!config) {
12
+ throw new OidcProviderDisabledError();
13
+ }
14
+ if (config.contractVersion !== OIDC_EDGE_CONTRACT_VERSION) {
15
+ throw new OidcContractMismatchError(config.contractVersion, OIDC_EDGE_CONTRACT_VERSION);
16
+ }
17
+ return config;
18
+ }
19
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,0BAA0B,EAA+B,MAAM,sBAAsB,CAAC;AAG/F,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEnF,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,yBAAyB,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,0BAA0B,EAAE,CAAC;QAC1D,MAAM,IAAI,yBAAyB,CAAC,MAAM,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { KoaContextWithOIDC } from 'oidc-provider';
2
+ import type { OidcApiClient } from './apiClient.js';
3
+ /** Records a token an app revoked (RFC 7009) in the API's audit log. */
4
+ export declare function auditRevocations(client: OidcApiClient): (ctx: KoaContextWithOIDC, next: () => Promise<unknown>) => Promise<void>;
@@ -0,0 +1,42 @@
1
+ /*
2
+ * Copyright © 2026 Fells Code, LLC
3
+ * Licensed under the Apache License, Version 2.0
4
+ * See LICENSE file in the project root for full license information
5
+ */
6
+ import { currentRequestContext } from './requestContext.js';
7
+ const REVOCABLE = ['RefreshToken', 'AccessToken', 'ClientCredentials'];
8
+ /** Records a token an app revoked (RFC 7009) in the API's audit log. */
9
+ export function auditRevocations(client) {
10
+ return async (ctx, next) => {
11
+ await next();
12
+ if (ctx.oidc?.route !== 'revocation' || ctx.status !== 200) {
13
+ return;
14
+ }
15
+ const entities = ctx.oidc.entities;
16
+ const kind = REVOCABLE.find((name) => entities[name]);
17
+ const token = kind ? entities[kind] : undefined;
18
+ const context = currentRequestContext();
19
+ // The library answers 200 without revoking a public client's request for another
20
+ // client's token, so only a token the caller owns was revoked.
21
+ if (!kind || !token || !context || token.clientId !== ctx.oidc.client?.clientId) {
22
+ return;
23
+ }
24
+ try {
25
+ await client.event({
26
+ type: 'token_revoked',
27
+ correlationId: context.correlationId,
28
+ occurredAt: new Date().toISOString(),
29
+ ...(token.clientId ? { clientId: token.clientId } : {}),
30
+ ...(token.accountId && context.sessionId
31
+ ? { userId: token.accountId, sessionId: context.sessionId }
32
+ : {}),
33
+ ...(token.grantId ? { grantId: token.grantId } : {}),
34
+ metadata: { tokenType: kind },
35
+ });
36
+ }
37
+ catch (error) {
38
+ console.error(`[oidc-provider] could not record a token revocation: ${String(error)}`);
39
+ }
40
+ };
41
+ }
42
+ //# sourceMappingURL=tokenAudit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenAudit.js","sourceRoot":"","sources":["../src/tokenAudit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,mBAAmB,CAAU,CAAC;AAEhF,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO,KAAK,EAAE,GAAuB,EAAE,IAA4B,EAAE,EAAE;QACrE,MAAM,IAAI,EAAE,CAAC;QACb,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAGzB,CAAC;QACF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChD,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;QACxC,iFAAiF;QACjF,+DAA+D;QAC/D,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YAChF,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,eAAe;gBACrB,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;oBACtC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;oBAC3D,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wDAAwD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { KoaContextWithOIDC } from 'oidc-provider';
2
+ export declare const CLIENT_TTL_PROPERTIES: {
3
+ readonly accessToken: "urn:seamless:access_token_ttl";
4
+ readonly idToken: "urn:seamless:id_token_ttl";
5
+ readonly refreshToken: "urn:seamless:refresh_token_ttl";
6
+ };
7
+ export declare const DEFAULT_ID_TOKEN_TTL = 600;
8
+ export declare const DEFAULT_REFRESH_TOKEN_TTL: number;
9
+ type ClientLike = Record<string, unknown> & {
10
+ applicationType?: string;
11
+ clientAuthMethod?: string;
12
+ };
13
+ /** The resource's lifetime, the application's, or the default: the shortest that is set. */
14
+ export declare function accessTokenTtl(_ctx: KoaContextWithOIDC, token: {
15
+ resourceServer?: {
16
+ accessTokenTTL?: number;
17
+ };
18
+ }, client: ClientLike): number;
19
+ export declare function idTokenTtl(_ctx: KoaContextWithOIDC, _token: unknown, client: ClientLike): number;
20
+ /** At least as long as the application's refresh tokens, which the grant must outlive. */
21
+ export declare function grantLifetime(client: unknown): number;
22
+ export declare function grantTtl(ctx: KoaContextWithOIDC | undefined): number;
23
+ /**
24
+ * The application's lifetime, or the library's 14 days. As the library does, a rotated token
25
+ * for a browser app that cannot bind it to a key keeps what was left of the one it replaces,
26
+ * so rotating never extends how long a stolen chain lives.
27
+ */
28
+ export declare function refreshTokenTtl(ctx: KoaContextWithOIDC | undefined, token: {
29
+ isSenderConstrained: () => boolean;
30
+ }, client: ClientLike): number;
31
+ export {};
@@ -0,0 +1,51 @@
1
+ /*
2
+ * Copyright © 2026 Fells Code, LLC
3
+ * Licensed under the Apache License, Version 2.0
4
+ * See LICENSE file in the project root for full license information
5
+ */
6
+ import { DEFAULT_ACCESS_TOKEN_TTL } from './resourceServers.js';
7
+ export const CLIENT_TTL_PROPERTIES = {
8
+ accessToken: 'urn:seamless:access_token_ttl',
9
+ idToken: 'urn:seamless:id_token_ttl',
10
+ refreshToken: 'urn:seamless:refresh_token_ttl',
11
+ };
12
+ export const DEFAULT_ID_TOKEN_TTL = 600;
13
+ export const DEFAULT_REFRESH_TOKEN_TTL = 14 * 24 * 60 * 60;
14
+ function clientTtl(client, property) {
15
+ const value = client?.[property];
16
+ return typeof value === 'number' && value > 0 ? value : undefined;
17
+ }
18
+ /** The resource's lifetime, the application's, or the default: the shortest that is set. */
19
+ export function accessTokenTtl(_ctx, token, client) {
20
+ const ttls = [
21
+ token.resourceServer?.accessTokenTTL,
22
+ clientTtl(client, CLIENT_TTL_PROPERTIES.accessToken),
23
+ ].filter((ttl) => ttl !== undefined);
24
+ return ttls.length > 0 ? Math.min(...ttls) : DEFAULT_ACCESS_TOKEN_TTL;
25
+ }
26
+ export function idTokenTtl(_ctx, _token, client) {
27
+ return clientTtl(client, CLIENT_TTL_PROPERTIES.idToken) ?? DEFAULT_ID_TOKEN_TTL;
28
+ }
29
+ /** At least as long as the application's refresh tokens, which the grant must outlive. */
30
+ export function grantLifetime(client) {
31
+ return Math.max(DEFAULT_REFRESH_TOKEN_TTL, clientTtl(client, CLIENT_TTL_PROPERTIES.refreshToken) ?? 0);
32
+ }
33
+ export function grantTtl(ctx) {
34
+ return grantLifetime(ctx?.oidc?.client);
35
+ }
36
+ /**
37
+ * The application's lifetime, or the library's 14 days. As the library does, a rotated token
38
+ * for a browser app that cannot bind it to a key keeps what was left of the one it replaces,
39
+ * so rotating never extends how long a stolen chain lives.
40
+ */
41
+ export function refreshTokenTtl(ctx, token, client) {
42
+ const rotated = ctx?.oidc?.entities.RotatedRefreshToken;
43
+ if (rotated &&
44
+ client.applicationType === 'web' &&
45
+ client.clientAuthMethod === 'none' &&
46
+ !token.isSenderConstrained()) {
47
+ return rotated.remainingTTL;
48
+ }
49
+ return clientTtl(client, CLIENT_TTL_PROPERTIES.refreshToken) ?? DEFAULT_REFRESH_TOKEN_TTL;
50
+ }
51
+ //# sourceMappingURL=tokenLifetimes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenLifetimes.js","sourceRoot":"","sources":["../src/tokenLifetimes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EAAE,2BAA2B;IACpC,YAAY,EAAE,gCAAgC;CACtC,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAO3D,SAAS,SAAS,CAAC,MAA8B,EAAE,QAAgB;IACjE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAC5B,IAAwB,EACxB,KAAuD,EACvD,MAAkB;IAElB,MAAM,IAAI,GAAG;QACX,KAAK,CAAC,cAAc,EAAE,cAAc;QACpC,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,WAAW,CAAC;KACrD,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAwB,EAAE,MAAe,EAAE,MAAkB;IACtF,OAAO,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC;AAClF,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,IAAI,CAAC,GAAG,CACb,yBAAyB,EACzB,SAAS,CAAC,MAAgC,EAAE,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,CACrF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAmC;IAC1D,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAmC,EACnC,KAA6C,EAC7C,MAAkB;IAElB,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,mBAAmB,CAAC;IACxD,IACE,OAAO;QACP,MAAM,CAAC,eAAe,KAAK,KAAK;QAChC,MAAM,CAAC,gBAAgB,KAAK,MAAM;QAClC,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAC5B,CAAC;QACD,OAAO,OAAO,CAAC,YAAY,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,YAAY,CAAC,IAAI,yBAAyB,CAAC;AAC5F,CAAC"}