@seamless-auth/oidc-provider 0.2.0 → 0.4.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +95 -16
  3. package/dist/accessTokenClaims.d.ts +29 -0
  4. package/dist/accessTokenClaims.js +67 -0
  5. package/dist/accessTokenClaims.js.map +1 -0
  6. package/dist/accountClaims.d.ts +51 -0
  7. package/dist/accountClaims.js +102 -0
  8. package/dist/accountClaims.js.map +1 -0
  9. package/dist/adapter.js +26 -5
  10. package/dist/adapter.js.map +1 -1
  11. package/dist/apiClient.d.ts +3 -2
  12. package/dist/apiClient.js +3 -2
  13. package/dist/apiClient.js.map +1 -1
  14. package/dist/brandingContrast.d.ts +4 -0
  15. package/dist/brandingContrast.js +59 -0
  16. package/dist/brandingContrast.js.map +1 -0
  17. package/dist/claimsMismatch.d.ts +15 -0
  18. package/dist/claimsMismatch.js +90 -0
  19. package/dist/claimsMismatch.js.map +1 -0
  20. package/dist/createOidcEdge.d.ts +5 -0
  21. package/dist/createOidcEdge.js +43 -7
  22. package/dist/createOidcEdge.js.map +1 -1
  23. package/dist/deviceFlow.d.ts +2 -6
  24. package/dist/deviceFlow.js +2 -10
  25. package/dist/deviceFlow.js.map +1 -1
  26. package/dist/env.d.ts +1 -4
  27. package/dist/env.js +46 -4
  28. package/dist/env.js.map +1 -1
  29. package/dist/errorPage.d.ts +10 -0
  30. package/dist/errorPage.js +24 -0
  31. package/dist/errorPage.js.map +1 -0
  32. package/dist/hostedPages.d.ts +1 -0
  33. package/dist/hostedPages.js +24 -1
  34. package/dist/hostedPages.js.map +1 -1
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.js +1 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/interactions.js +83 -30
  39. package/dist/interactions.js.map +1 -1
  40. package/dist/jwtAccessTokens.d.ts +1 -1
  41. package/dist/jwtAccessTokens.js +2 -1
  42. package/dist/jwtAccessTokens.js.map +1 -1
  43. package/dist/logout.d.ts +4 -0
  44. package/dist/logout.js +8 -1
  45. package/dist/logout.js.map +1 -1
  46. package/dist/providerConfig.d.ts +3 -3
  47. package/dist/providerConfig.js +22 -6
  48. package/dist/providerConfig.js.map +1 -1
  49. package/dist/requestContext.d.ts +1 -2
  50. package/dist/requestContext.js.map +1 -1
  51. package/dist/requestObjectErrors.d.ts +12 -0
  52. package/dist/requestObjectErrors.js +47 -0
  53. package/dist/requestObjectErrors.js.map +1 -0
  54. package/dist/resumeCookie.js +3 -1
  55. package/dist/resumeCookie.js.map +1 -1
  56. package/dist/server.js +2 -2
  57. package/dist/server.js.map +1 -1
  58. package/dist/signingKey.d.ts +31 -3
  59. package/dist/signingKey.js +104 -4
  60. package/dist/signingKey.js.map +1 -1
  61. package/dist/ui/assets/index-BLikvo1E.js +18 -0
  62. package/dist/ui/assets/index-DKah8G4b.css +1 -0
  63. package/dist/ui/index.html +2 -2
  64. package/package.json +11 -8
  65. package/dist/ui/assets/index-CydLXRvo.js +0 -18
  66. package/dist/ui/assets/index-y3LME-Gv.css +0 -1
