@gaballahtech/seba 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/ARCHITECTURE.md +242 -0
  2. package/BUILD_REPORT.md +195 -0
  3. package/CHANGELOG.md +86 -0
  4. package/LICENSE +21 -0
  5. package/README.md +282 -2
  6. package/RESEARCH.md +180 -0
  7. package/SECURITY.md +224 -0
  8. package/VALIDATION_REPORT.md +187 -0
  9. package/dist/browser/index.d.ts +9 -0
  10. package/dist/browser/index.d.ts.map +1 -0
  11. package/dist/browser/index.js +9 -0
  12. package/dist/browser/index.js.map +1 -0
  13. package/dist/browser/platform.d.ts +14 -0
  14. package/dist/browser/platform.d.ts.map +1 -0
  15. package/dist/browser/platform.js +60 -0
  16. package/dist/browser/platform.js.map +1 -0
  17. package/dist/browser/provider-modal.d.ts +15 -0
  18. package/dist/browser/provider-modal.d.ts.map +1 -0
  19. package/dist/browser/provider-modal.js +126 -0
  20. package/dist/browser/provider-modal.js.map +1 -0
  21. package/dist/browser/storage.d.ts +32 -0
  22. package/dist/browser/storage.d.ts.map +1 -0
  23. package/dist/browser/storage.js +121 -0
  24. package/dist/browser/storage.js.map +1 -0
  25. package/dist/core/client.d.ts +49 -0
  26. package/dist/core/client.d.ts.map +1 -0
  27. package/dist/core/client.js +371 -0
  28. package/dist/core/client.js.map +1 -0
  29. package/dist/core/discovery.d.ts +82 -0
  30. package/dist/core/discovery.d.ts.map +1 -0
  31. package/dist/core/discovery.js +243 -0
  32. package/dist/core/discovery.js.map +1 -0
  33. package/dist/core/dpop.d.ts +67 -0
  34. package/dist/core/dpop.d.ts.map +1 -0
  35. package/dist/core/dpop.js +176 -0
  36. package/dist/core/dpop.js.map +1 -0
  37. package/dist/core/errors.d.ts +86 -0
  38. package/dist/core/errors.d.ts.map +1 -0
  39. package/dist/core/errors.js +104 -0
  40. package/dist/core/errors.js.map +1 -0
  41. package/dist/core/http.d.ts +68 -0
  42. package/dist/core/http.d.ts.map +1 -0
  43. package/dist/core/http.js +128 -0
  44. package/dist/core/http.js.map +1 -0
  45. package/dist/core/identity.d.ts +145 -0
  46. package/dist/core/identity.d.ts.map +1 -0
  47. package/dist/core/identity.js +735 -0
  48. package/dist/core/identity.js.map +1 -0
  49. package/dist/core/oidc.d.ts +175 -0
  50. package/dist/core/oidc.d.ts.map +1 -0
  51. package/dist/core/oidc.js +413 -0
  52. package/dist/core/oidc.js.map +1 -0
  53. package/dist/core/session.d.ts +116 -0
  54. package/dist/core/session.d.ts.map +1 -0
  55. package/dist/core/session.js +350 -0
  56. package/dist/core/session.js.map +1 -0
  57. package/dist/core/storage.d.ts +22 -0
  58. package/dist/core/storage.d.ts.map +1 -0
  59. package/dist/core/storage.js +48 -0
  60. package/dist/core/storage.js.map +1 -0
  61. package/dist/index.d.ts +18 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +3 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/node/index.d.ts +9 -0
  66. package/dist/node/index.d.ts.map +1 -0
  67. package/dist/node/index.js +9 -0
  68. package/dist/node/index.js.map +1 -0
  69. package/dist/node/platform.d.ts +25 -0
  70. package/dist/node/platform.d.ts.map +1 -0
  71. package/dist/node/platform.js +161 -0
  72. package/dist/node/platform.js.map +1 -0
  73. package/dist/seba.d.ts +39 -0
  74. package/dist/seba.d.ts.map +1 -0
  75. package/dist/seba.js +58 -0
  76. package/dist/seba.js.map +1 -0
  77. package/dist/types.d.ts +279 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +8 -0
  80. package/dist/types.js.map +1 -0
  81. package/examples/node/index.ts +61 -0
  82. package/examples/react/App.tsx +127 -0
  83. package/examples/react/index.html +12 -0
  84. package/examples/react/main.tsx +14 -0
  85. package/examples/react/vite.config.ts +27 -0
  86. package/package.json +83 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * OpenID Connect authorization-code flow with PKCE and DPoP.
