@ninomae/mcp-app-server 0.1.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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/README.md +262 -0
- package/README.zh-CN.md +204 -0
- package/dist/identity.d.ts +27 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +62 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +134 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +64 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +76 -0
- package/dist/mcp.js.map +1 -0
- package/dist/oauth.d.ts +33 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +338 -0
- package/dist/oauth.js.map +1 -0
- package/dist/rate-limit.d.ts +20 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +29 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/react.d.ts +36 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +73 -0
- package/dist/react.js.map +1 -0
- package/dist/sql.d.ts +27 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +107 -0
- package/dist/sql.js.map +1 -0
- package/dist/store.d.ts +106 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +122 -0
- package/dist/store.js.map +1 -0
- package/dist/tokens.d.ts +26 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +61 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +9 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +48 -0
- package/dist/util.js.map +1 -0
- package/package.json +96 -0
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { AppServerError } from './types.js';
|
|
2
|
+
import { defaultRateLimitKey } from './rate-limit.js';
|
|
3
|
+
import { json, nowIso, parseJsonList, randomSecret, readBody, sha256Hex, str, base64url } from './util.js';
|
|
4
|
+
const AUTH_METHODS = ['none', 'client_secret_post', 'client_secret_basic'];
|
|
5
|
+
const CODE_TTL_MS = 10 * 60 * 1000;
|
|
6
|
+
const REFRESH_PREFIX = 'agr_';
|
|
7
|
+
export const mcpResource = (rt) => rt.origins.publicOrigin + rt.mcpPath;
|
|
8
|
+
export const resourceMetadataUrl = (rt) => rt.origins.publicOrigin + '/.well-known/oauth-protected-resource';
|
|
9
|
+
const scopeNames = (rt) => Object.keys(rt.scopes);
|
|
10
|
+
const requiredScopes = (rt) => scopeNames(rt).filter((s) => rt.scopes[s].required);
|
|
11
|
+
export function isWellKnownPath(rt, pathname) {
|
|
12
|
+
return (pathname === '/.well-known/oauth-protected-resource' ||
|
|
13
|
+
pathname === '/.well-known/oauth-protected-resource' + rt.mcpPath ||
|
|
14
|
+
pathname === '/.well-known/oauth-authorization-server');
|
|
15
|
+
}
|
|
16
|
+
export function wellKnownResponse(rt, pathname) {
|
|
17
|
+
const origin = rt.origins.publicOrigin;
|
|
18
|
+
const body = pathname.startsWith('/.well-known/oauth-protected-resource')
|
|
19
|
+
? { resource: mcpResource(rt), authorization_servers: [origin], scopes_supported: scopeNames(rt), bearer_methods_supported: ['header'] }
|
|
20
|
+
: {
|
|
21
|
+
issuer: origin,
|
|
22
|
+
authorization_endpoint: origin + rt.oauthPath + '/authorize',
|
|
23
|
+
token_endpoint: origin + rt.oauthPath + '/token',
|
|
24
|
+
registration_endpoint: origin + rt.oauthPath + '/register',
|
|
25
|
+
response_types_supported: ['code'],
|
|
26
|
+
grant_types_supported: ['authorization_code', 'refresh_token'],
|
|
27
|
+
code_challenge_methods_supported: ['S256'],
|
|
28
|
+
token_endpoint_auth_methods_supported: [...AUTH_METHODS],
|
|
29
|
+
scopes_supported: scopeNames(rt),
|
|
30
|
+
};
|
|
31
|
+
return json(body, 200, { 'access-control-allow-origin': '*' });
|
|
32
|
+
}
|
|
33
|
+
export function oauthErrorResponse(error) {
|
|
34
|
+
return json({ error: error.code, error_description: error.message }, error.status);
|
|
35
|
+
}
|
|
36
|
+
export function challengeResponse(rt, error, description, status = 401) {
|
|
37
|
+
return json({ error, error_description: description }, status, { 'www-authenticate': `Bearer resource_metadata="${resourceMetadataUrl(rt)}", error="${error}", error_description="${description.replace(/"/g, "'")}"` });
|
|
38
|
+
}
|
|
39
|
+
async function pkceChallenge(verifier) {
|
|
40
|
+
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
|
|
41
|
+
return base64url(new Uint8Array(digest));
|
|
42
|
+
}
|
|
43
|
+
// Loopback redirects may change port per run (RFC 8252 §7.3); custom schemes serve
|
|
44
|
+
// desktop apps; https must match exactly; plain http elsewhere is refused.
|
|
45
|
+
export function classifyRedirect(uri) {
|
|
46
|
+
let url;
|
|
47
|
+
try {
|
|
48
|
+
url = new URL(uri);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
if (url.hash)
|
|
54
|
+
return null;
|
|
55
|
+
if (url.protocol === 'http:')
|
|
56
|
+
return ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname) ? 'loopback' : null;
|
|
57
|
+
if (url.protocol === 'https:')
|
|
58
|
+
return 'https';
|
|
59
|
+
if (['javascript:', 'data:', 'file:', 'blob:', 'vbscript:'].includes(url.protocol))
|
|
60
|
+
return null;
|
|
61
|
+
return /^[a-z][a-z0-9+.-]*:$/i.test(url.protocol) ? 'custom' : null;
|
|
62
|
+
}
|
|
63
|
+
function redirectMatches(registered, requested) {
|
|
64
|
+
if (registered === requested)
|
|
65
|
+
return true;
|
|
66
|
+
if (classifyRedirect(registered) !== 'loopback' || classifyRedirect(requested) !== 'loopback')
|
|
67
|
+
return false;
|
|
68
|
+
const a = new URL(registered);
|
|
69
|
+
const b = new URL(requested);
|
|
70
|
+
return a.hostname === b.hostname && a.pathname === b.pathname && a.search === b.search;
|
|
71
|
+
}
|
|
72
|
+
async function throttleRegistration(rt, request) {
|
|
73
|
+
if (!rt.registrationLimit)
|
|
74
|
+
return;
|
|
75
|
+
const key = (rt.registrationLimit.key || defaultRateLimitKey)(request);
|
|
76
|
+
if (!(await rt.registrationLimit.limiter.allow(key)))
|
|
77
|
+
throw new AppServerError(429, 'Registration rate limit exceeded', 'too_many_requests');
|
|
78
|
+
}
|
|
79
|
+
async function loadClient(rt, clientId) {
|
|
80
|
+
if (!clientId)
|
|
81
|
+
throw new AppServerError(400, 'client_id is required', 'invalid_client');
|
|
82
|
+
const client = await rt.store.clients.get(clientId);
|
|
83
|
+
if (!client)
|
|
84
|
+
throw new AppServerError(400, 'Unknown client_id', 'invalid_client');
|
|
85
|
+
return client;
|
|
86
|
+
}
|
|
87
|
+
function requestedScopes(rt, client, scopeParam) {
|
|
88
|
+
const raw = scopeParam ? scopeParam.split(/\s+/) : parseJsonList(client.scope);
|
|
89
|
+
const known = scopeNames(rt).filter((s) => raw.includes(s));
|
|
90
|
+
const scopes = known.length ? known : scopeNames(rt);
|
|
91
|
+
for (const required of requiredScopes(rt))
|
|
92
|
+
if (!scopes.includes(required))
|
|
93
|
+
scopes.unshift(required);
|
|
94
|
+
return scopes;
|
|
95
|
+
}
|
|
96
|
+
export async function register(rt, request) {
|
|
97
|
+
await throttleRegistration(rt, request);
|
|
98
|
+
const body = await readBody(request);
|
|
99
|
+
const uris = Array.isArray(body.redirect_uris) ? body.redirect_uris.map(str).filter(Boolean) : [];
|
|
100
|
+
if (!uris.length)
|
|
101
|
+
throw new AppServerError(400, 'redirect_uris is required', 'invalid_redirect_uri');
|
|
102
|
+
for (const uri of uris) {
|
|
103
|
+
if (uri.length > 2000 || !classifyRedirect(uri))
|
|
104
|
+
throw new AppServerError(400, `Unsupported redirect_uri: ${uri}`, 'invalid_redirect_uri');
|
|
105
|
+
}
|
|
106
|
+
const method = str(body.token_endpoint_auth_method) || 'none';
|
|
107
|
+
if (!AUTH_METHODS.includes(method))
|
|
108
|
+
throw new AppServerError(400, 'Unsupported token_endpoint_auth_method', 'invalid_client_metadata');
|
|
109
|
+
const grants = Array.isArray(body.grant_types) ? body.grant_types.map(str) : ['authorization_code'];
|
|
110
|
+
if (grants.some((g) => !['authorization_code', 'refresh_token'].includes(g)))
|
|
111
|
+
throw new AppServerError(400, 'Unsupported grant_types', 'invalid_client_metadata');
|
|
112
|
+
const name = (str(body.client_name) || 'MCP client').slice(0, 200);
|
|
113
|
+
const scope = str(body.scope).slice(0, 500) || null;
|
|
114
|
+
const clientId = crypto.randomUUID();
|
|
115
|
+
const secret = method === 'none' ? null : randomSecret();
|
|
116
|
+
const createdAt = nowIso();
|
|
117
|
+
await rt.store.clients.create({ id: clientId, secretHash: secret ? await sha256Hex(secret) : null, name, redirectUris: uris, tokenEndpointAuthMethod: method, scope, createdAt, lastUsedAt: null });
|
|
118
|
+
return json({
|
|
119
|
+
client_id: clientId,
|
|
120
|
+
...(secret ? { client_secret: secret, client_secret_expires_at: 0 } : {}),
|
|
121
|
+
client_id_issued_at: Math.floor(Date.parse(createdAt) / 1000),
|
|
122
|
+
client_name: name,
|
|
123
|
+
redirect_uris: uris,
|
|
124
|
+
token_endpoint_auth_method: method,
|
|
125
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
126
|
+
response_types: ['code'],
|
|
127
|
+
...(scope ? { scope } : {}),
|
|
128
|
+
}, 201);
|
|
129
|
+
}
|
|
130
|
+
const reader = (source) => (key) => (source instanceof URLSearchParams ? source.get(key) || '' : str(source[key]));
|
|
131
|
+
function readAuthorizeParams(source) {
|
|
132
|
+
const get = reader(source);
|
|
133
|
+
return { clientId: get('client_id'), redirectUri: get('redirect_uri'), codeChallenge: get('code_challenge'), state: get('state'), scope: get('scope'), resource: get('resource') };
|
|
134
|
+
}
|
|
135
|
+
async function validateAuthorize(rt, params, source) {
|
|
136
|
+
const get = reader(source);
|
|
137
|
+
const client = await loadClient(rt, params.clientId);
|
|
138
|
+
const registered = client.redirectUris;
|
|
139
|
+
if (!params.redirectUri || !registered.some((uri) => redirectMatches(uri, params.redirectUri)))
|
|
140
|
+
throw new AppServerError(400, 'redirect_uri does not match the registered value');
|
|
141
|
+
// Beyond this point the redirect target is trusted, so errors may be sent back to it.
|
|
142
|
+
const responseType = get('response_type');
|
|
143
|
+
if (responseType && responseType !== 'code')
|
|
144
|
+
throw new AppServerError(400, 'Only response_type=code is supported', 'unsupported_response_type');
|
|
145
|
+
if (!/^[A-Za-z0-9._~-]{43,128}$/.test(params.codeChallenge))
|
|
146
|
+
throw new AppServerError(400, 'PKCE code_challenge is required');
|
|
147
|
+
if (get('code_challenge_method') !== 'S256')
|
|
148
|
+
throw new AppServerError(400, 'code_challenge_method must be S256');
|
|
149
|
+
if (params.resource && params.resource !== mcpResource(rt))
|
|
150
|
+
throw new AppServerError(400, 'resource must be ' + mcpResource(rt), 'invalid_target');
|
|
151
|
+
return client;
|
|
152
|
+
}
|
|
153
|
+
function appendQuery(uri, entries) {
|
|
154
|
+
const url = new URL(uri);
|
|
155
|
+
for (const [key, value] of Object.entries(entries))
|
|
156
|
+
if (value)
|
|
157
|
+
url.searchParams.set(key, value);
|
|
158
|
+
return url.toString();
|
|
159
|
+
}
|
|
160
|
+
// GET <oauth>/authorize: validate, then hand the user to the host's consent page.
|
|
161
|
+
export async function authorize(rt, request) {
|
|
162
|
+
const query = new URL(request.url).searchParams;
|
|
163
|
+
const params = readAuthorizeParams(query);
|
|
164
|
+
try {
|
|
165
|
+
await validateAuthorize(rt, params, query);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (!(error instanceof AppServerError))
|
|
169
|
+
throw error;
|
|
170
|
+
const trusted = error.code !== 'invalid_client' && !error.message.startsWith('redirect_uri');
|
|
171
|
+
if (trusted)
|
|
172
|
+
return Response.redirect(appendQuery(params.redirectUri, { error: error.code, error_description: error.message, state: params.state }), 302);
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
const target = new URL(rt.consentPath, rt.origins.webOrigin);
|
|
176
|
+
target.search = query.toString();
|
|
177
|
+
return Response.redirect(target.toString(), 302);
|
|
178
|
+
}
|
|
179
|
+
// GET <oauth>/client: the consent page shows who is asking, where it returns, and what each scope means.
|
|
180
|
+
export async function clientInfo(rt, request) {
|
|
181
|
+
const query = new URL(request.url).searchParams;
|
|
182
|
+
const client = await loadClient(rt, query.get('client_id') || '');
|
|
183
|
+
const redirectHosts = client.redirectUris.map((uri) => {
|
|
184
|
+
const kind = classifyRedirect(uri);
|
|
185
|
+
if (kind === 'loopback')
|
|
186
|
+
return 'localhost';
|
|
187
|
+
try {
|
|
188
|
+
return kind === 'custom' ? new URL(uri).protocol.replace(/:$/, '://') : new URL(uri).host;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return uri;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
const scopes = requestedScopes(rt, client, query.get('scope') || '');
|
|
195
|
+
return json({
|
|
196
|
+
clientId: client.id,
|
|
197
|
+
clientName: client.name,
|
|
198
|
+
redirectHosts: [...new Set(redirectHosts)],
|
|
199
|
+
scopes,
|
|
200
|
+
scopesSupported: scopeNames(rt),
|
|
201
|
+
scopeDetails: scopes.map((name) => ({ name, description: rt.scopes[name].description, required: !!rt.scopes[name].required, default: !!(rt.scopes[name].required || rt.scopes[name].default) })),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
// POST <oauth>/approve: the identified user consents (or refuses).
|
|
205
|
+
export async function approve(rt, request, ownerId) {
|
|
206
|
+
const body = await readBody(request);
|
|
207
|
+
const params = readAuthorizeParams(body);
|
|
208
|
+
const client = await validateAuthorize(rt, params, body);
|
|
209
|
+
const decision = str(body.decision);
|
|
210
|
+
if (decision === 'deny')
|
|
211
|
+
return json({ redirect: appendQuery(params.redirectUri, { error: 'access_denied', error_description: 'The user refused the request', state: params.state }) });
|
|
212
|
+
if (decision !== 'approve')
|
|
213
|
+
throw new AppServerError(400, 'decision must be approve or deny');
|
|
214
|
+
const allowed = requestedScopes(rt, client, params.scope);
|
|
215
|
+
const chosen = Array.isArray(body.scopes) ? body.scopes.map(str).filter((s) => allowed.includes(s)) : allowed;
|
|
216
|
+
for (const required of requiredScopes(rt))
|
|
217
|
+
if (!chosen.includes(required))
|
|
218
|
+
chosen.unshift(required);
|
|
219
|
+
const code = randomSecret();
|
|
220
|
+
await rt.store.codes.create({ hash: await sha256Hex(code), clientId: client.id, ownerId, redirectUri: params.redirectUri, scopes: chosen, codeChallenge: params.codeChallenge, resource: params.resource || null, expiresAt: new Date(Date.now() + CODE_TTL_MS).toISOString(), usedAt: null, issuedTokenId: null });
|
|
221
|
+
return json({ redirect: appendQuery(params.redirectUri, { code, state: params.state }) });
|
|
222
|
+
}
|
|
223
|
+
async function authenticateClient(rt, request, body) {
|
|
224
|
+
let clientId = str(body.client_id);
|
|
225
|
+
let secret = str(body.client_secret);
|
|
226
|
+
const header = request.headers.get('authorization') || '';
|
|
227
|
+
if (header.startsWith('Basic ')) {
|
|
228
|
+
try {
|
|
229
|
+
const [id, ...rest] = atob(header.slice(6)).split(':');
|
|
230
|
+
clientId = decodeURIComponent(id);
|
|
231
|
+
secret = decodeURIComponent(rest.join(':'));
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
throw new AppServerError(401, 'Malformed Basic credentials', 'invalid_client');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const client = await loadClient(rt, clientId);
|
|
238
|
+
if (client.tokenEndpointAuthMethod !== 'none') {
|
|
239
|
+
if (!secret || (await sha256Hex(secret)) !== client.secretHash)
|
|
240
|
+
throw new AppServerError(401, 'Client authentication failed', 'invalid_client');
|
|
241
|
+
}
|
|
242
|
+
return client;
|
|
243
|
+
}
|
|
244
|
+
async function issuePair(rt, client, ownerId, scopes, type) {
|
|
245
|
+
const access = await rt.tokens.issue({ ownerId, clientId: client.id, clientName: client.name, scopes, audience: mcpResource(rt) });
|
|
246
|
+
await rt.onEvent?.({ type, ownerId, grantId: access.id, clientId: client.id, clientName: client.name, scopes });
|
|
247
|
+
const refresh = randomSecret(REFRESH_PREFIX);
|
|
248
|
+
await rt.store.refreshTokens.create({ hash: await sha256Hex(refresh), clientId: client.id, ownerId, accessTokenId: access.id, scopes, expiresAt: new Date(Date.now() + rt.refreshDays * 86400 * 1000).toISOString(), revoked: false, successorId: null });
|
|
249
|
+
await rt.store.clients.touch(client.id, nowIso());
|
|
250
|
+
const response = json({
|
|
251
|
+
access_token: access.token,
|
|
252
|
+
token_type: 'Bearer',
|
|
253
|
+
expires_in: Math.max(0, Math.floor((Date.parse(access.expiresAt) - Date.now()) / 1000)),
|
|
254
|
+
refresh_token: refresh,
|
|
255
|
+
scope: scopes.join(' '),
|
|
256
|
+
});
|
|
257
|
+
return { response, accessId: access.id };
|
|
258
|
+
}
|
|
259
|
+
// POST <oauth>/token
|
|
260
|
+
export async function token(rt, request) {
|
|
261
|
+
const body = await readBody(request);
|
|
262
|
+
const client = await authenticateClient(rt, request, body);
|
|
263
|
+
const grant = str(body.grant_type);
|
|
264
|
+
const now = nowIso();
|
|
265
|
+
if (grant === 'authorization_code') {
|
|
266
|
+
const code = str(body.code);
|
|
267
|
+
if (!code)
|
|
268
|
+
throw new AppServerError(400, 'code is required', 'invalid_grant');
|
|
269
|
+
const row = await rt.store.codes.get(await sha256Hex(code));
|
|
270
|
+
if (!row || row.clientId !== client.id)
|
|
271
|
+
throw new AppServerError(400, 'Unknown authorization code', 'invalid_grant');
|
|
272
|
+
if (row.usedAt) {
|
|
273
|
+
// Replay of a consumed code: revoke what it produced (RFC 6819 §5.2.1.1).
|
|
274
|
+
if (row.issuedTokenId)
|
|
275
|
+
await revokeChain(rt, row.issuedTokenId);
|
|
276
|
+
throw new AppServerError(400, 'Authorization code already used', 'invalid_grant');
|
|
277
|
+
}
|
|
278
|
+
if (row.expiresAt < now)
|
|
279
|
+
throw new AppServerError(400, 'Authorization code expired', 'invalid_grant');
|
|
280
|
+
if (str(body.redirect_uri) && str(body.redirect_uri) !== row.redirectUri)
|
|
281
|
+
throw new AppServerError(400, 'redirect_uri mismatch', 'invalid_grant');
|
|
282
|
+
const verifier = str(body.code_verifier);
|
|
283
|
+
if (!/^[A-Za-z0-9._~-]{43,128}$/.test(verifier) || (await pkceChallenge(verifier)) !== row.codeChallenge)
|
|
284
|
+
throw new AppServerError(400, 'PKCE verification failed', 'invalid_grant');
|
|
285
|
+
const resource = str(body.resource);
|
|
286
|
+
if (resource && resource !== mcpResource(rt))
|
|
287
|
+
throw new AppServerError(400, 'resource mismatch', 'invalid_target');
|
|
288
|
+
// Consume the code before issuing so a concurrent replay cannot win a second token.
|
|
289
|
+
if (!(await rt.store.codes.consume(row.hash, now)))
|
|
290
|
+
throw new AppServerError(400, 'Authorization code already used', 'invalid_grant');
|
|
291
|
+
const issued = await issuePair(rt, client, row.ownerId, row.scopes, 'authorized');
|
|
292
|
+
await rt.store.codes.setIssuedToken(row.hash, issued.accessId);
|
|
293
|
+
return issued.response;
|
|
294
|
+
}
|
|
295
|
+
if (grant === 'refresh_token') {
|
|
296
|
+
const refresh = str(body.refresh_token);
|
|
297
|
+
if (!refresh.startsWith(REFRESH_PREFIX))
|
|
298
|
+
throw new AppServerError(400, 'refresh_token is required', 'invalid_grant');
|
|
299
|
+
const row = await rt.store.refreshTokens.get(await sha256Hex(refresh));
|
|
300
|
+
if (!row || row.clientId !== client.id)
|
|
301
|
+
throw new AppServerError(400, 'Unknown refresh token', 'invalid_grant');
|
|
302
|
+
if (row.revoked) {
|
|
303
|
+
// A rotated refresh token being replayed means the chain leaked; cut every successor.
|
|
304
|
+
await revokeChain(rt, row.accessTokenId);
|
|
305
|
+
throw new AppServerError(400, 'Refresh token revoked', 'invalid_grant');
|
|
306
|
+
}
|
|
307
|
+
if (row.expiresAt < now)
|
|
308
|
+
throw new AppServerError(400, 'Refresh token expired', 'invalid_grant');
|
|
309
|
+
if (!(await rt.store.refreshTokens.revoke(row.hash)))
|
|
310
|
+
throw new AppServerError(400, 'Refresh token revoked', 'invalid_grant');
|
|
311
|
+
await revokeAccess(rt, row.accessTokenId);
|
|
312
|
+
const issued = await issuePair(rt, client, row.ownerId, row.scopes, 'refreshed');
|
|
313
|
+
await rt.store.refreshTokens.setSuccessor(row.hash, issued.accessId);
|
|
314
|
+
return issued.response;
|
|
315
|
+
}
|
|
316
|
+
throw new AppServerError(400, 'grant_type must be authorization_code or refresh_token', 'unsupported_grant_type');
|
|
317
|
+
}
|
|
318
|
+
async function revokeAccess(rt, id) {
|
|
319
|
+
const revoked = await rt.tokens.revoke(id);
|
|
320
|
+
if (revoked)
|
|
321
|
+
await rt.onEvent?.({ type: 'revoked', ownerId: revoked.ownerId, grantId: id, clientId: revoked.clientId, clientName: revoked.clientName });
|
|
322
|
+
}
|
|
323
|
+
// Revokes an access token, its refresh token, and every pair rotated from it.
|
|
324
|
+
export async function revokeChain(rt, accessTokenId) {
|
|
325
|
+
const seen = new Set();
|
|
326
|
+
let current = accessTokenId;
|
|
327
|
+
while (current && !seen.has(current)) {
|
|
328
|
+
seen.add(current);
|
|
329
|
+
await revokeAccess(rt, current);
|
|
330
|
+
const row = await rt.store.refreshTokens.getByAccessToken(current);
|
|
331
|
+
await rt.store.refreshTokens.revokeByAccessToken(current);
|
|
332
|
+
current = row?.successorId ?? null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
export async function pruneOauth(rt) {
|
|
336
|
+
await rt.store.prune?.(nowIso());
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface RateLimiter {
|
|
2
|
+
/** Return true to allow the action, false to refuse it with HTTP 429. */
|
|
3
|
+
allow(key: string): Promise<boolean>;
|
|
4
|
+
}
|
|
5
|
+
export interface RateLimitConfig {
|
|
6
|
+
limiter: RateLimiter;
|
|
7
|
+
/** Derive the counter key from the request. Default: client IP from `cf-connecting-ip` / `x-forwarded-for`, else `'local'`. */
|
|
8
|
+
key?: (request: Request) => string;
|
|
9
|
+
}
|
|
10
|
+
export declare function defaultRateLimitKey(request: Request): string;
|
|
11
|
+
/**
|
|
12
|
+
* Reference limiter: a sliding window per key held in process memory. Correct on a single long-lived
|
|
13
|
+
* process; on multi-instance or isolate-per-request runtimes (Cloudflare Workers, Lambda) each instance
|
|
14
|
+
* counts separately, so use your platform's shared primitive there.
|
|
15
|
+
*/
|
|
16
|
+
export declare function memoryRateLimiter(options?: {
|
|
17
|
+
limit?: number;
|
|
18
|
+
windowMs?: number;
|
|
19
|
+
}): RateLimiter;
|
|
20
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,+HAA+H;IAC/H,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;CACpC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,UAEnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAclG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Rate limiting contract. The server asks "may this key act once more?" and nothing else; where
|
|
2
|
+
// the counters live (memory, KV, Durable Object, Redis, a platform rate-limit binding) is the host's
|
|
3
|
+
// choice. Only dynamic client registration is limited today, since it is the one unauthenticated
|
|
4
|
+
// endpoint that writes to storage.
|
|
5
|
+
export function defaultRateLimitKey(request) {
|
|
6
|
+
return request.headers.get('cf-connecting-ip') || request.headers.get('x-forwarded-for')?.split(',')[0].trim() || 'local';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Reference limiter: a sliding window per key held in process memory. Correct on a single long-lived
|
|
10
|
+
* process; on multi-instance or isolate-per-request runtimes (Cloudflare Workers, Lambda) each instance
|
|
11
|
+
* counts separately, so use your platform's shared primitive there.
|
|
12
|
+
*/
|
|
13
|
+
export function memoryRateLimiter(options = {}) {
|
|
14
|
+
const limit = options.limit ?? 20;
|
|
15
|
+
const windowMs = options.windowMs ?? 60 * 60 * 1000;
|
|
16
|
+
const hits = new Map();
|
|
17
|
+
return {
|
|
18
|
+
async allow(key) {
|
|
19
|
+
const cutoff = Date.now() - windowMs;
|
|
20
|
+
const recent = (hits.get(key) || []).filter((at) => at > cutoff);
|
|
21
|
+
if (recent.length >= limit)
|
|
22
|
+
return false;
|
|
23
|
+
recent.push(Date.now());
|
|
24
|
+
hits.set(key, recent);
|
|
25
|
+
return true;
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,qGAAqG;AACrG,iGAAiG;AACjG,mCAAmC;AAanC,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;AAC5H,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAiD,EAAE;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,GAAG;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface ConsentClient {
|
|
2
|
+
clientId: string;
|
|
3
|
+
clientName: string;
|
|
4
|
+
redirectHosts: string[];
|
|
5
|
+
scopes: string[];
|
|
6
|
+
scopesSupported: string[];
|
|
7
|
+
scopeDetails: {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
required: boolean;
|
|
11
|
+
default: boolean;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
export interface UseAgentConsentOptions {
|
|
15
|
+
/** Same `basePath` the server was created with. */
|
|
16
|
+
basePath: string;
|
|
17
|
+
/** Headers proving who is signed in (e.g. `Authorization: Bearer <host JWT>`); read at approve time. */
|
|
18
|
+
authHeaders?: () => Promise<Record<string, string>> | Record<string, string>;
|
|
19
|
+
/** Defaults to `window.location.search`. */
|
|
20
|
+
search?: string;
|
|
21
|
+
fetcher?: typeof fetch;
|
|
22
|
+
}
|
|
23
|
+
export declare function useAgentConsent(options: UseAgentConsentOptions): {
|
|
24
|
+
params: URLSearchParams | null;
|
|
25
|
+
client: ConsentClient | null;
|
|
26
|
+
chosen: string[];
|
|
27
|
+
toggle: (scope: string, on: boolean) => void;
|
|
28
|
+
decide: (decision: "approve" | "deny") => Promise<void>;
|
|
29
|
+
error: string;
|
|
30
|
+
setError: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
31
|
+
busy: boolean;
|
|
32
|
+
redirect: string;
|
|
33
|
+
destination: string;
|
|
34
|
+
missingClient: boolean;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC5F;AAED,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7E,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB;;;;oBA2C1B,MAAM,MAAM,OAAO;uBAKnC,SAAS,GAAG,MAAM;;;;;;;EAsBtC"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
// Headless consent flow. The host renders its own login and layout; this hook loads what the
|
|
3
|
+
// agent is asking for, tracks the user's scope choices and posts the decision.
|
|
4
|
+
import { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react';
|
|
5
|
+
const subscribeNever = () => () => { };
|
|
6
|
+
export function useAgentConsent(options) {
|
|
7
|
+
const { basePath, authHeaders, fetcher } = options;
|
|
8
|
+
// The query string is a client-only value; the server snapshot is null so hydration matches.
|
|
9
|
+
const search = useSyncExternalStore(subscribeNever, () => options.search ?? window.location.search, () => options.search ?? null);
|
|
10
|
+
const params = useMemo(() => (search === null ? null : new URLSearchParams(search)), [search]);
|
|
11
|
+
const [client, setClient] = useState(null);
|
|
12
|
+
const [chosen, setChosen] = useState([]);
|
|
13
|
+
const [error, setError] = useState('');
|
|
14
|
+
const [busy, setBusy] = useState(false);
|
|
15
|
+
const [redirect, setRedirect] = useState('');
|
|
16
|
+
const doFetch = useMemo(() => fetcher ?? globalThis.fetch.bind(globalThis), [fetcher]);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const clientId = params?.get('client_id') || '';
|
|
19
|
+
if (!clientId)
|
|
20
|
+
return;
|
|
21
|
+
let cancelled = false;
|
|
22
|
+
void doFetch(basePath + '/oauth/client?' + new URLSearchParams({ client_id: clientId, scope: params?.get('scope') || '' }))
|
|
23
|
+
.then(async (response) => {
|
|
24
|
+
const data = (await response.json());
|
|
25
|
+
if (!response.ok)
|
|
26
|
+
throw new Error(data.error_description || data.error || 'Unknown client');
|
|
27
|
+
if (cancelled)
|
|
28
|
+
return;
|
|
29
|
+
setClient(data);
|
|
30
|
+
setChosen(data.scopeDetails.filter((s) => s.default).map((s) => s.name));
|
|
31
|
+
})
|
|
32
|
+
.catch((err) => !cancelled && setError(err.message));
|
|
33
|
+
return () => {
|
|
34
|
+
cancelled = true;
|
|
35
|
+
};
|
|
36
|
+
}, [basePath, params, doFetch]);
|
|
37
|
+
const destination = useMemo(() => {
|
|
38
|
+
try {
|
|
39
|
+
const url = new URL(params?.get('redirect_uri') || '');
|
|
40
|
+
return url.protocol === 'http:' || url.protocol === 'https:' ? url.host : url.protocol.replace(/:$/, '://');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
}, [params]);
|
|
46
|
+
const toggle = useCallback((scope, on) => {
|
|
47
|
+
setChosen((current) => (on ? [...new Set([...current, scope])] : current.filter((s) => s !== scope)));
|
|
48
|
+
}, []);
|
|
49
|
+
const decide = useCallback(async (decision) => {
|
|
50
|
+
if (!params)
|
|
51
|
+
return;
|
|
52
|
+
setBusy(true);
|
|
53
|
+
setError('');
|
|
54
|
+
try {
|
|
55
|
+
const headers = { 'content-type': 'application/json', ...(await authHeaders?.()) };
|
|
56
|
+
const body = { ...Object.fromEntries(params.entries()), decision, scopes: chosen };
|
|
57
|
+
const response = await doFetch(basePath + '/oauth/approve', { method: 'POST', headers, body: JSON.stringify(body) });
|
|
58
|
+
const data = (await response.json());
|
|
59
|
+
if (!response.ok || !data.redirect)
|
|
60
|
+
throw new Error(data.error_description || data.error || 'Authorization failed');
|
|
61
|
+
setRedirect(data.redirect);
|
|
62
|
+
window.location.href = data.redirect;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
setError(err instanceof Error ? err.message : 'Authorization failed');
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
setBusy(false);
|
|
69
|
+
}
|
|
70
|
+
}, [params, chosen, basePath, authHeaders, doFetch]);
|
|
71
|
+
return { params, client, chosen, toggle, decide, error, setError, busy, redirect, destination, missingClient: params !== null && !params.get('client_id') };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
package/dist/sql.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AppServerStore } from './store.js';
|
|
2
|
+
/** Minimal SQL surface the adapter needs: `?1 … ?n` placeholders, `first()`, `all()`, `run().meta.changes`. */
|
|
3
|
+
export interface SqlDatabase {
|
|
4
|
+
exec(sql: string): Promise<unknown>;
|
|
5
|
+
prepare(sql: string): SqlStatement;
|
|
6
|
+
}
|
|
7
|
+
export interface SqlStatement {
|
|
8
|
+
bind(...values: unknown[]): SqlStatement;
|
|
9
|
+
first<T = Record<string, unknown>>(): Promise<T | null>;
|
|
10
|
+
all<T = Record<string, unknown>>(): Promise<{
|
|
11
|
+
results?: T[];
|
|
12
|
+
}>;
|
|
13
|
+
run(): Promise<{
|
|
14
|
+
meta: {
|
|
15
|
+
changes?: number;
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export interface TableNames {
|
|
20
|
+
clients: string;
|
|
21
|
+
codes: string;
|
|
22
|
+
refreshTokens: string;
|
|
23
|
+
accessTokens: string;
|
|
24
|
+
}
|
|
25
|
+
/** @param tables Override table names only when adopting an existing schema. */
|
|
26
|
+
export declare function sqlStore(db: SqlDatabase, tables?: Partial<TableNames>): AppServerStore;
|
|
27
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+C,cAAc,EAAsB,MAAM,YAAY,CAAC;AAElH,+GAA+G;AAC/G,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;CACpC;AACD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;IACzC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/D,GAAG,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAuBD,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,cAAc,CAwF1F"}
|