@@ -0,0 +1,10 @@
1
+ import type { Configuration, KoaContextWithOIDC } from 'oidc-provider';
2
+ import type { HostedPageRenderer } from './hostedPages.js';
3
+ type ErrorOut = Parameters<NonNullable<Configuration['renderError']>>[1];
4
+ /**
5
+ * The page for an error the provider cannot send back to the app: an unknown client, an
6
+ * unregistered redirect_uri or post_logout_redirect_uri, a broken id_token_hint. Only the
7
+ * code and description go to the page, as data the UI renders as text. `state` is left out.
8
+ */
9
+ export declare function createErrorPage(render: HostedPageRenderer): (ctx: KoaContextWithOIDC, out: ErrorOut) => Promise<void>;
10
+ export {};
@@ -0,0 +1,24 @@
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 page for an error the provider cannot send back to the app: an unknown client, an
8
+ * unregistered redirect_uri or post_logout_redirect_uri, a broken id_token_hint. Only the
9
+ * code and description go to the page, as data the UI renders as text. `state` is left out.
10
+ */
11
+ export function createErrorPage(render) {
12
+ return async (ctx, out) => {
13
+ const error = typeof out.error === 'string' ? out.error : 'server_error';
14
+ // The library's own text for an unexposed error is "oops! something went wrong".
15
+ const description = error !== 'server_error' && typeof out.error_description === 'string'
16
+ ? out.error_description
17
+ : 'Something went wrong on our side.';
18
+ const { html, headers } = await render({ view: 'error', error, description });
19
+ ctx.set(headers);
20
+ ctx.type = 'html';
21
+ ctx.body = html;
22
+ };
23
+ }
24
+ //# sourceMappingURL=errorPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorPage.js","sourceRoot":"","sources":["../src/errorPage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,OAAO,KAAK,EAAE,GAAuB,EAAE,GAAa,EAAiB,EAAE;QACrE,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;QACzE,iFAAiF;QACjF,MAAM,WAAW,GACf,KAAK,KAAK,cAAc,IAAI,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ;YACnE,CAAC,CAAC,GAAG,CAAC,iBAAiB;YACvB,CAAC,CAAC,mCAAmC,CAAC;QAC1C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjB,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;QAClB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -37,6 +37,7 @@ export declare function brandingFor(appName: string, hostedUi: HostedUi | undefi
37
37
  export type HostedPageData = Record<string, unknown> & {
38
38
  view: string;
39
39
  };
40
+ export declare function pageTitle(appName: string, page?: HostedPageData): string;
40
41
  export declare function renderIndex(template: string, branding: HostedBranding, nonce: string, style?: BrandingStyle, page?: HostedPageData): string;