3
+ *
4
+ * This module owns authorization request construction, callback validation, token
5
+ * requests and ID token validation. It does not persist anything: the caller decides what
6
+ * to keep.
7
+ */
8
+ import { type JWTVerifyGetKey } from "jose";
9
+ import type { DPoPSigner, OIDCConfiguration, PendingAuthorization, TokenSet } from "../types.js";
10
+ /** Scopes requested for a Solid session. */
11
+ export declare const DEFAULT_SCOPES: readonly ["openid", "webid", "offline_access"];
12
+ /** Fixed clock tolerance for `exp`, `nbf` and `iat`, in seconds. Not configurable. */
13
+ export declare const CLOCK_TOLERANCE_SECONDS = 60;
14
+ /** A validated identity derived from an ID token. */
15
+ export interface Identity {
16
+ /** WebID proven by the token. */
17
+ readonly webId: string;
18
+ /** Issuer that signed the token (equals the discovered issuer). */
19
+ readonly issuer: string;
20
+ /** `sub` claim. */
21
+ readonly subject: string;
22
+ }
23
+ /** Result of a validated authorization-code exchange. */
24
+ export interface AuthorizationResult {
25
+ /** Validated token set. The access token must stay in memory. */
26
+ readonly tokens: TokenSet;
27
+ /** Identity proven by the ID token. */
28
+ readonly identity: Identity;
29
+ }
30
+ /** A PKCE verifier/challenge pair. */
31
+ export interface PkcePair {
32
+ readonly codeVerifier: string;
33
+ readonly codeChallenge: string;
34
+ }
35
+ /**
36
+ * Generate a cryptographically random base64url string.
37
+ *
38
+ * @param byteLength - Number of random bytes (32 → 43 characters).
39
+ */
40
+ export declare function randomToken(byteLength?: number): string;
41
+ /**
42
+ * Create a PKCE S256 verifier and challenge.
43
+ *
44
+ * The verifier uses only the RFC 7636 alphabet and is 43 characters long; the challenge
45
+ * is `base64url(SHA-256(ASCII(verifier)))` with `code_challenge_method=S256`.
46
+ */
47
+ export declare function createPkcePair(): Promise<PkcePair>;
48
+ /**
49
+ * Compute the S256 PKCE challenge for an existing verifier.
50
+ *
51
+ * @param codeVerifier - The verifier sent in the token request.
52
+ */
53
+ export declare function pkceChallenge(codeVerifier: string): Promise<string>;
54
+ /**
55
+ * Create the pending authorization transaction.
56
+ *
57
+ * @param input - Issuer, client and redirect information plus optional WebID hint.
58
+ */
59
+ export declare function createPendingAuthorization(input: {
60
+ issuer: string;
61
+ clientId: string;
62
+ redirectUri: string;
63
+ webId?: string;
64
+ }): Promise<PendingAuthorization>;
65
+ /**
66
+ * Build the authorization URL.
67
+ *
68
+ * @param input - Provider configuration, client identity and transaction values.
69
+ * @throws {@link SebaAuthError} when the transaction does not match the client identity.
70
+ */
71
+ export declare function buildAuthorizationUrl(input: {
72
+ configuration: OIDCConfiguration;
73
+ clientId: string;
74
+ redirectUri: string;
75
+ state: string;
76
+ nonce: string;
77
+ codeChallenge: string;
78
+ scopes?: readonly string[];
79
+ }): string;
80
+ /**
81
+ * Validate an authorization response URL and return the authorization code.
82
+ *
83
+ * Checks, in order: provider error, `state`, RFC 9207 `iss`, and the presence of `code`.
84
+ * All failures are {@link SebaAuthError}; nothing is exchanged on failure.
85
+ *
86
+ * @param callbackUrl - URL the provider redirected to.
87
+ * @param pending - Transaction created before the navigation.
88
+ */
89
+ export declare function parseAuthorizationResponse(callbackUrl: string, pending: PendingAuthorization): string;
90
+ /** Successful token request. */
91
+ export interface TokenRequestSuccess {
92
+ readonly ok: true;
93
+ readonly body: Record<string, unknown>;
94
+ readonly response: Response;
95
+ }
96
+ /** Token request rejected with an OAuth error response. */
97
+ export interface TokenRequestFailure {
98
+ readonly ok: false;
99
+ readonly error: string;
100
+ readonly description?: string;
101
+ readonly status: number;
102
+ }
103
+ /** Outcome of a token request; HTTP failures are values, transport failures throw. */
104
+ export type TokenRequestOutcome = TokenRequestSuccess | TokenRequestFailure;
105
+ /**
106
+ * Perform a token request with a fresh DPoP proof.
107
+ *
108
+ * One `use_dpop_nonce` challenge is retried with the supplied nonce and a **new** proof.
109
+ * OAuth error responses are returned as {@link TokenRequestFailure} so callers can map
110
+ * `invalid_grant` to an expired session; network failures throw {@link SebaNetworkError}.
111
+ *
112
+ * @param input - Token endpoint, form body, signer and runtime fetch.
113
+ */
114
+ export declare function requestTokenResponse(input: {
115
+ tokenEndpoint: string;
116
+ body: URLSearchParams;
117
+ signer: DPoPSigner;
118
+ fetchImpl: typeof fetch;
119
+ nonce?: string;
120
+ }): Promise<TokenRequestOutcome>;
121
+ /**
122
+ * Exchange an authorization code for a DPoP-bound token set and validate the ID token.
123
+ *
124
+ * @param input - Discovery result, client identity, PKCE verifier, signer and nonce.
125
+ */
126
+ export declare function exchangeAuthorizationCode(input: {
127
+ configuration: OIDCConfiguration;
128
+ clientId: string;
129
+ redirectUri: string;
130
+ code: string;
131
+ codeVerifier: string;
132
+ nonce: string;
133
+ signer: DPoPSigner;
134
+ fetchImpl: typeof fetch;
135
+ expectedWebId?: string;
136
+ jwks?: JWTVerifyGetKey;
137
+ }): Promise<AuthorizationResult>;
138
+ /**
139
+ * Validate a token response body.
140
+ *
141
+ * Failures: missing tokens, or a token type other than `DPoP` (RFC 9449 §5 requires the
142
+ * client to reject a token that is not DPoP-bound).
143
+ *
144
+ * @param body - Parsed token response body.
145
+ */
146
+ export declare function parseTokenSet(body: Record<string, unknown>): TokenSet;
147
+ /**
148
+ * Validate an ID token and derive the authenticated identity.
149
+ *
150
+ * Validation: signature against the provider JWKS, `iss`, `aud` (including `solid` when
151
+ * the provider advertises `webid`), `azp`, `exp`/`nbf`/`iat`, `nonce`, `cnf.jkt` binding,
152
+ * `sub`, and the WebID claim (falling back to `sub` for https WebIDs).
153
+ *
154
+ * @param input - Token, provider configuration, client identity and expectations.
155
+ */
156
+ export declare function validateIdToken(input: {
157
+ idToken: string;
158
+ configuration: OIDCConfiguration;
159
+ clientId: string;
160
+ nonce?: string;
161
+ signer?: DPoPSigner;
162
+ fetchImpl?: typeof fetch;
163
+ requireDpopBinding?: boolean;
164
+ expectedWebId?: string;
165
+ expectedSubject?: string;
166
+ jwks?: JWTVerifyGetKey;
167
+ }): Promise<Identity>;
168
+ /**
169
+ * Build a JWKS resolver from an in-memory key set. Used by tests and by callers that
170
+ * already hold provider keys.
171
+ *
172
+ * @param keys - Public JWKs.
173
+ */
174
+ export declare function localJwks(keys: readonly JsonWebKey[]): JWTVerifyGetKey;
175
+ //# sourceMappingURL=oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../../src/core/oidc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * OpenID Connect authorization-code flow with PKCE and DPoP.
3
+ *
4
+ * This module owns authorization request construction, callback validation, token
5
+ * requests and ID token validation. It does not persist anything: the caller decides what
6
+ * to keep.
7
+ */
8
+ import { base64url, createLocalJWKSet, createRemoteJWKSet, customFetch, errors as joseErrors, jwtVerify, } from "jose";
9
+ import { SebaAuthError, SebaError, SebaDPoPError, SebaNetworkError } from "./errors.js";
10
+ import { isLoopbackHost } from "./discovery.js";
11
+ import { httpFetch, isOk, parseJson, readText } from "./http.js";
12
+ /** Scopes requested for a Solid session. */
13
+ export const DEFAULT_SCOPES = ["openid", "webid", "offline_access"];
14
+ /** Characters allowed in a PKCE code verifier (RFC 7636 §4.1). */
15
+ const PKCE_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
16
+ /** Fixed clock tolerance for `exp`, `nbf` and `iat`, in seconds. Not configurable. */
17
+ export const CLOCK_TOLERANCE_SECONDS = 60;
18
+ /** Asymmetric JWS algorithms accepted for ID tokens. */
19
+ const ID_TOKEN_ALGORITHMS = ["ES256", "ES384", "ES512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512"];
20
+ /**
21
+ * Generate a cryptographically random base64url string.
22
+ *
23
+ * @param byteLength - Number of random bytes (32 → 43 characters).
24
+ */
25
+ export function randomToken(byteLength = 32) {
26
+ const bytes = new Uint8Array(byteLength);
27
+ crypto.getRandomValues(bytes);
28
+ return base64url.encode(bytes);
29
+ }
30
+ /**
31
+ * Create a PKCE S256 verifier and challenge.
32
+ *
33
+ * The verifier uses only the RFC 7636 alphabet and is 43 characters long; the challenge
34
+ * is `base64url(SHA-256(ASCII(verifier)))` with `code_challenge_method=S256`.
35
+ */
36
+ export async function createPkcePair() {
37
+ const verifier = Array.from({ length: 43 }, () => {
38
+ const byte = new Uint8Array(1);
39
+ crypto.getRandomValues(byte);
40
+ // Rejection-free modulo bias is acceptable here: the alphabet is not a power of two,
41
+ // but 43 characters of 64-symbol alphabet still carry ~258 bits of entropy.
42
+ return PKCE_ALPHABET.charAt(byte[0] % PKCE_ALPHABET.length);
43
+ }).join("");
44
+ return { codeVerifier: verifier, codeChallenge: await pkceChallenge(verifier) };
45
+ }
46
+ /**
47
+ * Compute the S256 PKCE challenge for an existing verifier.
48
+ *
49
+ * @param codeVerifier - The verifier sent in the token request.
50
+ */
51
+ export async function pkceChallenge(codeVerifier) {
52
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(codeVerifier));
53
+ return base64url.encode(new Uint8Array(digest));
54
+ }
55
+ /**
56
+ * Create the pending authorization transaction.
57
+ *
58
+ * @param input - Issuer, client and redirect information plus optional WebID hint.
59
+ */
60
+ export async function createPendingAuthorization(input) {
61
+ const [pkce, state, nonce] = await Promise.all([
62
+ createPkcePair(),
63
+ Promise.resolve(randomToken()),
64
+ Promise.resolve(randomToken()),
65
+ ]);
66
+ const pending = {
67
+ state,
68
+ codeVerifier: pkce.codeVerifier,
69
+ nonce,
70
+ issuer: input.issuer,
71
+ clientId: input.clientId,
72
+ redirectUri: input.redirectUri,
73
+ createdAt: Date.now(),
74
+ };
75
+ if (input.webId !== undefined) {
76
+ pending.webId = input.webId;
77
+ }
78
+ return pending;
79
+ }
80
+ /**
81
+ * Build the authorization URL.
82
+ *
83
+ * @param input - Provider configuration, client identity and transaction values.
84
+ * @throws {@link SebaAuthError} when the transaction does not match the client identity.
85
+ */
86
+ export function buildAuthorizationUrl(input) {
87
+ if (input.state === "" || input.nonce === "" || input.codeChallenge === "") {
88
+ throw new SebaAuthError("Refusing to build an authorization URL without state, nonce and PKCE challenge.");
89
+ }
90
+ if (input.clientId !== input.configuration.issuer && input.clientId === "") {
91
+ throw new SebaAuthError("Refusing to build an authorization URL without a client identifier.");
92
+ }
93
+ const url = new URL(input.configuration.authorizationEndpoint);
94
+ url.searchParams.set("response_type", "code");
95
+ url.searchParams.set("client_id", input.clientId);
96
+ url.searchParams.set("redirect_uri", input.redirectUri);
97
+ url.searchParams.set("scope", (input.scopes ?? DEFAULT_SCOPES).join(" "));
98
+ url.searchParams.set("state", input.state);
99
+ url.searchParams.set("nonce", input.nonce);
100
+ url.searchParams.set("code_challenge", input.codeChallenge);
101
+ url.searchParams.set("code_challenge_method", "S256");
102
+ return url.href;
103
+ }
104
+ /**
105
+ * Validate an authorization response URL and return the authorization code.
106
+ *
107
+ * Checks, in order: provider error, `state`, RFC 9207 `iss`, and the presence of `code`.
108
+ * All failures are {@link SebaAuthError}; nothing is exchanged on failure.
109
+ *
110
+ * @param callbackUrl - URL the provider redirected to.
111
+ * @param pending - Transaction created before the navigation.
112
+ */
113
+ export function parseAuthorizationResponse(callbackUrl, pending) {
114
+ let url;
115
+ try {
116
+ url = new URL(callbackUrl);
117
+ }
118
+ catch {
119
+ throw new SebaAuthError(`The authorization response "${callbackUrl}" is not a valid URL.`);
120
+ }
121
+ const params = url.searchParams;
122
+ const providerError = params.get("error");
123
+ if (providerError !== null) {
124
+ const description = params.get("error_description");
125
+ throw new SebaAuthError(`The identity provider returned the error "${providerError}"` +
126
+ (description === null ? "." : `: ${description}`));
127
+ }
128
+ const state = params.get("state");
129
+ if (state === null || state !== pending.state) {
130
+ throw new SebaAuthError("The authorization response state does not match the pending login. " +
131
+ "The response was ignored; start the login again from the application.");
132
+ }
133
+ const issuer = params.get("iss");
134
+ if (issuer === null || issuer === "") {
135
+ throw new SebaAuthError("The authorization response does not contain the RFC 9207 \"iss\" parameter. " +
136
+ `Expected "${pending.issuer}". Solid-OIDC requires providers to return it; the response was rejected.`);
137
+ }
138
+ if (issuer !== pending.issuer) {
139
+ throw new SebaAuthError(`The authorization response was issued by "${issuer}", but this login was started for "${pending.issuer}". ` +
140
+ "This is a mix-up attempt or a misconfigured provider; the response was rejected.");
141
+ }
142
+ const code = params.get("code");
143
+ if (code === null || code === "") {
144
+ throw new SebaAuthError("The authorization response does not contain an authorization code.");
145
+ }
146
+ return code;
147
+ }
148
+ /**
149
+ * Perform a token request with a fresh DPoP proof.
150
+ *
151
+ * One `use_dpop_nonce` challenge is retried with the supplied nonce and a **new** proof.
152
+ * OAuth error responses are returned as {@link TokenRequestFailure} so callers can map
153
+ * `invalid_grant` to an expired session; network failures throw {@link SebaNetworkError}.
154
+ *
155
+ * @param input - Token endpoint, form body, signer and runtime fetch.
156
+ */
157
+ export async function requestTokenResponse(input) {
158
+ let nonce = input.nonce;
159
+ for (let attempt = 0; attempt < 2; attempt += 1) {
160
+ const headers = {
161
+ "content-type": "application/x-www-form-urlencoded",
162
+ accept: "application/json",
163
+ };
164
+ try {
165
+ headers["DPoP"] = await input.signer.createProof({
166
+ method: "POST",
167
+ url: input.tokenEndpoint,
168
+ ...(nonce === undefined ? {} : { nonce }),
169
+ });
170
+ }
171
+ catch (error) {
172
+ throw new SebaDPoPError("Unable to create a DPoP proof for the token request.", { cause: error });
173
+ }
174
+ const response = await httpFetch(input.tokenEndpoint, { method: "POST", headers, body: input.body.toString(), redirect: "manual" }, { fetchImpl: input.fetchImpl });
175
+ if (isOk(response)) {
176
+ const text = await readText(response, "token");
177
+ const body = parseJson(text, "The token response", (message) => new SebaAuthError(message));
178
+ if (typeof body !== "object" || body === null || Array.isArray(body)) {
179
+ throw new SebaAuthError("The token response is not a JSON object.");
180
+ }
181
+ return { ok: true, body: body, response };
182
+ }
183
+ const challenge = response.headers.get("dpop-nonce");
184
+ const text = await readText(response, "token error");
185
+ const parsed = safeJson(text);
186
+ const error = typeof parsed?.["error"] === "string" ? parsed["error"] : `http_${String(response.status)}`;
187
+ const description = typeof parsed?.["error_description"] === "string" ? parsed["error_description"] : undefined;
188
+ if (error === "use_dpop_nonce" && challenge !== null && attempt === 0) {
189
+ nonce = challenge;
190
+ continue;
191
+ }
192
+ return {
193
+ ok: false,
194
+ error,
195
+ ...(description === undefined ? {} : { description }),
196
+ status: response.status,
197
+ };
198
+ }
199
+ throw new SebaDPoPError("The provider kept requesting a new DPoP nonce; the token request was abandoned.");
200
+ }
201
+ function safeJson(text) {
202
+ try {
203
+ const parsed = JSON.parse(text);
204
+ return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
205
+ ? parsed
206
+ : null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ /**
213
+ * Exchange an authorization code for a DPoP-bound token set and validate the ID token.
214
+ *
215
+ * @param input - Discovery result, client identity, PKCE verifier, signer and nonce.
216
+ */
217
+ export async function exchangeAuthorizationCode(input) {
218
+ const body = new URLSearchParams({
219
+ grant_type: "authorization_code",
220
+ code: input.code,
221
+ redirect_uri: input.redirectUri,
222
+ client_id: input.clientId,
223
+ code_verifier: input.codeVerifier,
224
+ });
225
+ const outcome = await requestTokenResponse({
226
+ tokenEndpoint: input.configuration.tokenEndpoint,
227
+ body,
228
+ signer: input.signer,
229
+ fetchImpl: input.fetchImpl,
230
+ });
231
+ if (!outcome.ok) {
232
+ throw new SebaAuthError(`The token endpoint rejected the authorization code with "${outcome.error}"` +
233
+ (outcome.description === undefined ? "." : `: ${outcome.description}`));
234
+ }
235
+ const tokens = parseTokenSet(outcome.body);
236
+ const identity = await validateIdToken({
237
+ idToken: tokens.idToken,
238
+ configuration: input.configuration,
239
+ clientId: input.clientId,
240
+ nonce: input.nonce,
241
+ signer: input.signer,
242
+ fetchImpl: input.fetchImpl,
243
+ requireDpopBinding: input.configuration.scopesSupported?.includes("webid") === true,
244
+ ...(input.expectedWebId === undefined ? {} : { expectedWebId: input.expectedWebId }),
245
+ ...(input.jwks === undefined ? {} : { jwks: input.jwks }),
246
+ });
247
+ return { tokens, identity };
248
+ }
249
+ /**
250
+ * Validate a token response body.
251
+ *
252
+ * Failures: missing tokens, or a token type other than `DPoP` (RFC 9449 §5 requires the
253
+ * client to reject a token that is not DPoP-bound).
254
+ *
255
+ * @param body - Parsed token response body.
256
+ */
257
+ export function parseTokenSet(body) {
258
+ const accessToken = requireString(body["access_token"], "access_token");
259
+ const tokenType = requireString(body["token_type"], "token_type");
260
+ if (tokenType.toLowerCase() !== "dpop") {
261
+ throw new SebaAuthError(`The provider returned token_type "${tokenType}", but SEBA requires DPoP-bound tokens. ` +
262
+ "The token was discarded; check that the provider supports DPoP.");
263
+ }
264
+ const idToken = requireString(body["id_token"], "id_token");
265
+ const tokens = { accessToken, tokenType: "DPoP", idToken };
266
+ const refreshToken = body["refresh_token"];
267
+ if (typeof refreshToken === "string" && refreshToken !== "") {
268
+ tokens.refreshToken = refreshToken;
269
+ }
270
+ const expiresIn = body["expires_in"];
271
+ if (typeof expiresIn === "number" && Number.isFinite(expiresIn) && expiresIn > 0) {
272
+ tokens.expiresIn = expiresIn;
273
+ }
274
+ else if (typeof expiresIn === "string" && /^\d+$/.test(expiresIn)) {
275
+ tokens.expiresIn = Number.parseInt(expiresIn, 10);
276
+ }
277
+ const scope = body["scope"];
278
+ if (typeof scope === "string" && scope !== "") {
279
+ tokens.scope = scope;
280
+ }
281
+ return tokens;
282
+ }
283
+ function requireString(value, field) {
284
+ if (typeof value !== "string" || value === "") {
285
+ throw new SebaAuthError(`The token response does not contain a usable "${field}" value. ` +
286
+ "SEBA requires DPoP-bound access tokens together with an ID token.");
287
+ }
288
+ return value;
289
+ }
290
+ /**
291
+ * Validate an ID token and derive the authenticated identity.
292
+ *
293
+ * Validation: signature against the provider JWKS, `iss`, `aud` (including `solid` when
294
+ * the provider advertises `webid`), `azp`, `exp`/`nbf`/`iat`, `nonce`, `cnf.jkt` binding,
295
+ * `sub`, and the WebID claim (falling back to `sub` for https WebIDs).
296
+ *
297
+ * @param input - Token, provider configuration, client identity and expectations.
298
+ */
299
+ export async function validateIdToken(input) {
300
+ const jwks = input.jwks ?? createJwks(input.configuration.jwksUri, input.fetchImpl);
301
+ let payload;
302
+ try {
303
+ const verified = await jwtVerify(input.idToken, jwks, {
304
+ issuer: input.configuration.issuer,
305
+ audience: input.clientId,
306
+ algorithms: ID_TOKEN_ALGORITHMS,
307
+ clockTolerance: CLOCK_TOLERANCE_SECONDS,
308
+ requiredClaims: ["iss", "aud", "exp", "iat", "sub"],
309
+ });
310
+ payload = verified.payload;
311
+ }
312
+ catch (error) {
313
+ if (error instanceof joseErrors.JOSEError) {
314
+ throw new SebaAuthError(`The ID token failed validation: ${error.message}.`, { cause: error });
315
+ }
316
+ if (error instanceof SebaError) {
317
+ throw error;
318
+ }
319
+ throw new SebaAuthError("The ID token could not be verified.", { cause: error });
320
+ }
321
+ const audience = payload["aud"];
322
+ const audiences = Array.isArray(audience) ? audience : [audience];
323
+ const azp = payload["azp"];
324
+ if (azp !== undefined && azp !== input.clientId) {
325
+ throw new SebaAuthError(`The ID token was issued to authorized party "${String(azp)}", not to this client ("${input.clientId}").`);
326
+ }
327
+ if (audiences.length > 1 && azp === undefined) {
328
+ throw new SebaAuthError("The ID token has multiple audiences but no \"azp\" claim.");
329
+ }
330
+ const solidRequired = input.configuration.scopesSupported?.includes("webid") === true;
331
+ if (solidRequired && !audiences.includes("solid")) {
332
+ throw new SebaAuthError("The ID token audience does not include \"solid\". Solid-OIDC requires it when the provider advertises the webid scope.");
333
+ }
334
+ if (input.nonce !== undefined && payload["nonce"] !== input.nonce) {
335
+ throw new SebaAuthError("The ID token nonce does not match the login that was started.");
336
+ }
337
+ const issuedAt = payload["iat"];
338
+ if (typeof issuedAt !== "number" || !Number.isFinite(issuedAt)) {
339
+ throw new SebaAuthError("The ID token has no usable \"iat\" claim.");
340
+ }
341
+ const nowSeconds = Math.floor(Date.now() / 1000);
342
+ if (issuedAt > nowSeconds + CLOCK_TOLERANCE_SECONDS) {
343
+ throw new SebaAuthError("The ID token was issued in the future; check the device clock.");
344
+ }
345
+ await checkDpopBinding(payload, input);
346
+ const subject = payload["sub"];
347
+ if (typeof subject !== "string" || subject === "") {
348
+ throw new SebaAuthError("The ID token has no usable \"sub\" claim.");
349
+ }
350
+ if (input.expectedSubject !== undefined && subject !== input.expectedSubject) {
351
+ throw new SebaAuthError("The ID token subject does not match the stored session.");
352
+ }
353
+ const webId = extractWebId(payload, subject);
354
+ if (input.expectedWebId !== undefined && webId !== input.expectedWebId) {
355
+ throw new SebaAuthError(`The provider authenticated "${webId}", but this login requested "${input.expectedWebId}". ` +
356
+ "The session was not created.");
357
+ }
358
+ return { webId, issuer: input.configuration.issuer, subject };
359
+ }
360
+ async function checkDpopBinding(payload, input) {
361
+ const confirmation = payload["cnf"];
362
+ const boundThumbprint = typeof confirmation === "object" && confirmation !== null
363
+ ? confirmation["jkt"]
364
+ : undefined;
365
+ if (boundThumbprint !== undefined) {
366
+ if (input.signer === undefined) {
367
+ throw new SebaAuthError("The ID token is bound to a DPoP key that is not available locally.");
368
+ }
369
+ const thumbprint = await input.signer.thumbprint();
370
+ if (boundThumbprint !== thumbprint) {
371
+ throw new SebaAuthError("The ID token is bound to a different DPoP key than the one used for this session. " +
372
+ "The token was discarded.");
373
+ }
374
+ return;
375
+ }
376
+ if (input.requireDpopBinding === true) {
377
+ throw new SebaAuthError("The ID token is not bound to a DPoP key (\"cnf.jkt\"), but the provider advertises the webid scope. " +
378
+ "Solid-OIDC requires DPoP-bound tokens.");
379
+ }
380
+ }
381
+ function extractWebId(payload, subject) {
382
+ const claim = payload["webid"];
383
+ const candidate = typeof claim === "string" && claim !== "" ? claim : subject;
384
+ let url;
385
+ try {
386
+ url = new URL(candidate);
387
+ }
388
+ catch {
389
+ throw new SebaAuthError(`The ID token identifies the user as "${candidate}", which is not an absolute URL. ` +
390
+ "A WebID must be an https URL; the session was not created.");
391
+ }
392
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && isLoopbackHost(url.hostname))) {
393
+ throw new SebaAuthError(`The ID token identifies the user as "${candidate}", which does not use https. ` +
394
+ "Refusing to create a session for an insecure WebID.");
395
+ }
396
+ return candidate;
397
+ }
398
+ function createJwks(jwksUri, fetchImpl) {
399
+ const options = fetchImpl === undefined
400
+ ? { timeoutDuration: 5_000, cooldownDuration: 30_000, cacheMaxAge: 600_000 }
401
+ : { timeoutDuration: 5_000, cooldownDuration: 30_000, cacheMaxAge: 600_000, [customFetch]: fetchImpl };
402
+ return createRemoteJWKSet(new URL(jwksUri), options);
403
+ }
404
+ /**
405
+ * Build a JWKS resolver from an in-memory key set. Used by tests and by callers that
406
+ * already hold provider keys.
407
+ *
408
+ * @param keys - Public JWKs.
409
+ */
410
+ export function localJwks(keys) {
411
+ return createLocalJWKSet({ keys: [...keys] });
412
+ }
413
+ //# sourceMappingURL=oidc.js.map