@samebase/identity-broker 0.0.0-stage → 0.2.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/LICENSE +201 -0
- package/NOTICE +4 -0
- package/README.md +104 -2
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +39 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/connectors/email.d.ts +6 -0
- package/dist/client/connectors/email.js +5 -0
- package/dist/client/connectors/email.js.map +1 -0
- package/dist/client/connectors/github.d.ts +7 -0
- package/dist/client/connectors/github.js +57 -0
- package/dist/client/connectors/github.js.map +1 -0
- package/dist/client/connectors/google.d.ts +7 -0
- package/dist/client/connectors/google.js +13 -0
- package/dist/client/connectors/google.js.map +1 -0
- package/dist/client/connectors/types.d.ts +47 -0
- package/dist/client/connectors/types.js +2 -0
- package/dist/client/connectors/types.js.map +1 -0
- package/dist/client/connectors/upstream.d.ts +25 -0
- package/dist/client/connectors/upstream.js +86 -0
- package/dist/client/connectors/upstream.js.map +1 -0
- package/dist/client/html.d.ts +34 -0
- package/dist/client/html.js +91 -0
- package/dist/client/html.js.map +1 -0
- package/dist/client/index.d.ts +93 -0
- package/dist/client/index.js +819 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/jwt.d.ts +31 -0
- package/dist/client/jwt.js +55 -0
- package/dist/client/jwt.js.map +1 -0
- package/dist/client/keys.d.ts +49 -0
- package/dist/client/keys.js +138 -0
- package/dist/client/keys.js.map +1 -0
- package/dist/client/protocol.d.ts +79 -0
- package/dist/client/protocol.js +279 -0
- package/dist/client/protocol.js.map +1 -0
- package/dist/client/responses.d.ts +24 -0
- package/dist/client/responses.js +57 -0
- package/dist/client/responses.js.map +1 -0
- package/dist/client/subject.d.ts +15 -0
- package/dist/client/subject.js +32 -0
- package/dist/client/subject.js.map +1 -0
- package/dist/component/_generated/api.d.ts +45 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +398 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +45 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +132 -0
- package/dist/component/_generated/server.js +80 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/apps.d.ts +36 -0
- package/dist/component/apps.js +124 -0
- package/dist/component/apps.js.map +1 -0
- package/dist/component/authRequests.d.ts +274 -0
- package/dist/component/authRequests.js +461 -0
- package/dist/component/authRequests.js.map +1 -0
- package/dist/component/clients.d.ts +43 -0
- package/dist/component/clients.js +95 -0
- package/dist/component/clients.js.map +1 -0
- package/dist/component/convex.config.d.ts +2 -0
- package/dist/component/convex.config.js +3 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/crypto.d.ts +2 -0
- package/dist/component/crypto.js +9 -0
- package/dist/component/crypto.js.map +1 -0
- package/dist/component/lifecycle.d.ts +18 -0
- package/dist/component/lifecycle.js +79 -0
- package/dist/component/lifecycle.js.map +1 -0
- package/dist/component/registration.d.ts +29 -0
- package/dist/component/registration.js +90 -0
- package/dist/component/registration.js.map +1 -0
- package/dist/component/schema.d.ts +749 -0
- package/dist/component/schema.js +140 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/signIns.d.ts +8 -0
- package/dist/component/signIns.js +26 -0
- package/dist/component/signIns.js.map +1 -0
- package/package.json +51 -3
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request validation for the OpenID Provider endpoints: pure functions over URLs, form bodies and
|
|
3
|
+
* headers, with the error shapes the handlers turn into OAuth responses.
|
|
4
|
+
*/
|
|
5
|
+
const MAX_STATE_LENGTH = 4096;
|
|
6
|
+
const MAX_REDIRECT_URI_LENGTH = 2048;
|
|
7
|
+
const MAX_CLIENT_NAME_LENGTH = 120;
|
|
8
|
+
const pkceValuePattern = /^[A-Za-z0-9\-._~]{43,128}$/;
|
|
9
|
+
export const TOKEN_ENDPOINT_AUTH_METHODS = ["client_secret_post", "client_secret_basic"];
|
|
10
|
+
export const DEPLOYMENT_TYPES = ["production", "development", "preview"];
|
|
11
|
+
/** The own enumerable entries of a JSON value, or an empty record for anything but an object. */
|
|
12
|
+
export function asRecord(value) {
|
|
13
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
return Object.fromEntries(Object.entries(value));
|
|
17
|
+
}
|
|
18
|
+
function invalid(status, error, description) {
|
|
19
|
+
return { ok: false, status, error, description };
|
|
20
|
+
}
|
|
21
|
+
function isLoopbackHost(hostname) {
|
|
22
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
|
|
23
|
+
}
|
|
24
|
+
/** A redirect URI: absolute, no fragment, https, or http on a loopback host for local development. */
|
|
25
|
+
export function parseRedirectUri(value) {
|
|
26
|
+
if (value.length === 0 || value.length > MAX_REDIRECT_URI_LENGTH) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
let url;
|
|
30
|
+
try {
|
|
31
|
+
url = new URL(value);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (url.hash.length > 0) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (url.protocol === "https:") {
|
|
40
|
+
return url;
|
|
41
|
+
}
|
|
42
|
+
if (url.protocol === "http:" && isLoopbackHost(url.hostname)) {
|
|
43
|
+
return url;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether `hostname` is covered by one of an app's allowed callback hosts: an exact host, or a
|
|
49
|
+
* `*.suffix` pattern whose wildcard stands for exactly one leading label.
|
|
50
|
+
*/
|
|
51
|
+
export function hostAllowed(hostname, allowedHosts) {
|
|
52
|
+
const host = hostname.toLowerCase();
|
|
53
|
+
return allowedHosts.some((allowed) => {
|
|
54
|
+
const pattern = allowed.toLowerCase();
|
|
55
|
+
if (!pattern.startsWith("*.")) {
|
|
56
|
+
return host === pattern;
|
|
57
|
+
}
|
|
58
|
+
const suffix = pattern.slice(1);
|
|
59
|
+
if (!host.endsWith(suffix)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const label = host.slice(0, host.length - suffix.length);
|
|
63
|
+
return label.length > 0 && !label.includes(".");
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function readString(value, maxLength) {
|
|
67
|
+
if (typeof value !== "string") {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const trimmed = value.trim();
|
|
71
|
+
return trimmed.length === 0 || trimmed.length > maxLength ? null : trimmed;
|
|
72
|
+
}
|
|
73
|
+
/** RFC 7591 registration metadata as this provider accepts it: one redirect URI per client. */
|
|
74
|
+
export function validateRegistration(payload) {
|
|
75
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
|
|
76
|
+
return invalid(400, "invalid_client_metadata", "The request body must be a JSON object.");
|
|
77
|
+
}
|
|
78
|
+
const record = asRecord(payload);
|
|
79
|
+
const redirectUris = record["redirect_uris"];
|
|
80
|
+
if (!Array.isArray(redirectUris) || redirectUris.length !== 1) {
|
|
81
|
+
return invalid(400, "invalid_redirect_uri", "redirect_uris must hold exactly one URI: a client is one deployment.");
|
|
82
|
+
}
|
|
83
|
+
const redirectUri = typeof redirectUris[0] === "string" ? redirectUris[0] : "";
|
|
84
|
+
if (parseRedirectUri(redirectUri) === null) {
|
|
85
|
+
return invalid(400, "invalid_redirect_uri", "The redirect URI must be an absolute https URL without a fragment, or http on a loopback host.");
|
|
86
|
+
}
|
|
87
|
+
const clientName = readString(record["client_name"], MAX_CLIENT_NAME_LENGTH);
|
|
88
|
+
if (clientName === null) {
|
|
89
|
+
return invalid(400, "invalid_client_metadata", "client_name is required.");
|
|
90
|
+
}
|
|
91
|
+
const softwareVersion = readString(record["software_version"] ?? "unknown", 200);
|
|
92
|
+
if (softwareVersion === null) {
|
|
93
|
+
return invalid(400, "invalid_client_metadata", "software_version must be a non-empty string.");
|
|
94
|
+
}
|
|
95
|
+
const deploymentType = DEPLOYMENT_TYPES.find((type) => type === record["deployment_type"]);
|
|
96
|
+
if (deploymentType === undefined) {
|
|
97
|
+
return invalid(400, "invalid_client_metadata", `deployment_type must be one of ${DEPLOYMENT_TYPES.join(", ")}.`);
|
|
98
|
+
}
|
|
99
|
+
// RFC 7591 section 2: the default is client_secret_basic.
|
|
100
|
+
const authMethod = TOKEN_ENDPOINT_AUTH_METHODS.find((method) => method === (record["token_endpoint_auth_method"] ?? "client_secret_basic"));
|
|
101
|
+
if (authMethod === undefined) {
|
|
102
|
+
return invalid(400, "invalid_client_metadata", `token_endpoint_auth_method must be one of ${TOKEN_ENDPOINT_AUTH_METHODS.join(", ")}.`);
|
|
103
|
+
}
|
|
104
|
+
const grantTypes = record["grant_types"];
|
|
105
|
+
if (grantTypes !== undefined &&
|
|
106
|
+
(!Array.isArray(grantTypes) ||
|
|
107
|
+
grantTypes.length !== 1 ||
|
|
108
|
+
grantTypes[0] !== "authorization_code")) {
|
|
109
|
+
return invalid(400, "invalid_client_metadata", 'grant_types must be ["authorization_code"].');
|
|
110
|
+
}
|
|
111
|
+
const responseTypes = record["response_types"];
|
|
112
|
+
if (responseTypes !== undefined &&
|
|
113
|
+
(!Array.isArray(responseTypes) || responseTypes.length !== 1 || responseTypes[0] !== "code")) {
|
|
114
|
+
return invalid(400, "invalid_client_metadata", 'response_types must be ["code"].');
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
ok: true,
|
|
118
|
+
value: {
|
|
119
|
+
redirectUri,
|
|
120
|
+
clientName,
|
|
121
|
+
softwareVersion,
|
|
122
|
+
deploymentType,
|
|
123
|
+
tokenEndpointAuthMethod: authMethod,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The first half of /authorize validation: the parameters that identify the client and where to
|
|
129
|
+
* send errors. Everything else is checked by `validateAuthorizeRest` once the client is known, so
|
|
130
|
+
* those errors can go back to the registered redirect URI.
|
|
131
|
+
*/
|
|
132
|
+
export function validateAuthorizeTarget(params) {
|
|
133
|
+
const clientId = params.get("client_id")?.trim() ?? "";
|
|
134
|
+
if (clientId.length === 0) {
|
|
135
|
+
return invalid(400, "invalid_request", "client_id is required.");
|
|
136
|
+
}
|
|
137
|
+
const redirectUri = params.get("redirect_uri") ?? "";
|
|
138
|
+
if (parseRedirectUri(redirectUri) === null) {
|
|
139
|
+
return invalid(400, "invalid_request", "redirect_uri is missing or invalid.");
|
|
140
|
+
}
|
|
141
|
+
return { ok: true, value: { clientId, redirectUri } };
|
|
142
|
+
}
|
|
143
|
+
export function validateAuthorizeRest(params, target) {
|
|
144
|
+
if (params.get("response_type") !== "code") {
|
|
145
|
+
return invalid(400, "unsupported_response_type", 'response_type must be "code".');
|
|
146
|
+
}
|
|
147
|
+
const scopes = (params.get("scope") ?? "").split(/\s+/).filter((scope) => scope.length > 0);
|
|
148
|
+
if (!scopes.includes("openid")) {
|
|
149
|
+
return invalid(400, "invalid_scope", 'scope must include "openid".');
|
|
150
|
+
}
|
|
151
|
+
const state = params.get("state") ?? undefined;
|
|
152
|
+
if (state !== undefined && state.length > MAX_STATE_LENGTH) {
|
|
153
|
+
return invalid(400, "invalid_request", `state must be at most ${MAX_STATE_LENGTH} characters.`);
|
|
154
|
+
}
|
|
155
|
+
const nonce = params.get("nonce") ?? undefined;
|
|
156
|
+
if (nonce !== undefined && nonce.length > MAX_STATE_LENGTH) {
|
|
157
|
+
return invalid(400, "invalid_request", `nonce must be at most ${MAX_STATE_LENGTH} characters.`);
|
|
158
|
+
}
|
|
159
|
+
const codeChallenge = params.get("code_challenge") ?? "";
|
|
160
|
+
if (!pkceValuePattern.test(codeChallenge)) {
|
|
161
|
+
return invalid(400, "invalid_request", "code_challenge is required: 43 to 128 URL-safe characters.");
|
|
162
|
+
}
|
|
163
|
+
if (params.get("code_challenge_method") !== "S256") {
|
|
164
|
+
return invalid(400, "invalid_request", 'code_challenge_method must be "S256".');
|
|
165
|
+
}
|
|
166
|
+
const prompt = (params.get("prompt") ?? "").split(/\s+/).filter((value) => value.length > 0);
|
|
167
|
+
if (prompt.some((value) => value !== "none" && value !== "login")) {
|
|
168
|
+
return invalid(400, "invalid_request", "prompt value not supported");
|
|
169
|
+
}
|
|
170
|
+
if (prompt.includes("none") && prompt.length > 1) {
|
|
171
|
+
return invalid(400, "invalid_request", "prompt=none cannot be combined with other values.");
|
|
172
|
+
}
|
|
173
|
+
const maxAgeRaw = params.get("max_age");
|
|
174
|
+
let maxAge;
|
|
175
|
+
if (maxAgeRaw !== null) {
|
|
176
|
+
maxAge = Number(maxAgeRaw);
|
|
177
|
+
if (!Number.isInteger(maxAge) || maxAge < 0) {
|
|
178
|
+
return invalid(400, "invalid_request", "max_age must be a non-negative integer.");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const connector = params.get("connector")?.trim() || undefined;
|
|
182
|
+
return {
|
|
183
|
+
ok: true,
|
|
184
|
+
value: {
|
|
185
|
+
clientId: target.clientId,
|
|
186
|
+
redirectUri: target.redirectUri,
|
|
187
|
+
scopes,
|
|
188
|
+
state,
|
|
189
|
+
nonce,
|
|
190
|
+
codeChallenge,
|
|
191
|
+
prompt,
|
|
192
|
+
maxAge,
|
|
193
|
+
connector,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Client credentials from HTTP Basic (RFC 6749 section 2.3.1) or the form body. The first look at a
|
|
199
|
+
* token request, so it also refuses a repeated parameter (RFC 6749 section 3.2) and a request that
|
|
200
|
+
* uses both methods (section 2.3).
|
|
201
|
+
*/
|
|
202
|
+
export function readClientAuthentication(authorization, params) {
|
|
203
|
+
const names = [...params.keys()];
|
|
204
|
+
if (new Set(names).size !== names.length) {
|
|
205
|
+
return invalid(400, "invalid_request", "A parameter is repeated.");
|
|
206
|
+
}
|
|
207
|
+
if (authorization !== null) {
|
|
208
|
+
if (params.has("client_secret")) {
|
|
209
|
+
return invalid(400, "invalid_request", "Use one client authentication method, not two.");
|
|
210
|
+
}
|
|
211
|
+
const match = authorization.trim().match(/^basic\s+(.+)$/i);
|
|
212
|
+
if (match === null || match[1] === undefined) {
|
|
213
|
+
return invalid(401, "invalid_client", "Only HTTP Basic client authentication is supported.");
|
|
214
|
+
}
|
|
215
|
+
let decoded;
|
|
216
|
+
try {
|
|
217
|
+
decoded = atob(match[1]);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return invalid(401, "invalid_client", "The Authorization header is not valid Base64.");
|
|
221
|
+
}
|
|
222
|
+
const separator = decoded.indexOf(":");
|
|
223
|
+
if (separator <= 0) {
|
|
224
|
+
return invalid(401, "invalid_client", "The Authorization header must hold client_id:client_secret.");
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
return {
|
|
228
|
+
ok: true,
|
|
229
|
+
value: {
|
|
230
|
+
clientId: decodeURIComponent(decoded.slice(0, separator)),
|
|
231
|
+
clientSecret: decodeURIComponent(decoded.slice(separator + 1)),
|
|
232
|
+
method: "client_secret_basic",
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return invalid(401, "invalid_client", "The Authorization header is not valid form encoding.");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const clientId = params.get("client_id") ?? "";
|
|
241
|
+
const clientSecret = params.get("client_secret") ?? "";
|
|
242
|
+
if (clientId.length === 0 || clientSecret.length === 0) {
|
|
243
|
+
return invalid(401, "invalid_client", "client_id and client_secret are required.");
|
|
244
|
+
}
|
|
245
|
+
return { ok: true, value: { clientId, clientSecret, method: "client_secret_post" } };
|
|
246
|
+
}
|
|
247
|
+
export function validateTokenRequest(params, client) {
|
|
248
|
+
const grantType = params.get("grant_type");
|
|
249
|
+
if (grantType !== "authorization_code") {
|
|
250
|
+
return invalid(400, "unsupported_grant_type", 'grant_type must be "authorization_code".');
|
|
251
|
+
}
|
|
252
|
+
const code = params.get("code")?.trim() ?? "";
|
|
253
|
+
if (code.length === 0) {
|
|
254
|
+
return invalid(400, "invalid_request", "code is required.");
|
|
255
|
+
}
|
|
256
|
+
const redirectUri = params.get("redirect_uri") ?? undefined;
|
|
257
|
+
if (redirectUri !== undefined && parseRedirectUri(redirectUri) === null) {
|
|
258
|
+
return invalid(400, "invalid_request", "redirect_uri is invalid.");
|
|
259
|
+
}
|
|
260
|
+
const codeVerifier = params.get("code_verifier") ?? "";
|
|
261
|
+
if (!pkceValuePattern.test(codeVerifier)) {
|
|
262
|
+
return invalid(400, "invalid_request", "code_verifier is required: 43 to 128 URL-safe characters.");
|
|
263
|
+
}
|
|
264
|
+
return { ok: true, value: { code, redirectUri, codeVerifier, client } };
|
|
265
|
+
}
|
|
266
|
+
export function readBearerToken(authorization) {
|
|
267
|
+
const match = authorization?.trim().match(/^bearer\s+(.+)$/i);
|
|
268
|
+
return match?.[1]?.trim() || null;
|
|
269
|
+
}
|
|
270
|
+
/** An email address as the broker identifies it: trimmed, NFC-normalized, lowercased. */
|
|
271
|
+
export function canonicalEmail(value) {
|
|
272
|
+
const email = value.trim().normalize("NFC").toLowerCase();
|
|
273
|
+
const at = email.indexOf("@");
|
|
274
|
+
if (at <= 0 || at === email.length - 1 || email.includes(" ") || email.length > 320) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
return email;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/client/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Response helpers shared by the endpoints. */
|
|
2
|
+
export declare function json(body: unknown, status?: number, headers?: Record<string, string>): Response;
|
|
3
|
+
/** An OAuth error body (RFC 6749 section 5.2), for the endpoints that answer the client directly. */
|
|
4
|
+
export declare function oauthError(status: number, error: string, description: string, headers?: Record<string, string>): Response;
|
|
5
|
+
export declare function redirect(location: string): Response;
|
|
6
|
+
/**
|
|
7
|
+
* The authorization response (OAuth 2.1 section 4.1.2): parameters on the registered redirect URI,
|
|
8
|
+
* with `iss` on every response (RFC 9207) and `state` when the client sent one.
|
|
9
|
+
*/
|
|
10
|
+
export declare function authorizationResponse(args: {
|
|
11
|
+
redirectUri: string;
|
|
12
|
+
issuer: string;
|
|
13
|
+
state: string | undefined;
|
|
14
|
+
params: Record<string, string>;
|
|
15
|
+
}): Response;
|
|
16
|
+
export declare function authorizationError(args: {
|
|
17
|
+
redirectUri: string;
|
|
18
|
+
issuer: string;
|
|
19
|
+
state: string | undefined;
|
|
20
|
+
error: string;
|
|
21
|
+
description: string;
|
|
22
|
+
}): Response;
|
|
23
|
+
/** The parameters of a GET query or a form POST, which the authorization endpoint accepts alike. */
|
|
24
|
+
export declare function readParameters(request: Request): Promise<URLSearchParams | null>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Response helpers shared by the endpoints. */
|
|
2
|
+
export function json(body, status = 200, headers = {}) {
|
|
3
|
+
return new Response(JSON.stringify(body), {
|
|
4
|
+
status,
|
|
5
|
+
headers: {
|
|
6
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
7
|
+
"Cache-Control": "no-store",
|
|
8
|
+
Pragma: "no-cache",
|
|
9
|
+
...headers,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/** An OAuth error body (RFC 6749 section 5.2), for the endpoints that answer the client directly. */
|
|
14
|
+
export function oauthError(status, error, description, headers = {}) {
|
|
15
|
+
return json({ error, error_description: description }, status, headers);
|
|
16
|
+
}
|
|
17
|
+
export function redirect(location) {
|
|
18
|
+
return new Response(null, {
|
|
19
|
+
status: 302,
|
|
20
|
+
headers: { Location: location, "Cache-Control": "no-store" },
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The authorization response (OAuth 2.1 section 4.1.2): parameters on the registered redirect URI,
|
|
25
|
+
* with `iss` on every response (RFC 9207) and `state` when the client sent one.
|
|
26
|
+
*/
|
|
27
|
+
export function authorizationResponse(args) {
|
|
28
|
+
const url = new URL(args.redirectUri);
|
|
29
|
+
for (const [key, value] of Object.entries(args.params)) {
|
|
30
|
+
url.searchParams.set(key, value);
|
|
31
|
+
}
|
|
32
|
+
if (args.state !== undefined) {
|
|
33
|
+
url.searchParams.set("state", args.state);
|
|
34
|
+
}
|
|
35
|
+
url.searchParams.set("iss", args.issuer);
|
|
36
|
+
return redirect(url.toString());
|
|
37
|
+
}
|
|
38
|
+
export function authorizationError(args) {
|
|
39
|
+
return authorizationResponse({
|
|
40
|
+
redirectUri: args.redirectUri,
|
|
41
|
+
issuer: args.issuer,
|
|
42
|
+
state: args.state,
|
|
43
|
+
params: { error: args.error, error_description: args.description },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** The parameters of a GET query or a form POST, which the authorization endpoint accepts alike. */
|
|
47
|
+
export async function readParameters(request) {
|
|
48
|
+
if (request.method === "GET") {
|
|
49
|
+
return new URL(request.url).searchParams;
|
|
50
|
+
}
|
|
51
|
+
const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
|
|
52
|
+
if (!contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return new URLSearchParams(await request.text());
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/client/responses.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,MAAM,UAAU,IAAI,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAA2B,EAAE;IACpF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,iCAAiC;YACjD,eAAe,EAAE,UAAU;YAC3B,MAAM,EAAE,UAAU;YAClB,GAAG,OAAO;SACX;KACF,CAAC,CAAC;AACL,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,KAAa,EACb,WAAmB,EACnB,OAAO,GAA2B,EAAE;IAEpC,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAKrC;IACC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAMlC;IACC,OAAO,qBAAqB,CAAC;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,WAAW,EAAE;KACnE,CAAC,CAAC;AACL,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;IAC3C,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7E,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,mCAAmC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,eAAe,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pairwise subject of OIDC Core 8.1 with the app as the sector: deterministic, not reversible,
|
|
3
|
+
* and the same for every deployment of an app.
|
|
4
|
+
*/
|
|
5
|
+
export declare function pairwiseSubject(args: {
|
|
6
|
+
appId: string;
|
|
7
|
+
connector: string;
|
|
8
|
+
upstreamId: string;
|
|
9
|
+
salt: string;
|
|
10
|
+
}): Promise<string>;
|
|
11
|
+
export declare function sha256Hex(input: string): Promise<string>;
|
|
12
|
+
/** URL-safe random token of `bytes` random bytes. */
|
|
13
|
+
export declare function randomToken(bytes?: number): string;
|
|
14
|
+
/** A six-digit code for the email connector, uniform over 000000 to 999999. */
|
|
15
|
+
export declare function randomDigits(count?: number): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pairwise subject of OIDC Core 8.1 with the app as the sector: deterministic, not reversible,
|
|
3
|
+
* and the same for every deployment of an app.
|
|
4
|
+
*/
|
|
5
|
+
export async function pairwiseSubject(args) {
|
|
6
|
+
const input = `${args.appId}\u0000${args.connector}\u0000${args.upstreamId}\u0000${args.salt}`;
|
|
7
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input));
|
|
8
|
+
return btoa(String.fromCharCode(...new Uint8Array(digest)))
|
|
9
|
+
.replace(/\+/g, "-")
|
|
10
|
+
.replace(/\//g, "_")
|
|
11
|
+
.replace(/=+$/, "");
|
|
12
|
+
}
|
|
13
|
+
export async function sha256Hex(input) {
|
|
14
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input));
|
|
15
|
+
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
16
|
+
}
|
|
17
|
+
/** URL-safe random token of `bytes` random bytes. */
|
|
18
|
+
export function randomToken(bytes = 32) {
|
|
19
|
+
const buffer = new Uint8Array(bytes);
|
|
20
|
+
crypto.getRandomValues(buffer);
|
|
21
|
+
return btoa(String.fromCharCode(...buffer))
|
|
22
|
+
.replace(/\+/g, "-")
|
|
23
|
+
.replace(/\//g, "_")
|
|
24
|
+
.replace(/=+$/, "");
|
|
25
|
+
}
|
|
26
|
+
/** A six-digit code for the email connector, uniform over 000000 to 999999. */
|
|
27
|
+
export function randomDigits(count = 6) {
|
|
28
|
+
const buffer = new Uint32Array(count);
|
|
29
|
+
crypto.getRandomValues(buffer);
|
|
30
|
+
return Array.from(buffer, (value) => String(value % 10)).join("");
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=subject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/client/subject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAKrC;IACC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,UAAU,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;SACxD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa;IAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,KAAK,GAAG,EAAE;IACpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC;SACxC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,KAAK,GAAG,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated `api` utility.
|
|
3
|
+
*
|
|
4
|
+
* THIS CODE IS AUTOMATICALLY GENERATED.
|
|
5
|
+
*
|
|
6
|
+
* To regenerate, run `npx convex dev`.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type * as apps from "../apps.js";
|
|
10
|
+
import type * as authRequests from "../authRequests.js";
|
|
11
|
+
import type * as clients from "../clients.js";
|
|
12
|
+
import type * as crypto from "../crypto.js";
|
|
13
|
+
import type * as lifecycle from "../lifecycle.js";
|
|
14
|
+
import type * as registration from "../registration.js";
|
|
15
|
+
import type * as signIns from "../signIns.js";
|
|
16
|
+
import type { ApiFromModules, FilterApi, FunctionReference } from "convex/server";
|
|
17
|
+
declare const fullApi: ApiFromModules<{
|
|
18
|
+
apps: typeof apps;
|
|
19
|
+
authRequests: typeof authRequests;
|
|
20
|
+
clients: typeof clients;
|
|
21
|
+
crypto: typeof crypto;
|
|
22
|
+
lifecycle: typeof lifecycle;
|
|
23
|
+
registration: typeof registration;
|
|
24
|
+
signIns: typeof signIns;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* A utility for referencing Convex functions in your app's public API.
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* ```js
|
|
31
|
+
* const myFunctionReference = api.myModule.myFunction;
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare const api: FilterApi<typeof fullApi, FunctionReference<any, "public">>;
|
|
35
|
+
/**
|
|
36
|
+
* A utility for referencing Convex functions in your app's internal API.
|
|
37
|
+
*
|
|
38
|
+
* Usage:
|
|
39
|
+
* ```js
|
|
40
|
+
* const myFunctionReference = internal.myModule.myFunction;
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare const internal: FilterApi<typeof fullApi, FunctionReference<any, "internal">>;
|
|
44
|
+
export declare const components: {};
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* Generated `api` utility.
|
|
4
|
+
*
|
|
5
|
+
* THIS CODE IS AUTOMATICALLY GENERATED.
|
|
6
|
+
*
|
|
7
|
+
* To regenerate, run `npx convex dev`.
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { anyApi, componentsGeneric } from "convex/server";
|
|
11
|
+
const fullApi = anyApi;
|
|
12
|
+
/**
|
|
13
|
+
* A utility for referencing Convex functions in your app's public API.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```js
|
|
17
|
+
* const myFunctionReference = api.myModule.myFunction;
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export const api = anyApi;
|
|
21
|
+
/**
|
|
22
|
+
* A utility for referencing Convex functions in your app's internal API.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* ```js
|
|
26
|
+
* const myFunctionReference = internal.myModule.myFunction;
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const internal = anyApi;
|
|
30
|
+
export const components = componentsGeneric();
|
|
31
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/component/_generated/api.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB;;;;;;;GAOG;AAeH,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,OAAO,GAQR,MAAa,CAAC;AAEnB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,GAAG,GAGZ,MAAa,CAAC;AAElB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAGjB,MAAa,CAAC;AAElB,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,EAAmB,CAAC"}
|