41
42
  export interface RenderedPage {
42
43
  html: string;
@@ -7,6 +7,7 @@ import { randomBytes } from 'node:crypto';
7
7
  import { readFileSync } from 'node:fs';
8
8
  import { join } from 'node:path';
9
9
  import express from 'express';
10
+ import { brandingContrastProblems } from './brandingContrast.js';
10
11
  /**
11
12
  * Paths the SPA renders. The adapter's bundled screens (`@seamless-auth/react` AuthRoutes)
12
13
  * own most of them, and the API builds magic link and recovery URLs from some.
@@ -104,10 +105,23 @@ export function brandingFor(appName, hostedUi) {
104
105
  ...(hostedUi?.logoUrl ? { logoUrl: hostedUi.logoUrl } : {}),
105
106
  };
106
107
  }
108
+ /** WCAG 2.4.2: a page the provider renders is titled for what it does, not "Sign in". */
109
+ const PAGE_TITLES = {
110
+ logout: (app) => `Sign out of ${app}`,
111
+ signed_out: (app) => `Signed out of ${app}`,
112
+ device_input: (app) => `Sign in on a device with ${app}`,
113
+ device_confirm: (app) => `Sign in on a device with ${app}`,
114
+ device_done: (app) => `Device signed in with ${app}`,
115
+ error: (app) => `${app}: we could not continue`,
116
+ };
117
+ export function pageTitle(appName, page) {
118
+ const title = page ? PAGE_TITLES[page.view] : undefined;
119
+ return title ? title(appName) : `Sign in to ${appName}`;
120
+ }
107
121
  export function renderIndex(template, branding, nonce, style, page) {
108
122
  const head = [
109
123
  `<meta name="seamless-csp-nonce" content="${nonce}" />`,
110
- `<title>Sign in to ${escapeHtml(branding.appName)}</title>`,
124
+ `<title>${escapeHtml(pageTitle(branding.appName, page))}</title>`,
111
125
  `<script type="application/json" id="seamless-hosted">${inlineJson(branding)}</script>`,
112
126
  ...(page
113
127
  ? [`<script type="application/json" id="seamless-page">${inlineJson(page)}</script>`]
@@ -135,8 +149,17 @@ export function createHostedPageRenderer(options) {
135
149
  if (!template.includes(HEAD_PLACEHOLDER)) {
136
150
  throw new Error(`${options.uiDir}/index.html has no ${HEAD_PLACEHOLDER} placeholder`);
137
151
  }
152
+ let checkedColors;
138
153
  return async (page, formActions) => {
139
154
  const config = await options.configCache.get();
155
+ const colors = JSON.stringify(config.hostedUi?.colors ?? null);
156
+ if (colors !== checkedColors) {
157
+ checkedColors = colors;
158
+ const problems = brandingContrastProblems(config.hostedUi);
159
+ if (problems.length > 0) {
160
+ console.warn(`[oidc-provider] hosted_ui colors fall below WCAG 2.2 AA contrast on the hosted pages: ${problems.join('; ')}`);
161
+ }
162
+ }
140
163
  const nonce = randomBytes(16).toString('base64');
141
164
  const branding = brandingFor(config.appName, config.hostedUi);
142
165
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"hostedPages.js","sourceRoot":"","sources":["../src/hostedPages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hostedPages.js","sourceRoot":"","sources":["../src/hostedPages.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,5 +16,5 @@ export { createSameOriginGuard } from './originGuard.js';
16
16
  export { buildProviderConfiguration, loadExistingGrant, PROVIDER_COOKIE_NAMES, } from './providerConfig.js';
17
17
  export type { EdgeRequestContext } from './requestContext.js';
18
18
  export { adoptSession, bindSession, currentRequestContext, runWithRequestContext, } from './requestContext.js';
19
- export { ApiSigningKey, classifyToken, signingKeysFrom, UnsignableTokenError, } from './signingKey.js';
19
+ export { ApiSigningKey, classifyToken, SIGNING_KEY_REFRESH_MS, SigningKeyRing, signingKeysFrom, UnsignableTokenError, } from './signingKey.js';
20
20
  export { checkApiCompatibility } from './startup.js';
package/dist/index.js CHANGED
@@ -15,6 +15,6 @@ export { createInteractionRouter, FIRST_PARTY_CLIENT_PROPERTY } from './interact
15
15
  export { createSameOriginGuard } from './originGuard.js';
16
16
  export { buildProviderConfiguration, loadExistingGrant, PROVIDER_COOKIE_NAMES, } from './providerConfig.js';
17
17
  export { adoptSession, bindSession, currentRequestContext, runWithRequestContext, } from './requestContext.js';
18
- export { ApiSigningKey, classifyToken, signingKeysFrom, UnsignableTokenError, } from './signingKey.js';
18
+ export { ApiSigningKey, classifyToken, SIGNING_KEY_REFRESH_MS, SigningKeyRing, signingKeysFrom, UnsignableTokenError, } from './signingKey.js';
19
19
  export { checkApiCompatibility } from './startup.js';
20
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -10,7 +10,7 @@ import { authRequirements, stepUpMethods, unmetRequirements } from './authRequir
10
10
  import { OidcApiError } from './errors.js';
11
11
  import { readFirstPartySession } from './firstPartySession.js';
12
12
  import { createSameOriginGuard } from './originGuard.js';
13
- import { bindSession } from './requestContext.js';
13
+ import { bindSession, currentRequestContext } from './requestContext.js';
14
14
  import { grantLifetime } from './tokenLifetimes.js';
15
15
  export const FIRST_PARTY_CLIENT_PROPERTY = 'urn:seamless:first_party';
16
16
  class InteractionRefusal extends Error {
@@ -85,11 +85,38 @@ export function createInteractionRouter(options) {
85
85
  throw error;
86
86
  }
87
87
  }
88
+ /**
89
+ * What the confirmation shows as the account, or null when the page must not offer to
90
+ * continue. A browser only gets it while signed in as the account the interaction is for,
91
+ * which is what the consent route will require of the click.
92
+ */
93
+ async function accountIdentifier(req, interaction, clientId) {
94
+ const accountId = interaction.session?.accountId;
95
+ if (!accountId) {
96
+ return null;
97
+ }
98
+ const cookies = req.cookies;
99
+ const { session } = readFirstPartySession(cookies[options.accessCookieName], options.adapterCookieSecret);
100
+ if (session?.userId !== accountId) {
101
+ return null;
102
+ }
103
+ try {
104
+ // The interaction's session, which holds the grant. A refreshed cookie can name a newer one.
105
+ const sessionId = currentRequestContext()?.sessionId ?? session.sessionId;
106
+ const claims = await client.account(accountId, { clientId, sessionId });
107
+ return claims?.sub === accountId ? claims.email || claims.phone_number || null : null;
108
+ }
109
+ catch (error) {
110
+ console.error(`[oidc-provider] could not read the account to confirm: ${String(error)}`);
111
+ return null;
112
+ }
113
+ }
88
114
  router.get('/interaction/:uid/details', handle(async (req, res) => {
89
115
  const interaction = await load(req, res);
90
116
  const found = await clientFor(interaction);
91
117
  const details = promptDetails(interaction);
92
118
  const redirectUri = stringParam(interaction.params, 'redirect_uri');
119
+ const identifier = await accountIdentifier(req, interaction, found.clientId);
93
120
  res.set('cache-control', 'no-store');
94
121
  res.json({
95
122
  uid: interaction.uid,
@@ -108,6 +135,7 @@ export function createInteractionRouter(options) {
108
135
  },
109
136
  scopes: (stringParam(interaction.params, 'scope') ?? '').split(' ').filter(Boolean),
110
137
  loginHint: stringParam(interaction.params, 'login_hint') ?? null,
138
+ account: identifier ? { identifier } : null,
111
139
  });
112
140
  }));
113
141
  router.post('/interaction/:uid/login', express.json({ limit: '1kb' }), handle(async (req, res) => {
@@ -131,46 +159,71 @@ export function createInteractionRouter(options) {
131
159
  // Saved outside a provider request, where the ttl.Grant function cannot see the client.
132
160
  Object.assign(grant, { expiresIn: grantLifetime(found) });
133
161
  const grantId = await grant.save();
134
- const context = await client.authContext(session.sessionId, found.clientId);
135
- const refusal = !context || !context.active || context.userId !== session.userId
136
- ? new InteractionRefusal(401, 'login_required')
137
- : context.recovery
138
- ? new InteractionRefusal(403, 'enrollment_required')
139
- : undefined;
140
- if (refusal || !context) {
141
- // A grant left behind would bind the session to the client without a sign-in.
142
- await grant.destroy();
143
- throw refusal ?? new InteractionRefusal(401, 'login_required');
144
- }
145
- const unmet = unmetRequirements(authRequirements(interaction.params), context, interaction.iat);
146
- if (unmet) {
147
- await grant.destroy();
148
- if (!afterStepUp) {
149
- throw new InteractionRefusal(409, 'step_up_required', {
150
- methods: stepUpMethods(unmet, context),
162
+ // A grant left behind would bind the session to the client without a sign-in, so only
163
+ // a finished login keeps it, whatever else ends the request.
164
+ let keepGrant = false;
165
+ try {
166
+ const context = await client.authContext(session.sessionId, found.clientId);
167
+ if (!context || !context.active || context.userId !== session.userId) {
168
+ throw new InteractionRefusal(401, 'login_required');
169
+ }
170
+ if (context.recovery) {
171
+ throw new InteractionRefusal(403, 'enrollment_required');
172
+ }
173
+ const unmet = unmetRequirements(authRequirements(interaction.params), context, interaction.iat);
174
+ if (unmet) {
175
+ if (!afterStepUp) {
176
+ throw new InteractionRefusal(409, 'step_up_required', {
177
+ methods: stepUpMethods(unmet, context),
178
+ });
179
+ }
180
+ // A weaker step-up than the request needs (a synced passkey for phrh, say) ends the
181
+ // request instead of issuing a lower acr.
182
+ const redirectTo = await provider.interactionResult(req, res, {
183
+ error: 'unmet_authentication_requirements',
184
+ error_description: 'the requested authentication could not be obtained',
185
+ }, { mergeWithLastSubmission: false });
186
+ res.json({ redirectTo });
187
+ return;
188
+ }
189
+ // RFC 8252 section 8.6: anything on the device can claim a native client's redirect,
190
+ // so its consent prompt must still run and be confirmed by the user, first-party or
191
+ // not. A device approval is confirmed on the device pages, after the user code is
192
+ // entered.
193
+ if (found.applicationType === 'native' && !interaction.deviceCode) {
194
+ const redirectTo = await provider.interactionResult(req, res, {
195
+ login: loginResult(session.userId, context),
151
196
  });
197
+ res.json({ redirectTo });
198
+ return;
152
199
  }
153
- // A weaker step-up than the request needs (a synced passkey for phrh, say) ends the
154
- // request instead of issuing a lower acr.
155
200
  const redirectTo = await provider.interactionResult(req, res, {
156
- error: 'unmet_authentication_requirements',
157
- error_description: 'the requested authentication could not be obtained',
158
- }, { mergeWithLastSubmission: false });
201
+ login: loginResult(session.userId, context),
202
+ consent: { grantId },
203
+ });
204
+ keepGrant = true;
159
205
  res.json({ redirectTo });
160
- return;
161
206
  }
162
- const redirectTo = await provider.interactionResult(req, res, {
163
- login: loginResult(session.userId, context),
164
- consent: { grantId },
165
- });
166
- res.json({ redirectTo });
207
+ finally {
208
+ if (!keepGrant) {
209
+ await grant.destroy().catch((error) => {
210
+ console.error(`[oidc-provider] could not remove an unused grant: ${String(error)}`);
211
+ });
212
+ }
213
+ }
167
214
  }));
168
- router.post('/interaction/:uid/consent', handle(async (req, res) => {
215
+ router.post('/interaction/:uid/consent', express.json({ limit: '1kb' }), handle(async (req, res) => {
169
216
  const session = firstPartySession(req);
170
217
  const interaction = await load(req, res);
171
218
  if (interaction.prompt.name !== 'consent') {
172
219
  throw new InteractionRefusal(409, 'consent_not_requested');
173
220
  }
221
+ // The hosted pages consent for a first-party client on their own, which a native
222
+ // client's prompt must never get: only a click on the confirmation sends `confirmed`.
223
+ const confirmed = typeof req.body === 'object' && req.body !== null && req.body.confirmed === true;
224
+ if (interaction.prompt.reasons.includes('native_client_prompt') && !confirmed) {
225
+ throw new InteractionRefusal(403, 'confirmation_required');
226
+ }
174
227
  const accountId = interaction.session?.accountId;
175
228
  if (!accountId || accountId !== session.userId) {
176
229
  throw new InteractionRefusal(409, 'account_mismatch');
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import type { ApiSigningKey } from './signingKey.js';
4
4
  * Maps a JWT access token this provider signed back to its `jti`. Only RS256, the one alg the
5
5
  * API signs with, and only after the signature checks out against a published provider key.
6
6
  */
7
- export declare function createJwtAccessTokenLookup(keys: readonly ApiSigningKey[], issuer: string): (value: string) => string | undefined;
7
+ export declare function createJwtAccessTokenLookup(currentKeys: () => readonly ApiSigningKey[], issuer: string): (value: string) => string | undefined;
8
8
  /**
9
9
  * The library refuses JWTs at introspection and revocation, because it looks tokens up by the
10
10
  * presented value and stores a JWT access token under its `jti`. A resource server holding a
@@ -20,8 +20,9 @@ function decode(segment) {
20
20
  * Maps a JWT access token this provider signed back to its `jti`. Only RS256, the one alg the
21
21
  * API signs with, and only after the signature checks out against a published provider key.
22
22
  */
23
- export function createJwtAccessTokenLookup(keys, issuer) {
23
+ export function createJwtAccessTokenLookup(currentKeys, issuer) {
24
24
  return (value) => {
25
+ const keys = currentKeys();
25
26
  const [header, payload, signature, extra] = value.split('.');
26
27
  if (!header || !payload || !signature || extra !== undefined) {
27
28
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"jwtAccessTokens.js","sourceRoot":"","sources":["../src/jwtAccessTokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,SAAS,MAAM,CAAC,OAAe;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzE,CAAC,CAAE,KAAiC;YACpC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAA8B,EAAE,MAAc;IACvF,OAAO,CAAC,KAAa,EAAsB,EAAE;QAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,YAAY,EAAE,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACnE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC;QACzE,IACE,CAAC,GAAG;YACJ,CAAC,MAAM,CACL,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,EACnC,GAAG,CAAC,SAAS,EAAE,EACf,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CACpC,EACD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,MAAM,EAAE,GAAG,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG;YAC3E,CAAC,CAAC,MAAM,CAAC,GAAG;YACZ,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7B,4FAA4F;AAC5F,wFAAwF;AACxF,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,KAAK,UAAU,QAAQ,CAAC,MAA6B;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QACrB,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA6C,EAC7C,KAAe;IAEf,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,EAAE,GAAuB,EAAE,IAA4B,EAAE,EAAE;QACrE,IACE,GAAG,CAAC,MAAM,KAAK,MAAM;YACrB,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,CAAC,GAAG,CAAC,EAAE,CAAC,mCAAmC,CAAC,EAC5C,CAAC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,GAA0C,CAAC;QAC/D,uEAAuE;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;gBACjE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACzB,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,CAAC;YACvF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,kBAAkB,GAAG,GAAG,CAAC;YACnC,CAAC;QACH,CAAC;QACD,wDAAwD;QACxD,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAOD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa,EACb,KAAa,EACb,GAAyC;IAEzC,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,WAA0C,CAAC;IACjF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"jwtAccessTokens.js","sourceRoot":"","sources":["../src/jwtAccessTokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,SAAS,MAAM,CAAC,OAAe;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzE,CAAC,CAAE,KAAiC;YACpC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAA2C,EAC3C,MAAc;IAEd,OAAO,CAAC,KAAa,EAAsB,EAAE;QAC3C,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,YAAY,EAAE,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACnE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC;QACzE,IACE,CAAC,GAAG;YACJ,CAAC,MAAM,CACL,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,EACnC,GAAG,CAAC,SAAS,EAAE,EACf,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CACpC,EACD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,MAAM,EAAE,GAAG,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG;YAC3E,CAAC,CAAC,MAAM,CAAC,GAAG;YACZ,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7B,4FAA4F;AAC5F,wFAAwF;AACxF,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,KAAK,UAAU,QAAQ,CAAC,MAA6B;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QACrB,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA6C,EAC7C,KAAe;IAEf,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,EAAE,GAAuB,EAAE,IAA4B,EAAE,EAAE;QACrE,IACE,GAAG,CAAC,MAAM,KAAK,MAAM;YACrB,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,CAAC,GAAG,CAAC,EAAE,CAAC,mCAAmC,CAAC,EAC5C,CAAC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,GAA0C,CAAC;QAC/D,uEAAuE;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;gBACjE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACzB,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,CAAC;YACvF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,kBAAkB,GAAG,GAAG,CAAC;YACnC,CAAC;QACH,CAAC;QACD,wDAAwD;QACxD,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAOD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa,EACb,KAAa,EACb,GAAyC;IAEzC,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,WAA0C,CAAC;IACjF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;AAChD,CAAC"}
package/dist/logout.d.ts CHANGED
@@ -18,5 +18,9 @@ export declare function leaveBackchannelLogoutToApi(provider: Provider): void;
18
18
  * it was made under, which this does. That revocation is what tells every other app the user
19
19
  * signed in to through it. The adapter cookies are cleared too, so the hosted pages do not
20
20
  * offer a session that no longer exists.
21
+ *
22
+ * A provider session with no account gets no confirmation page: the library posts
23
+ * `logout=yes` on its own, so any site could send a browser there. The first-party session
24
+ * and its cookies are left alone then, since nobody chose to sign out of anything.
21
25
  */
22
26
  export declare function endFirstPartySessionOnLogout(client: OidcApiClient, adapterCookies: string[]): (ctx: KoaContextWithOIDC, next: () => Promise<unknown>) => Promise<void>;
package/dist/logout.js CHANGED
@@ -44,11 +44,18 @@ export function leaveBackchannelLogoutToApi(provider) {
44
44
  * it was made under, which this does. That revocation is what tells every other app the user
45
45
  * signed in to through it. The adapter cookies are cleared too, so the hosted pages do not
46
46
  * offer a session that no longer exists.
47
+ *
48
+ * A provider session with no account gets no confirmation page: the library posts
49
+ * `logout=yes` on its own, so any site could send a browser there. The first-party session
50
+ * and its cookies are left alone then, since nobody chose to sign out of anything.
47
51
  */
48
52
  export function endFirstPartySessionOnLogout(client, adapterCookies) {
49
53
  return async (ctx, next) => {
50
54
  await next();
51
- if (ctx.oidc?.route !== 'end_session_confirm' || ctx.status !== 303) {
55
+ // The library destroys the session it ends, but the loaded copy still names its account.
56
+ if (ctx.oidc?.route !== 'end_session_confirm' ||
57
+ ctx.status !== 303 ||
58
+ !ctx.oidc.session?.accountId) {
52
59
  return;
53
60
  }
54
61
  const everywhere = Boolean(ctx.oidc.params?.logout);
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  import type { OidcEdgeConfigResponse } from '@seamless-auth/types';
2
- import { type Configuration, type FindAccount, interactionPolicy, type KoaContextWithOIDC } from 'oidc-provider';
2
+ import { type Configuration, type ExternalSigningKey, type FindAccount, interactionPolicy, type KoaContextWithOIDC } from 'oidc-provider';
3
3
  import type { OidcApiClient } from './apiClient.js';
4
4
  import type { EdgeConfigCache } from './configCache.js';
5
5
  import type { HostedPageRenderer } from './hostedPages.js';
6
- import type { ApiSigningKey } from './signingKey.js';
7
6
  export declare const PROVIDER_COOKIE_NAMES: {
8
7
  readonly session: "__Host-oidc_session";
9
8
  readonly interaction: "__Host-oidc_interaction";
@@ -12,7 +11,8 @@ export declare const PROVIDER_COOKIE_NAMES: {
12
11
  export interface ProviderConfigurationInput {
13
12
  client: OidcApiClient;
14
13
  config: OidcEdgeConfigResponse;
15
- signingKeys: ApiSigningKey[];
14
+ /** The active key first. */
15
+ signingKeys: ExternalSigningKey[];
16
16
  cookieKeys: string[];
17
17
  configCache: EdgeConfigCache;
18
18
  renderPage: HostedPageRenderer;
@@ -4,9 +4,12 @@
4
4
  * See LICENSE file in the project root for full license information
5
5
  */
6
6
  import { interactionPolicy, } from 'oidc-provider';
7
+ import { accessTokenClaims } from './accessTokenClaims.js';
8
+ import { accountClaimsOf, CUSTOM_CLAIMS_SCOPE, PERMISSIONS_SCOPE, PERMISSIONS_SCOPE_CLAIMS, providerAccountOf, withAccount, } from './accountClaims.js';
7
9
  import { createApiAdapterFactory } from './adapter.js';
8
10
  import { ACR_VALUES, authRequirements, hasRequirements, meetsAcr, unmetRequirements, } from './authRequirements.js';
9
11
  import { createDevicePages, DEVICE_CODE_TTL_SECONDS } from './deviceFlow.js';
12
+ import { createErrorPage } from './errorPage.js';
10
13
  import { OidcApiError } from './errors.js';
11
14
  import { readFirstPartySession } from './firstPartySession.js';
12
15
  import { FIRST_PARTY_CLIENT_PROPERTY } from './interactions.js';
@@ -41,11 +44,12 @@ export function createFindAccount(client) {
41
44
  const sessionId = currentRequestContext()?.sessionId;
42
45
  const claims = clientId && sessionId ? await client.account(sub, { clientId, sessionId }) : undefined;
43
46
  if (claims) {
44
- const { org_id, ...rest } = claims;
45
- return {
47
+ // Read at call time: a claims_mismatch retry replaces the account's claims in place.
48
+ const account = withAccount({
46
49
  accountId: claims.sub,
47
- claims: () => ({ ...rest, ...(org_id ? { org_id } : {}) }),
48
- };
50
+ claims: () => accountClaimsOf(providerAccountOf(account) ?? claims),
51
+ }, claims);
52
+ return account;
49
53
  }
50
54
  // A client this session has not used yet has no grant, so the API will not describe the
51
55
  // account. At authorization the library only needs to know the provider session's own
@@ -203,7 +207,7 @@ export function buildProviderConfiguration(input) {
203
207
  if (!activeKey) {
204
208
  throw new Error('No provider signing key is available');
205
209
  }
206
- const activeAlg = activeKey.alg;
210
+ const activeAlg = activeKey.alg ?? '';
207
211
  if (!isAsymmetricAlg(activeAlg)) {
208
212
  throw new Error(`The active provider key uses unsupported alg ${activeAlg}`);
209
213
  }
@@ -212,6 +216,7 @@ export function buildProviderConfiguration(input) {
212
216
  return {
213
217
  adapter: createApiAdapterFactory(input.client, input.configCache),
214
218
  findAccount: createFindAccount(input.client),
219
+ renderError: createErrorPage(input.renderPage),
215
220
  loadExistingGrant,
216
221
  jwks: { keys: input.signingKeys },
217
222
  responseTypes: ['code'],
@@ -236,15 +241,25 @@ export function buildProviderConfiguration(input) {
236
241
  userinfoSigningAlgValues: signingAlgs,
237
242
  },
238
243
  acrValues: [...ACR_VALUES],
239
- scopes: ['openid', 'offline_access', 'email', 'phone', 'seamless'],
244
+ scopes: [
245
+ 'openid',
246
+ 'offline_access',
247
+ 'email',
248
+ 'phone',
249
+ 'seamless',
250
+ PERMISSIONS_SCOPE,
251
+ CUSTOM_CLAIMS_SCOPE,
252
+ ],
240
253
  // Listing claims replaces the library's defaults. The session claims sit under openid so
241
254
  // every ID token carries the assurance the API recorded (ADR D9, D11), asked for or not.
255
+ // Custom claim names are the adopter's, so releaseAuthorizationClaims adds them.
242
256
  claims: {
243
257
  sid: null,
244
258
  openid: ['sub', 'acr', 'amr', 'auth_time'],
245
259
  email: ['email', 'email_verified'],
246
260
  phone: ['phone_number', 'phone_number_verified'],
247
261
  seamless: ['roles', 'org_id'],
262
+ [PERMISSIONS_SCOPE]: [...PERMISSIONS_SCOPE_CLAIMS],
248
263
  },
249
264
  extraClientMetadata: {
250
265
  properties: [
@@ -266,6 +281,7 @@ export function buildProviderConfiguration(input) {
266
281
  device_authorization: '/device/auth',
267
282
  },
268
283
  formats: { customizers: { jwt: storeJwtAccessToken } },
284
+ extraTokenClaims: accessTokenClaims,
269
285
  ttl: {
270
286
  // Functions, so the resource's and the application's own lifetimes apply.
271
287
  AccessToken: accessTokenTtl,