@_mustachio/openauth 0.13.2 → 0.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/domain/authorize.js +11 -3
- package/dist/esm/domain/callback.js +9 -2
- package/dist/esm/domain/method-dispatch.js +1 -0
- package/dist/esm/domain/method-route.js +2 -0
- package/dist/esm/domain/mount.js +29 -0
- package/dist/esm/http/handlers/method-route.js +8 -3
- package/dist/esm/index.js +3 -0
- package/dist/esm/methods/code.js +9 -8
- package/dist/esm/methods/oauth2-generic.js +2 -1
- package/dist/esm/methods/passkey.js +3 -2
- package/dist/esm/methods/password.js +9 -8
- package/dist/esm/methods/saml-sp/metadata.js +2 -1
- package/dist/types/domain/authorize.d.ts.map +1 -1
- package/dist/types/domain/callback.d.ts +6 -5
- package/dist/types/domain/callback.d.ts.map +1 -1
- package/dist/types/domain/method-dispatch.d.ts +5 -0
- package/dist/types/domain/method-dispatch.d.ts.map +1 -1
- package/dist/types/domain/method-route.d.ts +6 -0
- package/dist/types/domain/method-route.d.ts.map +1 -1
- package/dist/types/domain/mount.d.ts +90 -0
- package/dist/types/domain/mount.d.ts.map +1 -0
- package/dist/types/http/handlers/method-route.d.ts.map +1 -1
- package/dist/types/index.d.ts +16 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/methods/code.d.ts.map +1 -1
- package/dist/types/methods/oauth2-generic.d.ts.map +1 -1
- package/dist/types/methods/passkey.d.ts.map +1 -1
- package/dist/types/methods/password.d.ts.map +1 -1
- package/dist/types/methods/saml-sp/metadata.d.ts.map +1 -1
- package/dist/types/types/idp.d.ts +16 -1
- package/dist/types/types/idp.d.ts.map +1 -1
- package/dist/types/types/method.d.ts +11 -0
- package/dist/types/types/method.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/domain/authorize.ts +15 -4
- package/src/domain/callback.ts +18 -7
- package/src/domain/method-dispatch.ts +6 -0
- package/src/domain/method-route.ts +8 -0
- package/src/domain/mount.ts +113 -0
- package/src/http/handlers/method-route.ts +9 -5
- package/src/index.ts +17 -0
- package/src/methods/code.ts +15 -6
- package/src/methods/oauth2-generic.ts +6 -1
- package/src/methods/passkey.ts +6 -2
- package/src/methods/password.ts +19 -4
- package/src/methods/saml-sp/metadata.ts +5 -1
- package/src/types/idp.ts +16 -1
- package/src/types/method.ts +11 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../../src/methods/passkey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../../src/methods/passkey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,iBAAiB,CAAA;AAIxB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,gBAAgB,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACtE,QAAQ,CACN,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACnC,oEAAoE;IACpE,aAAa,CAAC,KAAK,EAAE;QACnB,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjB,6CAA6C;IAC7C,MAAM,CAAC,CAAC,KAAK,EAAE;QACb,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,gBAAgB,CAAA;QAC5B,QAAQ,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,WAAW,EAAE,sBAAsB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9E;;;;;;;;GAQG;AACH,QAAA,MAAM,YAAY;IAChB,kDAAkD;;IAElD,iDAAiD;;IAEjD,mEAAmE;;IAEnE,2BAA2B;;;;;;;;;;;;EAE3B,CAAA;AACF,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAkBjD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,GACzB,iBAAiB,CAAC,iBAAiB,EAAE,YAAY,EAAE,aAAa,CAAC,CAoDnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../../src/methods/password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../../src/methods/password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,iBAAiB,CAAA;AAIxB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kDAAkD;IAClD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAC1E;;;;OAIG;IACH,MAAM,CAAC,CAAC,KAAK,EAAE;QACb,KAAK,EAAE,MAAM,CAAA;QACb,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,sCAAsC;IACtC,KAAK,EAAE,iBAAiB,CAAA;IACxB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,iGAAiG;AACjG,QAAA,MAAM,YAAY,iDAAwB,CAAA;AAC1C,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAYlD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,qBAAqB,GAC1B,iBAAiB,CAAC,kBAAkB,EAAE,aAAa,EAAE,cAAc,CAAC,CAwCtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../src/methods/saml-sp/metadata.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../src/methods/saml-sp/metadata.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGrE,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACZ,MAAM,SAAS,CAAA;AAqBhB,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAUD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkDjE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAqDtD"}
|
|
@@ -233,7 +233,22 @@ export type IdPOptions = {
|
|
|
233
233
|
* mechanism (see plan §"Tenant Recovery Across Redirects").
|
|
234
234
|
*/
|
|
235
235
|
resolveTenant: (req: Request) => Promise<Result<TenantId, AuthError>>;
|
|
236
|
-
/**
|
|
236
|
+
/**
|
|
237
|
+
* Opt-in for partitioned callback hosts (recovery mechanism #2).
|
|
238
|
+
*
|
|
239
|
+
* Returns the hostname a given tenant's callbacks arrive on, so the
|
|
240
|
+
* tenant is recoverable from the `Host` header before the state
|
|
241
|
+
* envelope is verified.
|
|
242
|
+
*
|
|
243
|
+
* **The issuer's mount prefix still applies to the returned host.** If
|
|
244
|
+
* `issuerUrl` is `https://example.com/idp`, a tenant host of
|
|
245
|
+
* `acme.example.com` produces `https://acme.example.com/idp/cb/<id>`.
|
|
246
|
+
* This option varies the *authority* of one deployment — those hosts
|
|
247
|
+
* are served by this same service behind the same proxy, so they share
|
|
248
|
+
* its mount. A deployment needing partitioned hosts mounted differently
|
|
249
|
+
* from the issuer is describing two mounts, which one `issuerUrl`
|
|
250
|
+
* cannot express; a second option must not be added to paper over it.
|
|
251
|
+
*/
|
|
237
252
|
callbackHostFor?: (tenantId: TenantId) => string;
|
|
238
253
|
/**
|
|
239
254
|
* HMAC-SHA-256 key ring used to MAC the minimal state envelope. The
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idp.d.ts","sourceRoot":"","sources":["../../../src/types/idp.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"idp.d.ts","sourceRoot":"","sources":["../../../src/types/idp.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,6 +107,17 @@ export type MethodHandler<P, S> = (ctx: MethodContext<S>) => Promise<MethodResul
|
|
|
107
107
|
export type MethodContext<S = unknown> = {
|
|
108
108
|
/** The raw Web Fetch `Request`. Web standard, not Hono `Context`. */
|
|
109
109
|
request: Request;
|
|
110
|
+
/**
|
|
111
|
+
* The issuer URL of this IdP, always present.
|
|
112
|
+
*
|
|
113
|
+
* Distinct from `dispatch.issuerUrl`, which is only populated for
|
|
114
|
+
* `GET /authorize`. Methods that render their own URLs — a form action
|
|
115
|
+
* re-rendered on a validation error, say — need it on every route, and
|
|
116
|
+
* must build those URLs with `mountedPath` so they carry the
|
|
117
|
+
* deployment's mount prefix. `ctx.request.url` is not a substitute: a
|
|
118
|
+
* proxy-stripped inbound URL has already lost that prefix.
|
|
119
|
+
*/
|
|
120
|
+
issuerUrl: string;
|
|
110
121
|
/** Path within the method's mount, e.g. `"/callback"` (without the `/<id>` prefix). */
|
|
111
122
|
subPath: string;
|
|
112
123
|
tenant: TenantContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method.d.ts","sourceRoot":"","sources":["../../../src/types/method.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"method.d.ts","sourceRoot":"","sources":["../../../src/types/method.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@_mustachio/openauth",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"build": "bun run script/build.ts",
|
|
12
12
|
"build:watch": "bun run script/build-watch.ts",
|
|
13
13
|
"test": "bun test",
|
|
14
|
+
"typecheck": "tsc --noEmit -p tsconfig.test.json",
|
|
14
15
|
"preview:ui": "bun --hot run script/preview-ui.ts"
|
|
15
16
|
},
|
|
16
17
|
"sideEffects": false,
|
package/src/domain/authorize.ts
CHANGED
|
@@ -51,6 +51,7 @@ import { safeAudit } from "./audit"
|
|
|
51
51
|
import { randomId, randomToken } from "./crypto"
|
|
52
52
|
import { MethodCache } from "./method-cache"
|
|
53
53
|
import { dispatchMethod } from "./method-dispatch"
|
|
54
|
+
import { callbackTarget } from "./mount"
|
|
54
55
|
import { mintStateEnvelope } from "./state-envelope"
|
|
55
56
|
import { saveEncryptedCode } from "./token"
|
|
56
57
|
|
|
@@ -200,10 +201,19 @@ export async function startAuthorize(
|
|
|
200
201
|
const nonce = (deps.newNonce ?? randomToken)()
|
|
201
202
|
const flowTtl = deps.flowTtlMs ?? DEFAULT_FLOW_TTL_MS
|
|
202
203
|
const now = deps.clock()
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
204
|
+
// Source of truth for callback derivation — every other site that needs
|
|
205
|
+
// this URL goes through `callbackTarget` so they cannot drift apart.
|
|
206
|
+
// Note `path` is the *inbound* route (no mount prefix; the proxy strips
|
|
207
|
+
// it before we see the request) while `url` is the public form.
|
|
208
|
+
const {
|
|
209
|
+
host: callbackHost,
|
|
210
|
+
path: callbackPath,
|
|
211
|
+
url: callbackUrl,
|
|
212
|
+
} = callbackTarget({
|
|
213
|
+
issuerUrl: deps.issuerUrl,
|
|
214
|
+
methodId,
|
|
215
|
+
callbackHost: deps.callbackHostFor?.(tenant.id),
|
|
216
|
+
})
|
|
207
217
|
|
|
208
218
|
const record: FlowRecord = {
|
|
209
219
|
flowId,
|
|
@@ -262,6 +272,7 @@ export async function startAuthorize(
|
|
|
262
272
|
flow: record,
|
|
263
273
|
cookies: input.cookies,
|
|
264
274
|
sessionStore: deps.sessionStore,
|
|
275
|
+
issuerUrl: deps.issuerUrl,
|
|
265
276
|
dispatch: {
|
|
266
277
|
state: stateEnvelope,
|
|
267
278
|
callbackUrl,
|
package/src/domain/callback.ts
CHANGED
|
@@ -35,6 +35,7 @@ import { safeAudit } from "./audit"
|
|
|
35
35
|
import { randomToken } from "./crypto"
|
|
36
36
|
import { MethodCache } from "./method-cache"
|
|
37
37
|
import { dispatchMethod } from "./method-dispatch"
|
|
38
|
+
import { callbackTarget } from "./mount"
|
|
38
39
|
import { saveEncryptedCode } from "./token"
|
|
39
40
|
import { verifyStateEnvelope } from "./state-envelope"
|
|
40
41
|
import { AUTH_CODE_TTL_MS } from "./authorize"
|
|
@@ -67,12 +68,13 @@ export type HandleCallbackInput = {
|
|
|
67
68
|
*/
|
|
68
69
|
tenant?: TenantContext
|
|
69
70
|
/**
|
|
70
|
-
* Per-request issuer URL (HTTP layer).
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
71
|
+
* Per-request issuer URL (HTTP layer). The IdP-initiated path derives
|
|
72
|
+
* the SP entityID / ACS from it — the same derivation the AuthnRequest
|
|
73
|
+
* and metadata paths use, so the values cannot drift — and every
|
|
74
|
+
* dispatched method receives it as `MethodContext.issuerUrl` to build
|
|
75
|
+
* mount-prefixed URLs of its own.
|
|
74
76
|
*/
|
|
75
|
-
issuerUrl
|
|
77
|
+
issuerUrl: string
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
export type HandleCallbackDeps = {
|
|
@@ -241,6 +243,7 @@ export async function handleCallback(
|
|
|
241
243
|
flow,
|
|
242
244
|
cookies: input.cookies,
|
|
243
245
|
sessionStore: deps.sessionStore,
|
|
246
|
+
issuerUrl: input.issuerUrl,
|
|
244
247
|
dispatch: null,
|
|
245
248
|
})
|
|
246
249
|
if (isErr(dispatched)) return err(dispatched.error)
|
|
@@ -351,7 +354,7 @@ async function tryIdpInitiated(
|
|
|
351
354
|
url: URL,
|
|
352
355
|
): Promise<Result<CallbackOutput, AuthError> | null> {
|
|
353
356
|
if (input.rawRequest.method !== "POST") return null
|
|
354
|
-
if (!input.tenant
|
|
357
|
+
if (!input.tenant) return null
|
|
355
358
|
|
|
356
359
|
const segments = url.pathname.split("/").filter(Boolean)
|
|
357
360
|
if (segments.length < 2 || segments[0] !== "cb") return null
|
|
@@ -365,7 +368,14 @@ async function tryIdpInitiated(
|
|
|
365
368
|
const method = methodRes.value
|
|
366
369
|
if (method.unsolicitedCallback !== true) return null
|
|
367
370
|
|
|
368
|
-
|
|
371
|
+
// Derived from `issuerUrl`, not the inbound request URL: a path-mounted
|
|
372
|
+
// deployment sees a proxy-stripped pathname, so rebuilding from `url`
|
|
373
|
+
// would emit a callback URL missing the mount prefix.
|
|
374
|
+
const { url: callbackUrl } = callbackTarget({
|
|
375
|
+
issuerUrl: input.issuerUrl,
|
|
376
|
+
methodId,
|
|
377
|
+
callbackHost: url.host,
|
|
378
|
+
})
|
|
369
379
|
const dispatched = await dispatchMethod({
|
|
370
380
|
method,
|
|
371
381
|
route: "GET /callback",
|
|
@@ -375,6 +385,7 @@ async function tryIdpInitiated(
|
|
|
375
385
|
flow: null,
|
|
376
386
|
cookies: input.cookies,
|
|
377
387
|
sessionStore: deps.sessionStore,
|
|
388
|
+
issuerUrl: input.issuerUrl,
|
|
378
389
|
dispatch: { state: "", callbackUrl, issuerUrl: input.issuerUrl },
|
|
379
390
|
})
|
|
380
391
|
if (isErr(dispatched)) return err(dispatched.error)
|
|
@@ -33,6 +33,11 @@ export type DispatchInput = {
|
|
|
33
33
|
flow: FlowRecord | null
|
|
34
34
|
cookies: ReadonlyMap<string, string>
|
|
35
35
|
sessionStore: SessionStore
|
|
36
|
+
/**
|
|
37
|
+
* Issuer URL of this IdP. Always required — unlike `dispatch`, methods
|
|
38
|
+
* need it on every route to emit mount-prefixed URLs of their own.
|
|
39
|
+
*/
|
|
40
|
+
issuerUrl: string
|
|
36
41
|
/** Populated at `GET /authorize`; null on callbacks. */
|
|
37
42
|
dispatch: MethodDispatchData | null
|
|
38
43
|
}
|
|
@@ -57,6 +62,7 @@ export async function dispatchMethod(
|
|
|
57
62
|
|
|
58
63
|
const ctx: MethodContext<unknown> = {
|
|
59
64
|
request: input.request,
|
|
65
|
+
issuerUrl: input.issuerUrl,
|
|
60
66
|
subPath: input.subPath,
|
|
61
67
|
tenant: input.tenant,
|
|
62
68
|
flow: input.flow,
|
|
@@ -79,6 +79,12 @@ export type HandleMethodRouteInput = {
|
|
|
79
79
|
/** flowId from the `idp.flow` cookie. */
|
|
80
80
|
flowId: string
|
|
81
81
|
cookies: ReadonlyMap<string, string>
|
|
82
|
+
/**
|
|
83
|
+
* Issuer URL — passed to the method so it can emit mount-prefixed URLs
|
|
84
|
+
* (a re-rendered form action, say). The inbound request URL cannot
|
|
85
|
+
* supply this: a proxy has already stripped the mount prefix from it.
|
|
86
|
+
*/
|
|
87
|
+
issuerUrl: string
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
export type HandleMethodRouteDeps = {
|
|
@@ -139,6 +145,7 @@ export async function handleMethodRoute(
|
|
|
139
145
|
flow,
|
|
140
146
|
cookies: input.cookies,
|
|
141
147
|
sessionStore: deps.sessionStore,
|
|
148
|
+
issuerUrl: input.issuerUrl,
|
|
142
149
|
dispatch: null,
|
|
143
150
|
})
|
|
144
151
|
if (isErr(dispatched)) return err(dispatched.error)
|
|
@@ -295,6 +302,7 @@ export async function handlePublicMethodRoute(
|
|
|
295
302
|
flow: null,
|
|
296
303
|
cookies: new Map(),
|
|
297
304
|
sessionStore: deps.sessionStore,
|
|
305
|
+
issuerUrl: input.dispatch.issuerUrl,
|
|
298
306
|
dispatch: input.dispatch,
|
|
299
307
|
})
|
|
300
308
|
if (isErr(dispatched)) return err(dispatched.error)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount prefix — where this IdP sits under its origin.
|
|
3
|
+
*
|
|
4
|
+
* The library serves its routes at its own root (`/authorize`, `/m/*`,
|
|
5
|
+
* `/cb/*`); a deployment may sit behind a reverse proxy that strips a path
|
|
6
|
+
* prefix before forwarding. Routing is unaffected — but every URL the
|
|
7
|
+
* library *emits* (form actions, upstream `redirect_uri`s, SAML metadata)
|
|
8
|
+
* is consumed on the public side of that proxy and must carry the prefix.
|
|
9
|
+
*
|
|
10
|
+
* `issuerUrl` already carries it. It is the single source of truth: there
|
|
11
|
+
* is deliberately no `basePath` option, because two sources could disagree
|
|
12
|
+
* and the `iss` claim would then contradict the URLs we hand out.
|
|
13
|
+
*
|
|
14
|
+
* All emitted-URL construction goes through this module. `metadata.test.ts`
|
|
15
|
+
* is an anti-drift test asserting the SAML entityID/ACS equal what
|
|
16
|
+
* `buildAuthnRequestRedirect` derives; funnelling every site through
|
|
17
|
+
* `callbackTarget` is what keeps that true.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The normalised mount prefix of `issuerUrl`: `""` for a root-mounted
|
|
22
|
+
* deployment, otherwise a leading-slash, no-trailing-slash path.
|
|
23
|
+
*
|
|
24
|
+
* https://example.com -> ""
|
|
25
|
+
* https://example.com/ -> ""
|
|
26
|
+
* https://example.com/idp -> "/idp"
|
|
27
|
+
* https://example.com/idp/ -> "/idp"
|
|
28
|
+
* https://example.com//idp// -> "/idp"
|
|
29
|
+
*
|
|
30
|
+
* A root-mounted issuer must yield `""` and not `"/"`, so that existing
|
|
31
|
+
* deployments emit byte-identical URLs to before this existed.
|
|
32
|
+
*
|
|
33
|
+
* An unparseable `issuerUrl` yields `""` rather than throwing: emitting a
|
|
34
|
+
* root-relative URL degrades to the pre-existing behaviour, whereas
|
|
35
|
+
* throwing would turn a misconfiguration into a 500 from inside form
|
|
36
|
+
* rendering. Misconfiguration still fails loudly at `/authorize`, which
|
|
37
|
+
* parses `issuerUrl` for the callback host.
|
|
38
|
+
*/
|
|
39
|
+
export function mountPath(issuerUrl: string): string {
|
|
40
|
+
let pathname: string
|
|
41
|
+
try {
|
|
42
|
+
pathname = new URL(issuerUrl).pathname
|
|
43
|
+
} catch {
|
|
44
|
+
return ""
|
|
45
|
+
}
|
|
46
|
+
const segments = pathname.split("/").filter(Boolean)
|
|
47
|
+
return segments.length === 0 ? "" : `/${segments.join("/")}`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A path-absolute URL for one of the library's own routes, carrying the
|
|
52
|
+
* deployment's mount prefix. `path` is the route as the service itself
|
|
53
|
+
* serves it, with a leading slash.
|
|
54
|
+
*
|
|
55
|
+
* mountedPath("https://x/idp", "/m/code/send") -> "/idp/m/code/send"
|
|
56
|
+
* mountedPath("https://x", "/m/code/send") -> "/m/code/send"
|
|
57
|
+
*/
|
|
58
|
+
export function mountedPath(issuerUrl: string, path: string): string {
|
|
59
|
+
return `${mountPath(issuerUrl)}${path}`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Where a method's callback lives, in the two forms the framework needs.
|
|
64
|
+
*
|
|
65
|
+
* The distinction matters under a path-mounted deployment and is the
|
|
66
|
+
* reason these are derived together rather than one from the other:
|
|
67
|
+
* `url` is public (registered with upstream providers, advertised in SAML
|
|
68
|
+
* metadata) and carries the mount prefix, while `path` is what the
|
|
69
|
+
* inbound request actually looks like after the proxy has stripped that
|
|
70
|
+
* prefix, and so must not.
|
|
71
|
+
*/
|
|
72
|
+
export type CallbackTarget = {
|
|
73
|
+
/** Public, fully-qualified callback URL. Carries the mount prefix. */
|
|
74
|
+
url: string
|
|
75
|
+
/** Host the callback is expected to arrive on. */
|
|
76
|
+
host: string
|
|
77
|
+
/**
|
|
78
|
+
* Expected pathname of the inbound request — this service's own route,
|
|
79
|
+
* *without* the mount prefix, because the proxy has already stripped it.
|
|
80
|
+
* Persisted on `FlowRecord.callbackPath` and matched in `domain/callback.ts`.
|
|
81
|
+
*/
|
|
82
|
+
path: string
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The single derivation point for a method's callback URL.
|
|
87
|
+
*
|
|
88
|
+
* `callbackHost` is the optional per-tenant override from
|
|
89
|
+
* `IdPOptions.callbackHostFor`. **The issuer's mount prefix applies even
|
|
90
|
+
* when that override is in effect.** `callbackHostFor` exists to partition
|
|
91
|
+
* callbacks across hostnames so a tenant is recoverable from the `Host`
|
|
92
|
+
* header before the state envelope is verified (tenant-recovery mechanism
|
|
93
|
+
* #2) — it varies the authority of the *same* deployment, not the
|
|
94
|
+
* deployment itself. Those hosts are served by this service behind the
|
|
95
|
+
* same proxy, so they share its mount. A deployment needing partitioned
|
|
96
|
+
* hosts mounted differently from the issuer is describing two mounts,
|
|
97
|
+
* which one `issuerUrl` cannot express and a second option must not be
|
|
98
|
+
* introduced to paper over.
|
|
99
|
+
*/
|
|
100
|
+
export function callbackTarget(input: {
|
|
101
|
+
issuerUrl: string
|
|
102
|
+
methodId: string
|
|
103
|
+
callbackHost?: string | undefined
|
|
104
|
+
}): CallbackTarget {
|
|
105
|
+
const issuer = new URL(input.issuerUrl)
|
|
106
|
+
const host = input.callbackHost ?? issuer.host
|
|
107
|
+
const path = `/cb/${input.methodId}`
|
|
108
|
+
return {
|
|
109
|
+
host,
|
|
110
|
+
path,
|
|
111
|
+
url: `${issuer.protocol}//${host}${mountPath(input.issuerUrl)}${path}`,
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
handlePublicMethodRoute,
|
|
13
13
|
} from "../../domain/method-route"
|
|
14
14
|
import type { RouteKey } from "../../domain/method-dispatch"
|
|
15
|
+
import { callbackTarget } from "../../domain/mount"
|
|
15
16
|
import { authError } from "../../types/error"
|
|
16
17
|
import { isErr } from "../../types/result"
|
|
17
18
|
|
|
@@ -51,13 +52,15 @@ export function makeMethodRouteHandler(deps: HttpDeps) {
|
|
|
51
52
|
resolved.value.publicRoutes?.includes(routeKey)
|
|
52
53
|
) {
|
|
53
54
|
const issuerUrl = c.get("issuerUrl")
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// Mirrors the ACS URL derivation in domain/authorize.ts
|
|
57
|
-
// (callbackHost/path/url). Source of truth is there; the
|
|
55
|
+
// Same derivation as domain/authorize.ts — both call
|
|
56
|
+
// `callbackTarget`, which is the single source of truth. The
|
|
58
57
|
// metadata.test.ts anti-drift test asserts the emitted
|
|
59
58
|
// entityID/ACS equal what buildAuthnRequestRedirect derives.
|
|
60
|
-
const callbackUrl =
|
|
59
|
+
const { url: callbackUrl } = callbackTarget({
|
|
60
|
+
issuerUrl,
|
|
61
|
+
methodId,
|
|
62
|
+
callbackHost: deps.callbackHostFor?.(tenant.id),
|
|
63
|
+
})
|
|
61
64
|
const pub = await handlePublicMethodRoute(
|
|
62
65
|
{
|
|
63
66
|
rawRequest: c.req.raw,
|
|
@@ -122,6 +125,7 @@ export function makeMethodRouteHandler(deps: HttpDeps) {
|
|
|
122
125
|
httpMethod,
|
|
123
126
|
flowId,
|
|
124
127
|
cookies,
|
|
128
|
+
issuerUrl: c.get("issuerUrl"),
|
|
125
129
|
},
|
|
126
130
|
{
|
|
127
131
|
sessionStore: deps.sessionStore,
|
package/src/index.ts
CHANGED
|
@@ -133,6 +133,23 @@ export type { TokenStore } from "./ports/token-store"
|
|
|
133
133
|
*/
|
|
134
134
|
export { revokeAllForSubject } from "./domain/revoke"
|
|
135
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Build a path-absolute URL for one of the library's own routes, carrying
|
|
138
|
+
* the mount prefix from `issuerUrl`.
|
|
139
|
+
*
|
|
140
|
+
* Custom methods that render their own URLs — a form `action`, say — must
|
|
141
|
+
* use this rather than a path-absolute literal, or the URL will 404 under
|
|
142
|
+
* a deployment mounted behind a proxy at a path prefix. Root-mounted
|
|
143
|
+
* issuers yield the literal unchanged.
|
|
144
|
+
*
|
|
145
|
+
* mountedPath(ctx.issuerUrl, `/m/${id}/send`)
|
|
146
|
+
* // "https://x" -> "/m/mycode/send"
|
|
147
|
+
* // "https://x/idp" -> "/idp/m/mycode/send"
|
|
148
|
+
*
|
|
149
|
+
* See INTEGRATION.md § 8.
|
|
150
|
+
*/
|
|
151
|
+
export { mountedPath, mountPath } from "./domain/mount"
|
|
152
|
+
|
|
136
153
|
// Phase 4 — credential + WebAuthn method factories.
|
|
137
154
|
export { passwordMethod } from "./methods/password"
|
|
138
155
|
export type {
|
package/src/methods/code.ts
CHANGED
|
@@ -31,6 +31,7 @@ import type {
|
|
|
31
31
|
MethodContext,
|
|
32
32
|
MethodResult,
|
|
33
33
|
} from "../types/method"
|
|
34
|
+
import { mountedPath } from "../domain/mount"
|
|
34
35
|
import { renderForm } from "../ui/forms"
|
|
35
36
|
|
|
36
37
|
export type CodeProperties = {
|
|
@@ -120,12 +121,12 @@ export function codeMethod(
|
|
|
120
121
|
kind,
|
|
121
122
|
type: "code",
|
|
122
123
|
routes: {
|
|
123
|
-
"GET /authorize": async (
|
|
124
|
+
"GET /authorize": async (ctx) => ({
|
|
124
125
|
kind: "challenge",
|
|
125
126
|
response: htmlResponse(
|
|
126
127
|
renderForm({
|
|
127
128
|
title: titleRequest,
|
|
128
|
-
action: `/m/${id}/send
|
|
129
|
+
action: mountedPath(ctx.issuerUrl, `/m/${id}/send`),
|
|
129
130
|
fields: destinationField(destinationKind),
|
|
130
131
|
submit: "Send code",
|
|
131
132
|
}),
|
|
@@ -169,7 +170,7 @@ async function handleSend(
|
|
|
169
170
|
response: htmlResponse(
|
|
170
171
|
renderForm({
|
|
171
172
|
title: titleRequest,
|
|
172
|
-
action: `/m/${methodId}/send
|
|
173
|
+
action: mountedPath(ctx.issuerUrl, `/m/${methodId}/send`),
|
|
173
174
|
fields: destinationField(destinationKind),
|
|
174
175
|
submit: "Send code",
|
|
175
176
|
error: "Please enter a valid destination.",
|
|
@@ -193,7 +194,7 @@ async function handleSend(
|
|
|
193
194
|
response: htmlResponse(
|
|
194
195
|
renderForm({
|
|
195
196
|
title: titleVerify,
|
|
196
|
-
action: `/m/${methodId}/verify
|
|
197
|
+
action: mountedPath(ctx.issuerUrl, `/m/${methodId}/verify`),
|
|
197
198
|
fields: [
|
|
198
199
|
{
|
|
199
200
|
name: "code",
|
|
@@ -238,7 +239,13 @@ async function handleVerify(
|
|
|
238
239
|
const form = await safeForm(ctx.request)
|
|
239
240
|
const parsed = verifyBody.safeParse(form)
|
|
240
241
|
if (!parsed.success) {
|
|
241
|
-
return verifyError(
|
|
242
|
+
return verifyError(
|
|
243
|
+
ctx.issuerUrl,
|
|
244
|
+
methodId,
|
|
245
|
+
state,
|
|
246
|
+
titleVerify,
|
|
247
|
+
"Please enter the code.",
|
|
248
|
+
)
|
|
242
249
|
}
|
|
243
250
|
|
|
244
251
|
const submittedHash = base64url.encode(
|
|
@@ -246,6 +253,7 @@ async function handleVerify(
|
|
|
246
253
|
)
|
|
247
254
|
if (!timingSafeEqualStr(submittedHash, state.codeHash)) {
|
|
248
255
|
return verifyError(
|
|
256
|
+
ctx.issuerUrl,
|
|
249
257
|
methodId,
|
|
250
258
|
{ ...state, attempts: state.attempts + 1 },
|
|
251
259
|
titleVerify,
|
|
@@ -261,6 +269,7 @@ async function handleVerify(
|
|
|
261
269
|
}
|
|
262
270
|
|
|
263
271
|
function verifyError(
|
|
272
|
+
issuerUrl: string,
|
|
264
273
|
methodId: string,
|
|
265
274
|
next: CodeState,
|
|
266
275
|
titleVerify: string,
|
|
@@ -271,7 +280,7 @@ function verifyError(
|
|
|
271
280
|
response: htmlResponse(
|
|
272
281
|
renderForm({
|
|
273
282
|
title: titleVerify,
|
|
274
|
-
action: `/m/${methodId}/verify
|
|
283
|
+
action: mountedPath(issuerUrl, `/m/${methodId}/verify`),
|
|
275
284
|
fields: [
|
|
276
285
|
{
|
|
277
286
|
name: "code",
|
|
@@ -37,6 +37,7 @@ import { createRemoteJWKSet, jwtVerify } from "jose"
|
|
|
37
37
|
*/
|
|
38
38
|
type IdTokenClaims = Record<string, unknown>
|
|
39
39
|
|
|
40
|
+
import { mountedPath } from "../domain/mount"
|
|
40
41
|
import { authError } from "../types/error"
|
|
41
42
|
import type { AuthMethod, MethodContext, MethodResult } from "../types/method"
|
|
42
43
|
import type { MethodType } from "../types/tenant"
|
|
@@ -212,7 +213,11 @@ async function exchangeAndSucceed(
|
|
|
212
213
|
error: authError.internalError("flow missing on callback"),
|
|
213
214
|
}
|
|
214
215
|
}
|
|
215
|
-
|
|
216
|
+
// The `redirect_uri` on the token exchange must be byte-identical to the
|
|
217
|
+
// one sent on the authorize redirect (OAuth 2.1 §4.1.3). `flow.callbackPath`
|
|
218
|
+
// is the *inbound* route, which a path-mounted proxy has stripped the mount
|
|
219
|
+
// prefix from, so re-apply it here rather than replaying the stored path.
|
|
220
|
+
const callbackUrl = `${new URL(ctx.request.url).protocol}//${ctx.flow.callbackHost}${mountedPath(ctx.issuerUrl, ctx.flow.callbackPath)}`
|
|
216
221
|
|
|
217
222
|
const body = new URLSearchParams({
|
|
218
223
|
grant_type: "authorization_code",
|
package/src/methods/passkey.ts
CHANGED
|
@@ -32,6 +32,7 @@ import type {
|
|
|
32
32
|
MethodContext,
|
|
33
33
|
MethodResult,
|
|
34
34
|
} from "../types/method"
|
|
35
|
+
import { mountedPath } from "../domain/mount"
|
|
35
36
|
import { renderForm } from "../ui/forms"
|
|
36
37
|
|
|
37
38
|
export type PasskeyProperties = {
|
|
@@ -146,12 +147,15 @@ export function passkeyMethod(
|
|
|
146
147
|
kind,
|
|
147
148
|
type: "passkey",
|
|
148
149
|
routes: {
|
|
149
|
-
"GET /authorize": async () => ({
|
|
150
|
+
"GET /authorize": async (ctx) => ({
|
|
150
151
|
kind: "challenge",
|
|
151
152
|
response: htmlResponse(
|
|
152
153
|
renderForm({
|
|
153
154
|
title: settings.title,
|
|
154
|
-
action:
|
|
155
|
+
action: mountedPath(
|
|
156
|
+
ctx.issuerUrl,
|
|
157
|
+
`/m/${id}/authenticate-options`,
|
|
158
|
+
),
|
|
155
159
|
fields: [
|
|
156
160
|
{
|
|
157
161
|
name: "username",
|