@_mustachio/openauth 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/adapters/memory/session-store.js +22 -0
- package/dist/esm/adapters/memory/token-store.js +13 -0
- package/dist/esm/client.js +9 -2
- package/dist/esm/domain/authorize.js +5 -0
- package/dist/esm/domain/callback.js +3 -0
- package/dist/esm/domain/discovery.js +44 -2
- package/dist/esm/domain/dpop.js +122 -0
- package/dist/esm/domain/id-token.js +94 -0
- package/dist/esm/domain/introspect.js +5 -1
- package/dist/esm/domain/jwt.js +28 -0
- package/dist/esm/domain/logout.js +75 -0
- package/dist/esm/domain/method-route.js +3 -0
- package/dist/esm/domain/par.js +51 -0
- package/dist/esm/domain/refresh.js +12 -1
- package/dist/esm/domain/register.js +74 -0
- package/dist/esm/domain/token-exchange.js +1 -0
- package/dist/esm/domain/token.js +48 -7
- package/dist/esm/domain/userinfo.js +38 -3
- package/dist/esm/http/handlers/authorize.js +90 -3
- package/dist/esm/http/handlers/end-session.js +64 -0
- package/dist/esm/http/handlers/metadata.js +5 -2
- package/dist/esm/http/handlers/par.js +53 -0
- package/dist/esm/http/handlers/register.js +46 -0
- package/dist/esm/http/handlers/token.js +36 -6
- package/dist/esm/http/handlers/userinfo.js +35 -29
- package/dist/esm/http/router.js +10 -0
- package/dist/esm/http/schemas/authorize.js +7 -1
- package/dist/esm/http/schemas/end-session.js +13 -0
- package/dist/esm/http/schemas/par.js +9 -0
- package/dist/esm/http/schemas/register.js +16 -0
- package/dist/esm/index.js +7 -2
- package/dist/esm/types/error.js +5 -0
- package/dist/types/adapters/memory/session-store.d.ts +3 -1
- package/dist/types/adapters/memory/session-store.d.ts.map +1 -1
- package/dist/types/adapters/memory/token-store.d.ts +1 -0
- package/dist/types/adapters/memory/token-store.d.ts.map +1 -1
- package/dist/types/client.d.ts +19 -0
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/domain/authorize.d.ts.map +1 -1
- package/dist/types/domain/client-credentials.d.ts +2 -0
- package/dist/types/domain/client-credentials.d.ts.map +1 -1
- package/dist/types/domain/discovery.d.ts +37 -0
- package/dist/types/domain/discovery.d.ts.map +1 -1
- package/dist/types/domain/dpop.d.ts +61 -0
- package/dist/types/domain/dpop.d.ts.map +1 -0
- package/dist/types/domain/id-token.d.ts +83 -0
- package/dist/types/domain/id-token.d.ts.map +1 -0
- package/dist/types/domain/introspect.d.ts +8 -0
- package/dist/types/domain/introspect.d.ts.map +1 -1
- package/dist/types/domain/jwt.d.ts +27 -1
- package/dist/types/domain/jwt.d.ts.map +1 -1
- package/dist/types/domain/logout.d.ts +69 -0
- package/dist/types/domain/logout.d.ts.map +1 -0
- package/dist/types/domain/par.d.ts +62 -0
- package/dist/types/domain/par.d.ts.map +1 -0
- package/dist/types/domain/refresh.d.ts +9 -0
- package/dist/types/domain/refresh.d.ts.map +1 -1
- package/dist/types/domain/register.d.ts +33 -0
- package/dist/types/domain/register.d.ts.map +1 -0
- package/dist/types/domain/token-exchange.d.ts +2 -0
- package/dist/types/domain/token-exchange.d.ts.map +1 -1
- package/dist/types/domain/token.d.ts +41 -1
- package/dist/types/domain/token.d.ts.map +1 -1
- package/dist/types/domain/userinfo.d.ts +44 -5
- package/dist/types/domain/userinfo.d.ts.map +1 -1
- package/dist/types/http/context.d.ts +4 -1
- package/dist/types/http/context.d.ts.map +1 -1
- package/dist/types/http/handlers/authorize.d.ts.map +1 -1
- package/dist/types/http/handlers/end-session.d.ts +3 -0
- package/dist/types/http/handlers/end-session.d.ts.map +1 -0
- package/dist/types/http/handlers/metadata.d.ts +1 -1
- package/dist/types/http/handlers/metadata.d.ts.map +1 -1
- package/dist/types/http/handlers/par.d.ts +3 -0
- package/dist/types/http/handlers/par.d.ts.map +1 -0
- package/dist/types/http/handlers/register.d.ts +3 -0
- package/dist/types/http/handlers/register.d.ts.map +1 -0
- package/dist/types/http/handlers/token.d.ts.map +1 -1
- package/dist/types/http/handlers/userinfo.d.ts.map +1 -1
- package/dist/types/http/router.d.ts.map +1 -1
- package/dist/types/http/schemas/authorize.d.ts +40 -0
- package/dist/types/http/schemas/authorize.d.ts.map +1 -1
- package/dist/types/http/schemas/end-session.d.ts +31 -0
- package/dist/types/http/schemas/end-session.d.ts.map +1 -0
- package/dist/types/http/schemas/par.d.ts +20 -0
- package/dist/types/http/schemas/par.d.ts.map +1 -0
- package/dist/types/http/schemas/register.d.ts +42 -0
- package/dist/types/http/schemas/register.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/ports/audit-log.d.ts +27 -0
- package/dist/types/ports/audit-log.d.ts.map +1 -1
- package/dist/types/ports/session-store.d.ts +27 -0
- package/dist/types/ports/session-store.d.ts.map +1 -1
- package/dist/types/ports/token-store.d.ts +12 -0
- package/dist/types/ports/token-store.d.ts.map +1 -1
- package/dist/types/types/authorization.d.ts +23 -0
- package/dist/types/types/authorization.d.ts.map +1 -1
- package/dist/types/types/error.d.ts +9 -0
- package/dist/types/types/error.d.ts.map +1 -1
- package/dist/types/types/flow.d.ts +10 -0
- package/dist/types/types/flow.d.ts.map +1 -1
- package/dist/types/types/idp.d.ts +91 -1
- package/dist/types/types/idp.d.ts.map +1 -1
- package/dist/types/types/tenant.d.ts +37 -0
- package/dist/types/types/tenant.d.ts.map +1 -1
- package/dist/types/types/token.d.ts +128 -0
- package/dist/types/types/token.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/adapters/memory/session-store.ts +44 -1
- package/src/adapters/memory/token-store.ts +16 -0
- package/src/client.ts +32 -0
- package/src/domain/authorize.ts +9 -0
- package/src/domain/callback.ts +5 -0
- package/src/domain/client-credentials.ts +2 -0
- package/src/domain/discovery.ts +80 -2
- package/src/domain/dpop.ts +293 -0
- package/src/domain/id-token.ts +213 -0
- package/src/domain/introspect.ts +10 -0
- package/src/domain/jwt.ts +80 -1
- package/src/domain/logout.ts +180 -0
- package/src/domain/method-route.ts +5 -0
- package/src/domain/par.ts +141 -0
- package/src/domain/refresh.ts +41 -0
- package/src/domain/register.ts +168 -0
- package/src/domain/token-exchange.ts +11 -0
- package/src/domain/token.ts +134 -8
- package/src/domain/userinfo.ts +121 -6
- package/src/http/context.ts +4 -0
- package/src/http/handlers/authorize.ts +144 -3
- package/src/http/handlers/end-session.ts +106 -0
- package/src/http/handlers/metadata.ts +7 -2
- package/src/http/handlers/par.ts +84 -0
- package/src/http/handlers/register.ts +70 -0
- package/src/http/handlers/token.ts +56 -0
- package/src/http/handlers/userinfo.ts +62 -38
- package/src/http/router.ts +19 -0
- package/src/http/schemas/authorize.ts +27 -0
- package/src/http/schemas/end-session.ts +23 -0
- package/src/http/schemas/par.ts +23 -0
- package/src/http/schemas/register.ts +29 -0
- package/src/index.ts +18 -1
- package/src/ports/CONSISTENCY.md +52 -21
- package/src/ports/audit-log.ts +29 -0
- package/src/ports/session-store.ts +33 -0
- package/src/ports/token-store.ts +13 -0
- package/src/types/authorization.ts +25 -0
- package/src/types/error.ts +23 -0
- package/src/types/flow.ts +10 -0
- package/src/types/idp.ts +96 -0
- package/src/types/tenant.ts +37 -0
- package/src/types/token.ts +135 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/http/handlers/token.ts
|
|
2
2
|
import { clientCredentialsGrant } from "../../domain/client-credentials";
|
|
3
|
+
import { canonicalHtu, verifyDpopProof } from "../../domain/dpop";
|
|
3
4
|
import { exchangeCode } from "../../domain/token";
|
|
4
5
|
import { exchangeToken } from "../../domain/token-exchange";
|
|
5
6
|
import { refreshTokens } from "../../domain/refresh";
|
|
@@ -19,6 +20,29 @@ function makeTokenHandler(deps) {
|
|
|
19
20
|
body.set("client_id", basic.id);
|
|
20
21
|
body.set("client_secret", basic.secret);
|
|
21
22
|
}
|
|
23
|
+
const dpopHeader = c.req.header("dpop") ?? null;
|
|
24
|
+
let dpopJkt;
|
|
25
|
+
if (dpopHeader) {
|
|
26
|
+
const dpopRes = await verifyDpopProof({
|
|
27
|
+
proofJwt: dpopHeader,
|
|
28
|
+
htu: canonicalHtu(c.req.url),
|
|
29
|
+
htm: "POST",
|
|
30
|
+
nowSec: Math.floor(deps.clock() / 1000)
|
|
31
|
+
}, { tokenStore: deps.tokenStore });
|
|
32
|
+
if (isErr(dpopRes)) {
|
|
33
|
+
const errVal = dpopRes.error;
|
|
34
|
+
if (errVal.code === "invalid_dpop_proof" && errVal.replaySignal && deps.auditLog) {
|
|
35
|
+
await deps.auditLog.log({
|
|
36
|
+
kind: "dpop_replay_detected",
|
|
37
|
+
tenantId: null,
|
|
38
|
+
jtiPrefix: errVal.replaySignal.jti.slice(0, 16),
|
|
39
|
+
timestamp: deps.clock()
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return tokenEndpointErrorResponse(errVal);
|
|
43
|
+
}
|
|
44
|
+
dpopJkt = dpopRes.value.jkt;
|
|
45
|
+
}
|
|
22
46
|
const parsed = tokenRequestSchema.safeParse(Object.fromEntries(body.entries()));
|
|
23
47
|
if (!parsed.success) {
|
|
24
48
|
const first = parsed.error.issues[0];
|
|
@@ -35,7 +59,8 @@ function makeTokenHandler(deps) {
|
|
|
35
59
|
redirectUri: req.redirect_uri,
|
|
36
60
|
clientId: req.client_id,
|
|
37
61
|
...req.client_secret !== undefined ? { clientSecret: req.client_secret } : {},
|
|
38
|
-
...req.code_verifier !== undefined ? { codeVerifier: req.code_verifier } : {}
|
|
62
|
+
...req.code_verifier !== undefined ? { codeVerifier: req.code_verifier } : {},
|
|
63
|
+
...dpopJkt !== undefined ? { dpopJkt } : {}
|
|
39
64
|
}, {
|
|
40
65
|
configStore: deps.configStore,
|
|
41
66
|
tokenStore: deps.tokenStore,
|
|
@@ -44,7 +69,8 @@ function makeTokenHandler(deps) {
|
|
|
44
69
|
success: deps.success,
|
|
45
70
|
...deps.persistUpstreamTokens ? { persistUpstreamTokens: deps.persistUpstreamTokens } : {},
|
|
46
71
|
issuerUrl: c.get("issuerUrl"),
|
|
47
|
-
clock: deps.clock
|
|
72
|
+
clock: deps.clock,
|
|
73
|
+
...deps.customScopeClaims !== undefined ? { customScopeClaims: deps.customScopeClaims } : {}
|
|
48
74
|
});
|
|
49
75
|
if (isErr(result))
|
|
50
76
|
return tokenEndpointErrorResponse(result.error);
|
|
@@ -75,7 +101,8 @@ function makeTokenHandler(deps) {
|
|
|
75
101
|
success: deps.success,
|
|
76
102
|
...deps.persistUpstreamTokens ? { persistUpstreamTokens: deps.persistUpstreamTokens } : {},
|
|
77
103
|
issuerUrl: c.get("issuerUrl"),
|
|
78
|
-
clock: deps.clock
|
|
104
|
+
clock: deps.clock,
|
|
105
|
+
...deps.customScopeClaims !== undefined ? { customScopeClaims: deps.customScopeClaims } : {}
|
|
79
106
|
}, tenantRes.value);
|
|
80
107
|
if (isErr(result))
|
|
81
108
|
return tokenEndpointErrorResponse(result.error);
|
|
@@ -87,14 +114,16 @@ function makeTokenHandler(deps) {
|
|
|
87
114
|
refreshToken: req.refresh_token,
|
|
88
115
|
...req.scope !== undefined ? { scope: req.scope } : {},
|
|
89
116
|
...req.client_id !== undefined ? { clientId: req.client_id } : {},
|
|
90
|
-
...req.client_secret !== undefined ? { clientSecret: req.client_secret } : {}
|
|
117
|
+
...req.client_secret !== undefined ? { clientSecret: req.client_secret } : {},
|
|
118
|
+
...dpopJkt !== undefined ? { dpopJkt } : {}
|
|
91
119
|
}, {
|
|
92
120
|
configStore: deps.configStore,
|
|
93
121
|
tokenStore: deps.tokenStore,
|
|
94
122
|
keyStore: deps.keyStore,
|
|
95
123
|
...deps.auditLog ? { auditLog: deps.auditLog } : {},
|
|
96
124
|
issuerUrl: c.get("issuerUrl"),
|
|
97
|
-
clock: deps.clock
|
|
125
|
+
clock: deps.clock,
|
|
126
|
+
...deps.customScopeClaims !== undefined ? { customScopeClaims: deps.customScopeClaims } : {}
|
|
98
127
|
});
|
|
99
128
|
if (isErr(refreshResult))
|
|
100
129
|
return tokenEndpointErrorResponse(refreshResult.error);
|
|
@@ -117,7 +146,8 @@ function makeTokenHandler(deps) {
|
|
|
117
146
|
...deps.auditLog ? { auditLog: deps.auditLog } : {},
|
|
118
147
|
...deps.exchangeAudience ? { exchangeAudience: deps.exchangeAudience } : {},
|
|
119
148
|
issuerUrl: c.get("issuerUrl"),
|
|
120
|
-
clock: deps.clock
|
|
149
|
+
clock: deps.clock,
|
|
150
|
+
...deps.customScopeClaims !== undefined ? { customScopeClaims: deps.customScopeClaims } : {}
|
|
121
151
|
});
|
|
122
152
|
if (isErr(exchangeResult)) {
|
|
123
153
|
return tokenEndpointErrorResponse(exchangeResult.error);
|
|
@@ -1,38 +1,32 @@
|
|
|
1
1
|
// src/http/handlers/userinfo.ts
|
|
2
|
+
import { canonicalHtu } from "../../domain/dpop";
|
|
2
3
|
import { userinfo } from "../../domain/userinfo";
|
|
3
4
|
import { isErr } from "../../types/result";
|
|
4
5
|
function makeUserinfoHandler(deps) {
|
|
5
6
|
return async (c) => {
|
|
6
|
-
const
|
|
7
|
-
if (!
|
|
8
|
-
|
|
9
|
-
error: "invalid_token",
|
|
10
|
-
error_description: "missing bearer token"
|
|
11
|
-
}), {
|
|
12
|
-
status: 401,
|
|
13
|
-
headers: {
|
|
14
|
-
"content-type": "application/json",
|
|
15
|
-
"www-authenticate": 'Bearer realm="userinfo"'
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
return r;
|
|
7
|
+
const auth = extractAuthorization(c.req.header("authorization") ?? null);
|
|
8
|
+
if (!auth) {
|
|
9
|
+
return wwwAuthenticateResponse("Bearer", "invalid_token", "missing bearer / DPoP token", 401);
|
|
19
10
|
}
|
|
20
|
-
const
|
|
11
|
+
const dpopProof = c.req.header("dpop") ?? undefined;
|
|
12
|
+
const res = await userinfo({
|
|
13
|
+
accessToken: auth.token,
|
|
14
|
+
scheme: auth.scheme,
|
|
15
|
+
...dpopProof !== undefined ? { dpopProof } : {},
|
|
16
|
+
htu: canonicalHtu(c.req.url),
|
|
17
|
+
htm: c.req.method.toUpperCase(),
|
|
18
|
+
nowSec: Math.floor(deps.clock() / 1000)
|
|
19
|
+
}, {
|
|
21
20
|
keyStore: deps.keyStore,
|
|
22
|
-
|
|
21
|
+
tokenStore: deps.tokenStore,
|
|
22
|
+
issuerUrl: c.get("issuerUrl"),
|
|
23
|
+
...deps.customScopeClaims !== undefined ? { customScopeClaims: deps.customScopeClaims } : {}
|
|
23
24
|
});
|
|
24
25
|
if (isErr(res)) {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}), {
|
|
30
|
-
status: 401,
|
|
31
|
-
headers: {
|
|
32
|
-
"content-type": "application/json",
|
|
33
|
-
"www-authenticate": `Bearer error="invalid_token"`
|
|
34
|
-
}
|
|
35
|
-
});
|
|
26
|
+
const error = res.error;
|
|
27
|
+
const scheme = auth.scheme;
|
|
28
|
+
const wireError = error.code === "invalid_dpop_proof" ? "invalid_dpop_proof" : "invalid_token";
|
|
29
|
+
return wwwAuthenticateResponse(scheme, wireError, error.description, 401);
|
|
36
30
|
}
|
|
37
31
|
return new Response(JSON.stringify(res.value), {
|
|
38
32
|
status: 200,
|
|
@@ -43,11 +37,23 @@ function makeUserinfoHandler(deps) {
|
|
|
43
37
|
});
|
|
44
38
|
};
|
|
45
39
|
}
|
|
46
|
-
function
|
|
40
|
+
function extractAuthorization(header) {
|
|
47
41
|
if (!header)
|
|
48
42
|
return null;
|
|
49
|
-
const m = /^Bearer\s+(.+)$/i.exec(header);
|
|
50
|
-
|
|
43
|
+
const m = /^(Bearer|DPoP)\s+(.+)$/i.exec(header);
|
|
44
|
+
if (!m || !m[1] || !m[2])
|
|
45
|
+
return null;
|
|
46
|
+
const scheme = m[1].toLowerCase() === "dpop" ? "DPoP" : "Bearer";
|
|
47
|
+
return { scheme, token: m[2] };
|
|
48
|
+
}
|
|
49
|
+
function wwwAuthenticateResponse(scheme, error, description, status) {
|
|
50
|
+
return new Response(JSON.stringify({ error, error_description: description }), {
|
|
51
|
+
status,
|
|
52
|
+
headers: {
|
|
53
|
+
"content-type": "application/json",
|
|
54
|
+
"www-authenticate": `${scheme} error="${error}"`
|
|
55
|
+
}
|
|
56
|
+
});
|
|
51
57
|
}
|
|
52
58
|
export {
|
|
53
59
|
makeUserinfoHandler
|
package/dist/esm/http/router.js
CHANGED
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
import { Hono } from "hono";
|
|
3
3
|
import { makeAuthorizeHandler } from "./handlers/authorize";
|
|
4
4
|
import { makeCallbackHandler } from "./handlers/callback";
|
|
5
|
+
import { makeEndSessionHandler } from "./handlers/end-session";
|
|
5
6
|
import { makeDiscoveryHandler, makeJwksHandler } from "./handlers/metadata";
|
|
6
7
|
import { makeMethodRouteHandler } from "./handlers/method-route";
|
|
8
|
+
import { makeParHandler } from "./handlers/par";
|
|
9
|
+
import { makeRegisterHandler } from "./handlers/register";
|
|
7
10
|
import { makeIntrospectHandler, makeRevokeHandler } from "./handlers/revocation";
|
|
8
11
|
import { makeTokenHandler } from "./handlers/token";
|
|
9
12
|
import { makeUserinfoHandler } from "./handlers/userinfo";
|
|
@@ -28,6 +31,13 @@ function buildRouter(deps) {
|
|
|
28
31
|
app.post("/userinfo", makeUserinfoHandler(deps));
|
|
29
32
|
app.post("/revoke", makeRevokeHandler(deps));
|
|
30
33
|
app.post("/introspect", makeIntrospectHandler(deps));
|
|
34
|
+
app.use("/end_session", tenantMiddleware(deps));
|
|
35
|
+
app.get("/end_session", makeEndSessionHandler(deps));
|
|
36
|
+
app.post("/end_session", makeEndSessionHandler(deps));
|
|
37
|
+
app.use("/par", tenantMiddleware(deps));
|
|
38
|
+
app.post("/par", makeParHandler(deps));
|
|
39
|
+
app.use("/register", tenantMiddleware(deps));
|
|
40
|
+
app.post("/register", makeRegisterHandler(deps));
|
|
31
41
|
return app;
|
|
32
42
|
}
|
|
33
43
|
export {
|
|
@@ -17,8 +17,14 @@ var authorizeQuerySchema = z.object({
|
|
|
17
17
|
code_challenge_method: z.literal("S256").optional(),
|
|
18
18
|
prompt: csv.optional(),
|
|
19
19
|
ui_locales: csv.optional(),
|
|
20
|
-
nonce: z.string().optional()
|
|
20
|
+
nonce: z.string().optional(),
|
|
21
|
+
claims: z.string().min(1).optional()
|
|
22
|
+
}).passthrough();
|
|
23
|
+
var authorizeRequestUriQuerySchema = z.object({
|
|
24
|
+
client_id: z.string({ required_error: "missing client_id" }).min(1, "empty client_id"),
|
|
25
|
+
request_uri: z.string({ required_error: "missing request_uri" }).min(1)
|
|
21
26
|
}).passthrough();
|
|
22
27
|
export {
|
|
28
|
+
authorizeRequestUriQuerySchema,
|
|
23
29
|
authorizeQuerySchema
|
|
24
30
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/http/schemas/end-session.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var endSessionParamsSchema = z.object({
|
|
4
|
+
id_token_hint: z.string().optional(),
|
|
5
|
+
client_id: z.string().min(1).optional(),
|
|
6
|
+
post_logout_redirect_uri: z.string().url("post_logout_redirect_uri must be a valid URL").optional(),
|
|
7
|
+
state: z.string().optional(),
|
|
8
|
+
logout_hint: z.string().optional(),
|
|
9
|
+
ui_locales: z.string().optional()
|
|
10
|
+
}).passthrough();
|
|
11
|
+
export {
|
|
12
|
+
endSessionParamsSchema
|
|
13
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/http/schemas/par.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var parBodySchema = z.object({
|
|
4
|
+
client_id: z.string({ required_error: "missing client_id" }).min(1, "empty client_id"),
|
|
5
|
+
client_secret: z.string().optional()
|
|
6
|
+
}).catchall(z.string());
|
|
7
|
+
export {
|
|
8
|
+
parBodySchema
|
|
9
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/http/schemas/register.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var registerBodySchema = z.object({
|
|
4
|
+
client_name: z.string().min(1).optional(),
|
|
5
|
+
redirect_uris: z.array(z.string().url("redirect_uri must be a valid URL")).min(1, "redirect_uris must be a non-empty array"),
|
|
6
|
+
grant_types: z.array(z.string()).optional(),
|
|
7
|
+
response_types: z.array(z.string()).optional(),
|
|
8
|
+
token_endpoint_auth_method: z.enum(["none", "client_secret_basic", "client_secret_post"]).optional(),
|
|
9
|
+
scope: z.string().optional(),
|
|
10
|
+
post_logout_redirect_uris: z.array(z.string().url()).optional(),
|
|
11
|
+
sector_identifier_uri: z.string().url().optional(),
|
|
12
|
+
contacts: z.array(z.string()).optional()
|
|
13
|
+
}).passthrough();
|
|
14
|
+
export {
|
|
15
|
+
registerBodySchema
|
|
16
|
+
};
|
package/dist/esm/index.js
CHANGED
|
@@ -68,13 +68,15 @@ function createIdP(opts) {
|
|
|
68
68
|
...opts.persistUpstreamTokens ? { persistUpstreamTokens: opts.persistUpstreamTokens } : {},
|
|
69
69
|
...opts.exchangeAudience ? { exchangeAudience: opts.exchangeAudience } : {},
|
|
70
70
|
...opts.renderPicker ? { renderPicker: opts.renderPicker } : {},
|
|
71
|
+
...opts.registerClient ? { registerClient: opts.registerClient } : {},
|
|
71
72
|
...opts.buildCustomContext ? { buildCustomContext: opts.buildCustomContext } : {},
|
|
72
73
|
clock,
|
|
73
74
|
cookieDefaults: {
|
|
74
75
|
secure: opts.cookies?.secure ?? true,
|
|
75
76
|
...opts.cookies?.domain !== undefined ? { domain: opts.cookies.domain } : {},
|
|
76
77
|
...opts.cookies?.path !== undefined ? { path: opts.cookies.path } : {}
|
|
77
|
-
}
|
|
78
|
+
},
|
|
79
|
+
...opts.customScopeClaims !== undefined ? { customScopeClaims: opts.customScopeClaims } : {}
|
|
78
80
|
};
|
|
79
81
|
const app = buildRouter(deps);
|
|
80
82
|
const fetch = async (req) => await app.fetch(req);
|
|
@@ -86,7 +88,10 @@ function createIdP(opts) {
|
|
|
86
88
|
jwks: fetch,
|
|
87
89
|
discovery: fetch,
|
|
88
90
|
revoke: fetch,
|
|
89
|
-
introspect: fetch
|
|
91
|
+
introspect: fetch,
|
|
92
|
+
endSession: fetch,
|
|
93
|
+
par: fetch,
|
|
94
|
+
register: fetch
|
|
90
95
|
};
|
|
91
96
|
}
|
|
92
97
|
export {
|
package/dist/esm/types/error.js
CHANGED
|
@@ -58,6 +58,11 @@ var authError = {
|
|
|
58
58
|
code: "internal_error",
|
|
59
59
|
description,
|
|
60
60
|
...cause !== undefined ? { cause } : {}
|
|
61
|
+
}),
|
|
62
|
+
invalidDpopProof: (description, replaySignal) => ({
|
|
63
|
+
code: "invalid_dpop_proof",
|
|
64
|
+
description,
|
|
65
|
+
...replaySignal !== undefined ? { replaySignal } : {}
|
|
61
66
|
})
|
|
62
67
|
};
|
|
63
68
|
export {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FlowRecord } from "../../types/flow";
|
|
2
|
-
import type { SessionRecord, SessionStore } from "../../ports/session-store";
|
|
2
|
+
import type { ParRecord, SessionRecord, SessionStore } from "../../ports/session-store";
|
|
3
3
|
import type { Result } from "../../types/result";
|
|
4
4
|
import type { Clock } from "./clock";
|
|
5
5
|
export type MemorySessionStoreOptions = {
|
|
@@ -15,5 +15,7 @@ export declare class MemorySessionStore implements SessionStore {
|
|
|
15
15
|
createSession(sessionId: string, payload: SessionRecord, ttl: number): Promise<Result<void>>;
|
|
16
16
|
readSession(sessionId: string): Promise<Result<SessionRecord>>;
|
|
17
17
|
revokeSession(sessionId: string): Promise<Result<void>>;
|
|
18
|
+
savePar(requestUri: string, payload: ParRecord, ttl: number): Promise<Result<void>>;
|
|
19
|
+
consumePar(requestUri: string): Promise<Result<ParRecord>>;
|
|
18
20
|
}
|
|
19
21
|
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/memory/session-store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/memory/session-store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACb,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAapC,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,qBAAa,kBAAmB,YAAW,YAAY;;gBAMzC,IAAI,GAAE,yBAA8B;IAI1C,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAalB,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAalB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAYrD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAgBxD,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAYlB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAY9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKvD,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAalB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;CAejE"}
|
|
@@ -24,5 +24,6 @@ export declare class MemoryTokenStore implements TokenStore {
|
|
|
24
24
|
peekRefresh(refresh: string): Promise<Result<RefreshTokenPayload>>;
|
|
25
25
|
revokeFamily(family: string): Promise<Result<void>>;
|
|
26
26
|
revokeBySubject(tenantId: TenantId, subjectId: string): Promise<Result<void>>;
|
|
27
|
+
recordDpopJti(jti: string, ttlMs: number): Promise<Result<void>>;
|
|
27
28
|
}
|
|
28
29
|
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/memory/token-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAapC,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,qBAAa,gBAAiB,YAAW,UAAU;;
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/memory/token-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAapC,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,qBAAa,gBAAiB,YAAW,UAAU;;gBAOrC,IAAI,GAAE,uBAA4B;IAIxC,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAYlB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAgBlD,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKlB,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,GACvC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAqCjC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAWlE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IASnD,eAAe,CACnB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAYlB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAavE"}
|
package/dist/types/client.d.ts
CHANGED
|
@@ -35,6 +35,13 @@ export interface Tokens {
|
|
|
35
35
|
* The number of seconds until the access token expires.
|
|
36
36
|
*/
|
|
37
37
|
expiresIn: number;
|
|
38
|
+
/**
|
|
39
|
+
* The OIDC `id_token` (signed JWT), present when `scope=openid` was granted.
|
|
40
|
+
*
|
|
41
|
+
* Refresh-grant rotation reissues this with a stable `auth_time` per
|
|
42
|
+
* OIDC Core §12 and deliberately omits the original `nonce`.
|
|
43
|
+
*/
|
|
44
|
+
idToken?: string;
|
|
38
45
|
}
|
|
39
46
|
interface ResponseLike {
|
|
40
47
|
json(): Promise<unknown>;
|
|
@@ -118,6 +125,18 @@ export interface AuthorizeOptions {
|
|
|
118
125
|
* If there's only one provider configured, the user will be redirected to that.
|
|
119
126
|
*/
|
|
120
127
|
provider?: string;
|
|
128
|
+
/**
|
|
129
|
+
* OAuth scopes to request, e.g. `["openid", "email", "profile"]`.
|
|
130
|
+
*
|
|
131
|
+
* Pass `openid` to request an `id_token` at `/token` (OIDC Core §2). Pass
|
|
132
|
+
* `email` / `profile` / `phone` / `address` to opt into the standard §5.4
|
|
133
|
+
* profile claim sets on the id_token and `/userinfo` response.
|
|
134
|
+
*
|
|
135
|
+
* Accepts an array or a pre-joined space-separated string. When omitted,
|
|
136
|
+
* no `scope` is sent — the IdP's default grant applies, which typically
|
|
137
|
+
* does NOT include `openid` and therefore does NOT issue an id_token.
|
|
138
|
+
*/
|
|
139
|
+
scope?: string | string[];
|
|
121
140
|
}
|
|
122
141
|
export interface AuthorizeResult {
|
|
123
142
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,EAEzB,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../src/domain/authorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EACV,oBAAoB,EAGpB,SAAS,EACT,WAAW,EACZ,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAgB,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIhF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,QAAiB,CAAA;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,QAAY,CAAA;AAEzC,MAAM,MAAM,eAAe;AACzB;;;;;;GAMG;AACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AACH;;;;GAIG;GACD;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AACH,6DAA6D;GAC3D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE;AAC7D;;;GAGG;GACD;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3D,CAAA;AAEL,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,iFAAiF;IACjF,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,YAAY,CAAA;IACvB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAA;IACjB,iFAAiF;IACjF,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,KAAK,EAAE,MAAM,MAAM,CAAA;IACnB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAA;IACvB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../src/domain/authorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,8 @@ export type ClientCredentialsDeps = {
|
|
|
47
47
|
issuerUrl: string;
|
|
48
48
|
clock: () => number;
|
|
49
49
|
newRefreshFamily?: () => string;
|
|
50
|
+
/** See `IdPOptions.customScopeClaims`. Forwarded to `mintTokens`. */
|
|
51
|
+
customScopeClaims?: Record<string, ReadonlyArray<string>>;
|
|
50
52
|
};
|
|
51
53
|
export declare function clientCredentialsGrant(req: ClientCredentialsRequest, deps: ClientCredentialsDeps, tenantId: TenantId): Promise<Result<TokenResponse, AuthError>>;
|
|
52
54
|
//# sourceMappingURL=client-credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-credentials.d.ts","sourceRoot":"","sources":["../../../src/domain/client-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAKnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,oBAAoB,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1D,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"client-credentials.d.ts","sourceRoot":"","sources":["../../../src/domain/client-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAKnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,oBAAoB,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1D,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAA;IAC/B,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAmH3C"}
|
|
@@ -16,11 +16,37 @@ export type DiscoveryDocument = {
|
|
|
16
16
|
jwks_uri: string;
|
|
17
17
|
revocation_endpoint: string;
|
|
18
18
|
introspection_endpoint: string;
|
|
19
|
+
/** OIDC RP-Initiated Logout 1.0 §2. */
|
|
20
|
+
end_session_endpoint: string;
|
|
21
|
+
/** RFC 7591 §3.1. */
|
|
22
|
+
registration_endpoint: string;
|
|
23
|
+
/** RFC 9126 §5. */
|
|
24
|
+
pushed_authorization_request_endpoint: string;
|
|
25
|
+
/**
|
|
26
|
+
* RFC 9126 §5. True iff every client on this tenant is required to use
|
|
27
|
+
* PAR. We advertise `false` at the tenant level — the per-client toggle
|
|
28
|
+
* is read at request time.
|
|
29
|
+
*/
|
|
30
|
+
require_pushed_authorization_requests: boolean;
|
|
31
|
+
/** RFC 9449 §5.1 — DPoP algorithms accepted on proof JWTs. */
|
|
32
|
+
dpop_signing_alg_values_supported: string[];
|
|
19
33
|
response_types_supported: string[];
|
|
20
34
|
grant_types_supported: string[];
|
|
21
35
|
subject_types_supported: string[];
|
|
22
36
|
id_token_signing_alg_values_supported: string[];
|
|
23
37
|
scopes_supported: string[];
|
|
38
|
+
/** OIDC Core §3 — registered claim names the IdP can return. */
|
|
39
|
+
claims_supported: string[];
|
|
40
|
+
/** OIDC Core §5.5 — `claims` request parameter is honored. */
|
|
41
|
+
claims_parameter_supported: boolean;
|
|
42
|
+
/** OIDC Core §6.1 — JAR (`request` parameter). Not implemented. */
|
|
43
|
+
request_parameter_supported: boolean;
|
|
44
|
+
/** OIDC Core §6.2 — JAR (`request_uri` parameter). Not implemented. */
|
|
45
|
+
request_uri_parameter_supported: boolean;
|
|
46
|
+
/** OIDC Core §6.2 — whether `request_uri` values must be pre-registered. */
|
|
47
|
+
require_request_uri_registration: boolean;
|
|
48
|
+
/** OIDC Core §3.1.2.1 — UI locales the OP can render. */
|
|
49
|
+
ui_locales_supported?: string[];
|
|
24
50
|
token_endpoint_auth_methods_supported: string[];
|
|
25
51
|
code_challenge_methods_supported: string[];
|
|
26
52
|
};
|
|
@@ -34,9 +60,20 @@ export type DiscoveryDeps = {
|
|
|
34
60
|
jwks: string;
|
|
35
61
|
revoke: string;
|
|
36
62
|
introspect: string;
|
|
63
|
+
endSession: string;
|
|
64
|
+
par: string;
|
|
65
|
+
register: string;
|
|
37
66
|
}>;
|
|
38
67
|
/** Advertised scopes. Defaults to `["openid", "email", "profile"]`. */
|
|
39
68
|
scopes?: string[];
|
|
69
|
+
/** Advertised UI locales. Defaults to `["en"]`. */
|
|
70
|
+
uiLocales?: string[];
|
|
71
|
+
/**
|
|
72
|
+
* Host-supplied scope → claim-names map. Each key adds a scope to
|
|
73
|
+
* `scopes_supported`; the union of values augments `claims_supported`.
|
|
74
|
+
* Mirrors `IdPOptions.customScopeClaims`.
|
|
75
|
+
*/
|
|
76
|
+
customScopeClaims?: Record<string, ReadonlyArray<string>>;
|
|
40
77
|
};
|
|
41
78
|
export declare function buildDiscoveryDocument(deps: DiscoveryDeps): DiscoveryDocument;
|
|
42
79
|
export type JwksDoc = ReturnType<typeof buildJwksDocument>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/domain/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,uBAAuB,EAAE,MAAM,EAAE,CAAA;IACjC,qCAAqC,EAAE,MAAM,EAAE,CAAA;IAC/C,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,qCAAqC,EAAE,MAAM,EAAE,CAAA;IAC/C,gCAAgC,EAAE,MAAM,EAAE,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;QACd,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/domain/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,uCAAuC;IACvC,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qBAAqB;IACrB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,mBAAmB;IACnB,qCAAqC,EAAE,MAAM,CAAA;IAC7C;;;;OAIG;IACH,qCAAqC,EAAE,OAAO,CAAA;IAC9C,8DAA8D;IAC9D,iCAAiC,EAAE,MAAM,EAAE,CAAA;IAC3C,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,uBAAuB,EAAE,MAAM,EAAE,CAAA;IACjC,qCAAqC,EAAE,MAAM,EAAE,CAAA;IAC/C,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,8DAA8D;IAC9D,0BAA0B,EAAE,OAAO,CAAA;IACnC,mEAAmE;IACnE,2BAA2B,EAAE,OAAO,CAAA;IACpC,uEAAuE;IACvE,+BAA+B,EAAE,OAAO,CAAA;IACxC,4EAA4E;IAC5E,gCAAgC,EAAE,OAAO,CAAA;IACzC,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,qCAAqC,EAAE,MAAM,EAAE,CAAA;IAC/C,gCAAgC,EAAE,MAAM,EAAE,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;QACd,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;IACF,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAoE7E;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE1D,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAIrC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { TokenStore } from "../ports/token-store";
|
|
2
|
+
import { type AuthError } from "../types/error";
|
|
3
|
+
import type { Result } from "../types/result";
|
|
4
|
+
/** RFC 9449 §4.2 — fixed 60-second tolerance is the conventional default. */
|
|
5
|
+
export declare const DEFAULT_DPOP_IAT_TOLERANCE_SEC = 60;
|
|
6
|
+
/** Replay-window TTL for `jti` tracking. Matches `iat` tolerance × 2. */
|
|
7
|
+
export declare const DEFAULT_DPOP_JTI_TTL_MS: number;
|
|
8
|
+
export type DpopProofPayload = {
|
|
9
|
+
htu: string;
|
|
10
|
+
htm: string;
|
|
11
|
+
iat: number;
|
|
12
|
+
jti: string;
|
|
13
|
+
ath?: string;
|
|
14
|
+
nonce?: string;
|
|
15
|
+
};
|
|
16
|
+
export type VerifiedDpopProof = {
|
|
17
|
+
/** RFC 7638 JWK thumbprint of the proof's public key. */
|
|
18
|
+
jkt: string;
|
|
19
|
+
/** The decoded + signature-verified proof payload. */
|
|
20
|
+
payload: DpopProofPayload;
|
|
21
|
+
};
|
|
22
|
+
export type VerifyDpopProofInput = {
|
|
23
|
+
proofJwt: string;
|
|
24
|
+
/** Actual request URI (scheme + host + port + path; query/frag stripped). */
|
|
25
|
+
htu: string;
|
|
26
|
+
/** Actual HTTP method, uppercase. */
|
|
27
|
+
htm: string;
|
|
28
|
+
/** Wall clock seconds. */
|
|
29
|
+
nowSec: number;
|
|
30
|
+
/** Optional skew allowance. */
|
|
31
|
+
iatToleranceSec?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Required at resource servers when the proof must bind to a presented
|
|
34
|
+
* access token. The verifier checks the proof's `ath` equals
|
|
35
|
+
* base64url(SHA-256(access_token ASCII)). Omit at the AS `/token`
|
|
36
|
+
* endpoint — no access token exists yet there.
|
|
37
|
+
*/
|
|
38
|
+
expectedAth?: string;
|
|
39
|
+
};
|
|
40
|
+
export type VerifyDpopProofDeps = {
|
|
41
|
+
tokenStore: TokenStore;
|
|
42
|
+
jtiTtlMs?: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Verify a DPoP proof JWT and return its `jkt` + payload. Side-effect:
|
|
46
|
+
* records the `jti` in `TokenStore` so a replay within the TTL window
|
|
47
|
+
* is rejected.
|
|
48
|
+
*/
|
|
49
|
+
export declare function verifyDpopProof(input: VerifyDpopProofInput, deps: VerifyDpopProofDeps): Promise<Result<VerifiedDpopProof, AuthError>>;
|
|
50
|
+
/**
|
|
51
|
+
* Canonicalize a request URL for `htu` comparison (RFC 9449 §4.3).
|
|
52
|
+
* Strips query string and fragment; preserves scheme, host, port, path.
|
|
53
|
+
* Default port for the scheme is removed.
|
|
54
|
+
*/
|
|
55
|
+
export declare function canonicalHtu(rawUrl: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Compute the `ath` value (RFC 9449 §4.2): base64url(SHA-256(access_token ASCII)).
|
|
58
|
+
* Resource servers compare the presented DPoP proof's `ath` to this.
|
|
59
|
+
*/
|
|
60
|
+
export declare function computeAth(accessToken: string): Promise<string>;
|
|
61
|
+
//# sourceMappingURL=dpop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpop.d.ts","sourceRoot":"","sources":["../../../src/domain/dpop.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAQ7C,6EAA6E;AAC7E,eAAO,MAAM,8BAA8B,KAAK,CAAA;AAEhD,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,QAA4C,CAAA;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,sDAAsD;IACtD,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAwK/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE"}
|