@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 @@
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { KoaContextWithOIDC } from 'oidc-provider';
2
+ import type { ApiSigningKey } from './signingKey.js';
3
+ /**
4
+ * Maps a JWT access token this provider signed back to its `jti`. Only RS256, the one alg the
5
+ * API signs with, and only after the signature checks out against a published provider key.
6
+ */
7
+ export declare function createJwtAccessTokenLookup(keys: readonly ApiSigningKey[], issuer: string): (value: string) => string | undefined;
8
+ /**
9
+ * The library refuses JWTs at introspection and revocation, because it looks tokens up by the
10
+ * presented value and stores a JWT access token under its `jti`. A resource server holding a
11
+ * JWT is the one that most needs to see a revoked session, so the `token` parameter is swapped
12
+ * for the `jti` of a JWT this provider signed before the library reads the body.
13
+ */
14
+ export declare function acceptJwtAccessTokens(lookup: (value: string) => string | undefined, paths: string[]): (ctx: KoaContextWithOIDC, next: () => Promise<unknown>) => Promise<unknown>;
15
+ /**
16
+ * The library keeps no record of a JWT access token, so nothing could revoke one or report it
17
+ * inactive once its session ends. This stores one under the `jti`, bound to the session like
18
+ * every other record, and marked `jwt` so that only a request presenting the verified JWT
19
+ * itself can load it (the `jti` alone is not a bearer token).
20
+ */
21
+ export declare function storeJwtAccessToken(_ctx: unknown, token: object, jwt: {
22
+ payload: Record<string, unknown>;
23
+ }): Promise<void>;
@@ -0,0 +1,125 @@
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 { verify } from 'node:crypto';
7
+ import { currentRequestContext } from './requestContext.js';
8
+ function decode(segment) {
9
+ try {
10
+ const value = JSON.parse(Buffer.from(segment, 'base64url').toString('utf8'));
11
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
12
+ ? value
13
+ : undefined;
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ /**
20
+ * Maps a JWT access token this provider signed back to its `jti`. Only RS256, the one alg the
21
+ * API signs with, and only after the signature checks out against a published provider key.
22
+ */
23
+ export function createJwtAccessTokenLookup(keys, issuer) {
24
+ return (value) => {
25
+ const [header, payload, signature, extra] = value.split('.');
26
+ if (!header || !payload || !signature || extra !== undefined) {
27
+ return undefined;
28
+ }
29
+ const parsedHeader = decode(header);
30
+ if (parsedHeader?.typ !== 'at+jwt' || parsedHeader.alg !== 'RS256') {
31
+ return undefined;
32
+ }
33
+ const key = keys.find((candidate) => candidate.kid === parsedHeader.kid);
34
+ if (!key ||
35
+ !verify('sha256', Buffer.from(`${header}.${payload}`), key.keyObject(), Buffer.from(signature, 'base64url'))) {
36
+ return undefined;
37
+ }
38
+ const claims = decode(payload);
39
+ return claims?.iss === issuer && typeof claims.jti === 'string' && claims.jti
40
+ ? claims.jti
41
+ : undefined;
42
+ };
43
+ }
44
+ // The library's own limit for these bodies.
45
+ const BODY_LIMIT = 56 * 1024;
46
+ // Matches no stored token (stored ids are never dotted) and does not parse as a JWT, so the
47
+ // library answers it as any unknown token: inactive, or revoked with nothing to revoke.
48
+ const UNKNOWN_TOKEN = 'unknown.token';
49
+ async function readBody(stream) {
50
+ const chunks = [];
51
+ let size = 0;
52
+ for await (const chunk of stream) {
53
+ size += chunk.length;
54
+ if (size > BODY_LIMIT) {
55
+ return undefined;
56
+ }
57
+ chunks.push(chunk);
58
+ }
59
+ return Buffer.concat(chunks).toString('utf8');
60
+ }
61
+ /**
62
+ * The library refuses JWTs at introspection and revocation, because it looks tokens up by the
63
+ * presented value and stores a JWT access token under its `jti`. A resource server holding a
64
+ * JWT is the one that most needs to see a revoked session, so the `token` parameter is swapped
65
+ * for the `jti` of a JWT this provider signed before the library reads the body.
66
+ */
67
+ export function acceptJwtAccessTokens(lookup, paths) {
68
+ const routes = new Set(paths);
69
+ return async (ctx, next) => {
70
+ if (ctx.method !== 'POST' ||
71
+ !routes.has(ctx.path) ||
72
+ !ctx.is('application/x-www-form-urlencoded')) {
73
+ return next();
74
+ }
75
+ const request = ctx.req;
76
+ // verifyClientSecrets may have read the body already and left it here.
77
+ const body = request.readable
78
+ ? await readBody(request)
79
+ : Buffer.isBuffer(request.body) || typeof request.body === 'string'
80
+ ? request.body.toString()
81
+ : undefined;
82
+ if (body === undefined) {
83
+ ctx.status = 413;
84
+ ctx.body = { error: 'invalid_request', error_description: 'request entity too large' };
85
+ return undefined;
86
+ }
87
+ const params = new URLSearchParams(body);
88
+ const token = params.get('token');
89
+ if (token?.includes('.')) {
90
+ const jti = lookup(token);
91
+ params.set('token', jti ?? UNKNOWN_TOKEN);
92
+ const context = currentRequestContext();
93
+ if (jti && context) {
94
+ context.verifiedJwtTokenId = jti;
95
+ }
96
+ }
97
+ // The library reads an already consumed body from here.
98
+ request.body = params.toString();
99
+ return next();
100
+ };
101
+ }
102
+ /**
103
+ * The library keeps no record of a JWT access token, so nothing could revoke one or report it
104
+ * inactive once its session ends. This stores one under the `jti`, bound to the session like
105
+ * every other record, and marked `jwt` so that only a request presenting the verified JWT
106
+ * itself can load it (the `jti` alone is not a bearer token).
107
+ */
108
+ export async function storeJwtAccessToken(_ctx, token, jwt) {
109
+ const record = token;
110
+ const { adapter, IN_PAYLOAD } = token.constructor;
111
+ const { jti, iat, exp } = jwt.payload;
112
+ const now = Math.floor(Date.now() / 1000);
113
+ if (typeof jti !== 'string' || typeof exp !== 'number' || exp <= now) {
114
+ throw new Error('A JWT access token without a jti or a future exp cannot be stored');
115
+ }
116
+ const payload = { format: 'jwt' };
117
+ for (const key of IN_PAYLOAD) {
118
+ if (record[key] !== undefined) {
119
+ payload[key] = record[key];
120
+ }
121
+ }
122
+ Object.assign(payload, { jti, iat, exp });
123
+ await adapter.upsert(jti, payload, exp - now);
124
+ }
125
+ //# sourceMappingURL=jwtAccessTokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtAccessTokens.js","sourceRoot":"","sources":["../src/jwtAccessTokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type Provider from 'oidc-provider';
2
+ import type { KoaContextWithOIDC } from 'oidc-provider';
3
+ import type { OidcApiClient } from './apiClient.js';
4
+ import type { HostedPageRenderer } from './hostedPages.js';
5
+ /** The library's logout confirmation and signed-out pages, rendered by the hosted UI. */
6
+ export declare function createLogoutPages(render: HostedPageRenderer): {
7
+ logoutSource(ctx: KoaContextWithOIDC): Promise<void>;
8
+ postLogoutSuccessSource(ctx: KoaContextWithOIDC): Promise<void>;
9
+ };
10
+ /**
11
+ * The API sends back-channel logout itself (ADR D3), for every way a session ends, so the
12
+ * library's own sender is switched off. The feature stays on for what else it does: the
13
+ * client metadata, discovery and `sid` in ID tokens.
14
+ */
15
+ export declare function leaveBackchannelLogoutToApi(provider: Provider): void;
16
+ /**
17
+ * "Sign out" ends the provider session, which the library does, and the first-party session
18
+ * it was made under, which this does. That revocation is what tells every other app the user
19
+ * signed in to through it. The adapter cookies are cleared too, so the hosted pages do not
20
+ * offer a session that no longer exists.
21
+ */
22
+ export declare function endFirstPartySessionOnLogout(client: OidcApiClient, adapterCookies: string[]): (ctx: KoaContextWithOIDC, next: () => Promise<unknown>) => Promise<void>;
package/dist/logout.js ADDED
@@ -0,0 +1,86 @@
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
+ function send(ctx, { html, headers }) {
8
+ ctx.set(headers);
9
+ ctx.type = 'html';
10
+ ctx.body = html;
11
+ }
12
+ /** The library's logout confirmation and signed-out pages, rendered by the hosted UI. */
13
+ export function createLogoutPages(render) {
14
+ return {
15
+ async logoutSource(ctx) {
16
+ const { oidc } = ctx;
17
+ const postLogout = oidc.params?.post_logout_redirect_uri;
18
+ send(ctx, await render({
19
+ view: 'logout',
20
+ action: oidc.urlFor('end_session_confirm'),
21
+ xsrf: oidc.session?.state?.secret,
22
+ clientName: oidc.client ? (oidc.client.clientName ?? oidc.client.clientId) : null,
23
+ }, typeof postLogout === 'string' ? [postLogout] : []));
24
+ },
25
+ async postLogoutSuccessSource(ctx) {
26
+ const client = ctx.oidc.client;
27
+ send(ctx, await render({
28
+ view: 'signed_out',
29
+ clientName: client ? (client.clientName ?? client.clientId) : null,
30
+ }));
31
+ },
32
+ };
33
+ }
34
+ /**
35
+ * The API sends back-channel logout itself (ADR D3), for every way a session ends, so the
36
+ * library's own sender is switched off. The feature stays on for what else it does: the
37
+ * client metadata, discovery and `sid` in ID tokens.
38
+ */
39
+ export function leaveBackchannelLogoutToApi(provider) {
40
+ provider.Client.prototype.backchannelLogout = async () => { };
41
+ }
42
+ /**
43
+ * "Sign out" ends the provider session, which the library does, and the first-party session
44
+ * it was made under, which this does. That revocation is what tells every other app the user
45
+ * signed in to through it. The adapter cookies are cleared too, so the hosted pages do not
46
+ * offer a session that no longer exists.
47
+ */
48
+ export function endFirstPartySessionOnLogout(client, adapterCookies) {
49
+ return async (ctx, next) => {
50
+ await next();
51
+ if (ctx.oidc?.route !== 'end_session_confirm' || ctx.status !== 303) {
52
+ return;
53
+ }
54
+ const everywhere = Boolean(ctx.oidc.params?.logout);
55
+ const context = currentRequestContext();
56
+ if (everywhere) {
57
+ for (const name of adapterCookies) {
58
+ ctx.cookies.set(name, null, { path: '/', secure: true, httpOnly: true, sameSite: 'lax' });
59
+ }
60
+ }
61
+ if (!context?.sessionId) {
62
+ return;
63
+ }
64
+ const clientId = ctx.oidc.client?.clientId;
65
+ try {
66
+ if (everywhere) {
67
+ await client.revokeSession(context.sessionId, {
68
+ reason: 'provider_logout',
69
+ correlationId: context.correlationId,
70
+ });
71
+ }
72
+ await client.event({
73
+ type: 'end_session',
74
+ correlationId: context.correlationId,
75
+ occurredAt: new Date().toISOString(),
76
+ sessionId: context.sessionId,
77
+ ...(clientId ? { clientId } : {}),
78
+ metadata: { scope: everywhere ? 'session' : 'client' },
79
+ });
80
+ }
81
+ catch (error) {
82
+ console.error(`[oidc-provider] could not end the first-party session: ${String(error)}`);
83
+ }
84
+ };
85
+ }
86
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RequestHandler } from 'express';
2
+ /**
3
+ * Refuses a state-changing request unless the browser says it came from this origin.
4
+ *
5
+ * RPs often sit on sibling subdomains, which are same-site, so `SameSite=Lax` cookies still
6
+ * ride their requests and `same-site` is not good enough here. `Sec-Fetch-Site` must be
7
+ * `same-origin` when present, `Origin` must be this origin when present, and a request
8
+ * carrying neither is refused, since only the hosted pages call these routes.
9
+ */
10
+ export declare function createSameOriginGuard(origin: string): RequestHandler;
@@ -0,0 +1,32 @@
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
+ const SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
7
+ /**
8
+ * Refuses a state-changing request unless the browser says it came from this origin.
9
+ *
10
+ * RPs often sit on sibling subdomains, which are same-site, so `SameSite=Lax` cookies still
11
+ * ride their requests and `same-site` is not good enough here. `Sec-Fetch-Site` must be
12
+ * `same-origin` when present, `Origin` must be this origin when present, and a request
13
+ * carrying neither is refused, since only the hosted pages call these routes.
14
+ */
15
+ export function createSameOriginGuard(origin) {
16
+ return (req, res, next) => {
17
+ if (SAFE_METHODS.has(req.method)) {
18
+ next();
19
+ return;
20
+ }
21
+ const fetchSite = req.get('sec-fetch-site');
22
+ const requestOrigin = req.get('origin');
23
+ const siteOk = fetchSite === undefined || fetchSite === 'same-origin';
24
+ const originOk = requestOrigin === undefined ? fetchSite === 'same-origin' : requestOrigin === origin;
25
+ if (siteOk && originOk) {
26
+ next();
27
+ return;
28
+ }
29
+ res.status(403).json({ error: 'cross_origin_request_blocked' });
30
+ };
31
+ }
32
+ //# sourceMappingURL=originGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"originGuard.js","sourceRoot":"","sources":["../src/originGuard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,aAAa,CAAC;QACtE,MAAM,QAAQ,GACZ,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC;QACvF,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;YACvB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC"}
package/dist/pkce.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { KoaContextWithOIDC } from 'oidc-provider';
2
+ export declare const PKCE_REQUIRED_PROPERTY = "urn:seamless:pkce_required";
3
+ export declare const NONCE_REQUIRED_PROPERTY = "urn:seamless:nonce_required";
4
+ type ClientLike = Record<string, unknown> & {
5
+ clientAuthMethod?: string;
6
+ };
7
+ /**
8
+ * ADR D1, amended. PKCE is required unless the API marked a confidential client as opted
9
+ * out (RFC 9700 section 2.1.1). A public client is never opted out, whatever its metadata
10
+ * says. The library only asks when a code request has no `code_challenge`, so this is
11
+ * where an opted-out client's `nonce` stands in for PKCE. A nonce only binds an ID token,
12
+ * so a request without `openid` still needs PKCE. An admin may also waive the nonce, which
13
+ * leaves `state` and client authentication as the only defence against code injection.
14
+ */
15
+ export declare function pkceRequired(ctx: KoaContextWithOIDC, client: ClientLike | undefined): boolean;
16
+ export {};
package/dist/pkce.js ADDED
@@ -0,0 +1,32 @@
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 { errors } from 'oidc-provider';
7
+ export const PKCE_REQUIRED_PROPERTY = 'urn:seamless:pkce_required';
8
+ export const NONCE_REQUIRED_PROPERTY = 'urn:seamless:nonce_required';
9
+ /**
10
+ * ADR D1, amended. PKCE is required unless the API marked a confidential client as opted
11
+ * out (RFC 9700 section 2.1.1). A public client is never opted out, whatever its metadata
12
+ * says. The library only asks when a code request has no `code_challenge`, so this is
13
+ * where an opted-out client's `nonce` stands in for PKCE. A nonce only binds an ID token,
14
+ * so a request without `openid` still needs PKCE. An admin may also waive the nonce, which
15
+ * leaves `state` and client authentication as the only defence against code injection.
16
+ */
17
+ export function pkceRequired(ctx, client) {
18
+ if (!client || client.clientAuthMethod === 'none' || client[PKCE_REQUIRED_PROPERTY] !== false) {
19
+ return true;
20
+ }
21
+ const params = ctx.oidc.params;
22
+ const asksForIdToken = typeof params?.scope === 'string' && params.scope.split(' ').includes('openid');
23
+ if (!asksForIdToken)
24
+ return true;
25
+ if (client[NONCE_REQUIRED_PROPERTY] === false)
26
+ return false;
27
+ if (typeof params?.nonce !== 'string' || params.nonce === '') {
28
+ throw new errors.InvalidRequest('nonce is required when PKCE is not used');
29
+ }
30
+ return false;
31
+ }
32
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../src/pkce.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AAIrE;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAuB,EAAE,MAA8B;IAClF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,KAAK,MAAM,IAAI,MAAM,CAAC,sBAAsB,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAA0D,CAAC;IACnF,MAAM,cAAc,GAClB,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClF,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,MAAM,CAAC,uBAAuB,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,yCAAyC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { OidcEdgeConfigResponse } from '@seamless-auth/types';
2
+ import { type Configuration, type FindAccount, interactionPolicy, type KoaContextWithOIDC } from 'oidc-provider';
3
+ import type { OidcApiClient } from './apiClient.js';
4
+ import type { EdgeConfigCache } from './configCache.js';
5
+ import type { HostedPageRenderer } from './hostedPages.js';
6
+ import type { ApiSigningKey } from './signingKey.js';
7
+ export declare const PROVIDER_COOKIE_NAMES: {
8
+ readonly session: "__Host-oidc_session";
9
+ readonly interaction: "__Host-oidc_interaction";
10
+ readonly resume: "__Host-oidc_resume";
11
+ };
12
+ export interface ProviderConfigurationInput {
13
+ client: OidcApiClient;
14
+ config: OidcEdgeConfigResponse;
15
+ signingKeys: ApiSigningKey[];
16
+ cookieKeys: string[];
17
+ configCache: EdgeConfigCache;
18
+ renderPage: HostedPageRenderer;
19
+ }
20
+ export declare function createFindAccount(client: OidcApiClient): FindAccount;
21
+ /**
22
+ * First-party clients have consent implied, so their grant is created or topped up with what
23
+ * they ask for. Third-party clients (ADR D10) see the consent page on every authorization: only the
24
+ * grant the interaction just produced counts, never one remembered on the provider session.
25
+ */
26
+ export declare function loadExistingGrant(ctx: KoaContextWithOIDC): Promise<import("oidc-provider").Grant | undefined>;
27
+ /**
28
+ * Replaces the library's max_age and essential acr checks, which read the provider session's
29
+ * copy of the login and want an exact acr match. The API's auth context is the record: it
30
+ * moves with every step-up, and /oidc/sign refuses any acr, amr or auth_time that differs.
31
+ */
32
+ export declare function authContextCheck(client: OidcApiClient): interactionPolicy.Check;
33
+ export declare function buildInteractionPolicy(client: OidcApiClient): interactionPolicy.DefaultPolicy;
34
+ /**
35
+ * A client may introspect its own tokens. A resource server is a confidential client linked
36
+ * to its resource, so it may introspect tokens whose audience is that resource and nothing
37
+ * else: no client sees the tokens of apps it has no part in.
38
+ */
39
+ export declare function createIntrospectionPolicy(client: OidcApiClient): (_ctx: KoaContextWithOIDC, caller: {
40
+ clientId: string;
41
+ clientAuthMethod?: string | undefined;
42
+ }, token: {
43
+ clientId?: string;
44
+ aud?: string | string[];
45
+ }) => Promise<boolean>;
46
+ /**
47
+ * The locked configuration from ADR 0001 (D1, D6). The API's admin routes refuse client
48
+ * settings that would loosen it, so this is the ceiling, not a default.
49
+ */
50
+ export declare function buildProviderConfiguration(input: ProviderConfigurationInput): Configuration;