@frogbotai/plugin-api-keys 0.35.0 → 0.37.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/README.md +2 -2
- package/dist/client/ApiKeysManager.d.ts +7 -1
- package/dist/client/ApiKeysManager.d.ts.map +1 -1
- package/dist/client/ApiKeysManager.js +38 -6
- package/dist/client/ApiKeysManager.js.map +1 -1
- package/dist/client/createKeyData.d.ts +9 -0
- package/dist/client/createKeyData.d.ts.map +1 -0
- package/dist/client/createKeyData.js +10 -0
- package/dist/client/createKeyData.js.map +1 -0
- package/dist/client/styles.css +14 -0
- package/dist/client.d.ts +2 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +37 -9
- package/dist/collection.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -10
- package/dist/index.js.map +1 -1
- package/dist/rsc.d.ts +30 -0
- package/dist/rsc.d.ts.map +1 -0
- package/dist/rsc.js +27 -0
- package/dist/rsc.js.map +1 -0
- package/dist/server/services.d.ts +15 -6
- package/dist/server/services.d.ts.map +1 -1
- package/dist/server/services.js +55 -20
- package/dist/server/services.js.map +1 -1
- package/dist/strategy.d.ts.map +1 -1
- package/dist/strategy.js +2 -6
- package/dist/strategy.js.map +1 -1
- package/package.json +13 -8
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ X-API-Key: fb_...
|
|
|
23
23
|
|
|
24
24
|
Plaintext keys are returned only when created. The collection stores SHA-256 hashes and supports multiple independently revoked keys per user. Minting and rotating need a signed-in session: a request authenticated by an API key gets `403`, so a leaked key can't leave new keys behind. A key can still list, rename, and revoke keys.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
The plugin adds no budget or model limits; requests use the owner's AI policy. With `@frogbotai/plugin-ai-policy` on the same auth collection, each key also gets a model list and monthly cap inside its owner's, set in a collapsed Limits section of the create dialog. Other plugins add such fields to the keys collection: `mint` accepts them as `data`, `rotate` copies them from the revoked key, and server components registered under `admin.custom['plugin-api-keys'].createFields` render in the dialog's Limits section, reading and setting values with `useCreateKeyData()` from `@frogbotai/plugin-api-keys/client`. With AI configured, usage rows include an optional `apiKey` relationship to the authenticating key. Cookie-authenticated requests omit it, and the relationship follows `collectionSlug`.
|
|
27
27
|
|
|
28
28
|
Build and start-only workflows must run `frogbot generate:importmap` after adding the plugin. Add it as a `prebuild` step when CI invokes `next build` directly. If the server console reports a component missing from the import map, run `frogbot generate:importmap` and rebuild, or restart `frogbot dev`.
|
|
29
29
|
|
|
@@ -42,7 +42,7 @@ apiKeysPlugin({
|
|
|
42
42
|
|
|
43
43
|
Collection overrides merge with the generated fields, access, endpoints, hooks, admin components, and transforms applied by other plugins. The manager uses the default admin components, and the token dialog ships a small stylesheet built on the admin theme variables.
|
|
44
44
|
|
|
45
|
-
The plugin has no role system of its own. Keys are owner-scoped. To layer roles on top, install `@frogbotai/plugin-roles
|
|
45
|
+
The plugin has no role system of its own. Keys are owner-scoped. To layer roles on top, install `@frogbotai/plugin-roles` and pass `canRevokeAnyKey` and collection access:
|
|
46
46
|
|
|
47
47
|
```ts
|
|
48
48
|
import { allow, hasRole } from '@frogbotai/plugin-roles';
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import './styles.css';
|
|
2
|
-
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
export type ApiKeysManagerProps = {
|
|
4
|
+
collectionSlug?: string;
|
|
5
|
+
/** Fields other plugins register, shown in the create dialog's Limits section. */
|
|
6
|
+
createFields?: ReactNode[];
|
|
7
|
+
};
|
|
8
|
+
export declare function ApiKeysManager(props: ApiKeysManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
3
9
|
export declare function RevokeApiKey({ rowData, }: {
|
|
4
10
|
rowData: {
|
|
5
11
|
id: string | number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeysManager.d.ts","sourceRoot":"","sources":["../../src/client/ApiKeysManager.tsx"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiKeysManager.d.ts","sourceRoot":"","sources":["../../src/client/ApiKeysManager.tsx"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;AAmBtB,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,OAAO,CAAC;AAIjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAiLxD;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,GACR,EAAE;IACD,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAC5E,2CAkEA"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import './styles.css';
|
|
4
|
-
import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogTitle, DialogTrigger, Input, Label, Tooltip } from '@frogbotai/ui';
|
|
4
|
+
import { Button, Collapsible, CollapsibleContent, CollapsibleTrigger, Dialog, DialogContent, DialogDescription, DialogFooter, DialogTitle, DialogTrigger, Input, Label, Tooltip } from '@frogbotai/ui';
|
|
5
5
|
import { useConfig, useListQuery, useRouteCache } from '@frogbotai/ui/admin';
|
|
6
6
|
import { CopyIcon } from '@frogbotai/ui/icons';
|
|
7
|
-
import { useId, useState } from 'react';
|
|
8
|
-
|
|
7
|
+
import { useId, useMemo, useState } from 'react';
|
|
8
|
+
import { CreateKeyDataContext } from './createKeyData.js';
|
|
9
|
+
export function ApiKeysManager(props) {
|
|
9
10
|
const { config } = useConfig();
|
|
10
|
-
const
|
|
11
|
+
const listQuery = useListQuery();
|
|
12
|
+
const collectionSlug = props.collectionSlug ?? listQuery.collectionSlug;
|
|
11
13
|
const { clearRouteCache } = useRouteCache();
|
|
12
14
|
const nameId = useId();
|
|
13
15
|
const [open, setOpen] = useState(false);
|
|
14
16
|
const [name, setName] = useState('');
|
|
17
|
+
const [data, setData] = useState({});
|
|
15
18
|
const [token, setToken] = useState();
|
|
16
19
|
const [error, setError] = useState();
|
|
17
20
|
const [loading, setLoading] = useState(false);
|
|
@@ -20,6 +23,7 @@ export function ApiKeysManager() {
|
|
|
20
23
|
function changeOpen(next) {
|
|
21
24
|
if (next) {
|
|
22
25
|
setName('');
|
|
26
|
+
setData({});
|
|
23
27
|
setToken(undefined);
|
|
24
28
|
setError(undefined);
|
|
25
29
|
setCopied(false);
|
|
@@ -38,7 +42,10 @@ export function ApiKeysManager() {
|
|
|
38
42
|
headers: {
|
|
39
43
|
'content-type': 'application/json'
|
|
40
44
|
},
|
|
41
|
-
body: JSON.stringify({
|
|
45
|
+
body: JSON.stringify(Object.keys(data).length > 0 ? {
|
|
46
|
+
name,
|
|
47
|
+
data
|
|
48
|
+
} : {
|
|
42
49
|
name
|
|
43
50
|
})
|
|
44
51
|
});
|
|
@@ -55,6 +62,15 @@ export function ApiKeysManager() {
|
|
|
55
62
|
await navigator.clipboard.writeText(token);
|
|
56
63
|
setCopied(true);
|
|
57
64
|
}
|
|
65
|
+
const createKeyData = useMemo(()=>({
|
|
66
|
+
data,
|
|
67
|
+
setValue: (field, value)=>setData((current)=>({
|
|
68
|
+
...current,
|
|
69
|
+
[field]: value
|
|
70
|
+
}))
|
|
71
|
+
}), [
|
|
72
|
+
data
|
|
73
|
+
]);
|
|
58
74
|
function copyHandlers(control) {
|
|
59
75
|
return {
|
|
60
76
|
onClick: copyToken,
|
|
@@ -151,7 +167,23 @@ export function ApiKeysManager() {
|
|
|
151
167
|
}
|
|
152
168
|
})
|
|
153
169
|
]
|
|
154
|
-
})
|
|
170
|
+
}),
|
|
171
|
+
props.createFields?.length ? /*#__PURE__*/ _jsxs(Collapsible, {
|
|
172
|
+
className: "api-keys-dialog__limits",
|
|
173
|
+
children: [
|
|
174
|
+
/*#__PURE__*/ _jsx(CollapsibleTrigger, {
|
|
175
|
+
className: "api-keys-dialog__limits-trigger",
|
|
176
|
+
children: "Limits"
|
|
177
|
+
}),
|
|
178
|
+
/*#__PURE__*/ _jsx(CollapsibleContent, {
|
|
179
|
+
className: "api-keys-dialog__limits-content",
|
|
180
|
+
children: /*#__PURE__*/ _jsx(CreateKeyDataContext, {
|
|
181
|
+
value: createKeyData,
|
|
182
|
+
children: props.createFields
|
|
183
|
+
})
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
}) : null
|
|
155
187
|
]
|
|
156
188
|
}),
|
|
157
189
|
error ? /*#__PURE__*/ _jsx("p", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/ApiKeysManager.tsx"],"names":["Button","Dialog","DialogContent","DialogDescription","DialogFooter","DialogTitle","DialogTrigger","Input","Label","Tooltip","useConfig","useListQuery","useRouteCache","CopyIcon","useId","useState","ApiKeysManager","config","collectionSlug","clearRouteCache","nameId","open","setOpen","name","setName","token","setToken","error","setError","loading","setLoading","copied","setCopied","hoveredControl","setHoveredControl","changeOpen","next","undefined","createKey","trim","response","fetch","routes","api","method","headers","body","JSON","stringify","result","json","ok","copyToken","navigator","clipboard","writeText","copyHandlers","control","onClick","onMouseEnter","onMouseLeave","onOpenChange","asChild","variant","type","className","withCloseButton","role","div","label","button","aria-label","code","size","htmlFor","id","placeholder","readOnly","
|
|
1
|
+
{"version":3,"sources":["../../src/client/ApiKeysManager.tsx"],"names":["Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Dialog","DialogContent","DialogDescription","DialogFooter","DialogTitle","DialogTrigger","Input","Label","Tooltip","useConfig","useListQuery","useRouteCache","CopyIcon","useId","useMemo","useState","CreateKeyDataContext","ApiKeysManager","props","config","listQuery","collectionSlug","clearRouteCache","nameId","open","setOpen","name","setName","data","setData","token","setToken","error","setError","loading","setLoading","copied","setCopied","hoveredControl","setHoveredControl","changeOpen","next","undefined","createKey","trim","response","fetch","routes","api","method","headers","body","JSON","stringify","Object","keys","length","result","json","ok","copyToken","navigator","clipboard","writeText","createKeyData","setValue","field","value","current","copyHandlers","control","onClick","onMouseEnter","onMouseLeave","onOpenChange","asChild","variant","type","className","withCloseButton","role","div","label","button","aria-label","code","size","htmlFor","id","placeholder","readOnly","onChange","event","target","onKeyDown","key","preventDefault","createFields","p","disabled","RevokeApiKey","rowData","revoked","setRevoked","revoke","revokedAt","span"],"mappings":"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","file":"ApiKeysManager.js"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type CreateKeyData = {
|
|
2
|
+
/** Values posted to `mint` as `data`. */
|
|
3
|
+
data: Record<string, unknown>;
|
|
4
|
+
setValue: (field: string, value: unknown) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const CreateKeyDataContext: import("react").Context<CreateKeyData | null>;
|
|
7
|
+
/** Reads and sets the `data` the create dialog mints the key with, from a registered create field. */
|
|
8
|
+
export declare function useCreateKeyData(): CreateKeyData;
|
|
9
|
+
//# sourceMappingURL=createKeyData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createKeyData.d.ts","sourceRoot":"","sources":["../../src/client/createKeyData.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,oBAAoB,+CAA4C,CAAC;AAE9E,sGAAsG;AACtG,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
export const CreateKeyDataContext = /*#__PURE__*/ createContext(null);
|
|
4
|
+
/** Reads and sets the `data` the create dialog mints the key with, from a registered create field. */ export function useCreateKeyData() {
|
|
5
|
+
const value = useContext(CreateKeyDataContext);
|
|
6
|
+
if (!value) throw new Error('useCreateKeyData must be used inside the API key create dialog.');
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=createKeyData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/createKeyData.tsx"],"names":["createContext","useContext","CreateKeyDataContext","useCreateKeyData","value","Error"],"mappings":"AAAA;AAEA,SAASA,aAAa,EAAEC,UAAU,QAAQ,QAAQ;AAQlD,OAAO,MAAMC,qCAAuBF,cAAoC,MAAM;AAE9E,oGAAoG,GACpG,OAAO,SAASG;IACd,MAAMC,QAAQH,WAAWC;IAEzB,IAAI,CAACE,OAAO,MAAM,IAAIC,MAAM;IAE5B,OAAOD;AACT","file":"createKeyData.js"}
|
package/dist/client/styles.css
CHANGED
|
@@ -10,6 +10,20 @@
|
|
|
10
10
|
gap: 0.5rem;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
.fb-collapsible__trigger.api-keys-dialog__limits-trigger {
|
|
14
|
+
width: 100%;
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.fb-collapsible__content.api-keys-dialog__limits-content {
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
gap: 1rem;
|
|
22
|
+
padding: 0.75rem 0.25rem 0;
|
|
23
|
+
overflow: visible;
|
|
24
|
+
box-shadow: none;
|
|
25
|
+
}
|
|
26
|
+
|
|
13
27
|
.fb-dialog__description.api-keys-dialog__warning {
|
|
14
28
|
color: var(--color-text);
|
|
15
29
|
font-weight: 600;
|
package/dist/client.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { ApiKeysManager, RevokeApiKey } from './client/ApiKeysManager.js';
|
|
1
|
+
export { ApiKeysManager, type ApiKeysManagerProps, RevokeApiKey } from './client/ApiKeysManager.js';
|
|
2
|
+
export { type CreateKeyData, useCreateKeyData } from './client/createKeyData.js';
|
|
2
3
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,EAAE,KAAK,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/client.js
CHANGED
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"names":["ApiKeysManager","RevokeApiKey"],"mappings":"AAAA,SAASA,cAAc,
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":["ApiKeysManager","RevokeApiKey","useCreateKeyData"],"mappings":"AAAA,SAASA,cAAc,EAA4BC,YAAY,QAAQ,6BAA6B;AACpG,SAA6BC,gBAAgB,QAAQ,4BAA4B","file":"client.js"}
|
package/dist/collection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EAIrB,KAAK,cAAc,EAEpB,MAAM,SAAS,CAAC;AAejB,KAAK,iBAAiB,GAAG;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AA4LF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAsHpF"}
|
package/dist/collection.js
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
|
-
import { moneyField } from 'frogbot';
|
|
1
|
+
import { APIError, moneyField } from 'frogbot';
|
|
2
2
|
import { ApiKeyServiceError, isApiKeyRequest, mintApiKey, revokeApiKey, rotateApiKey } from './server/services.js';
|
|
3
|
-
const
|
|
3
|
+
const managerComponent = (collectionSlug)=>({
|
|
4
|
+
path: '@frogbotai/plugin-api-keys/rsc#ApiKeysManagerServer',
|
|
5
|
+
clientProps: {
|
|
6
|
+
collectionSlug
|
|
7
|
+
}
|
|
8
|
+
});
|
|
4
9
|
const sessionRequired = ()=>Response.json({
|
|
5
10
|
error: 'An API key cannot mint or rotate API keys. Sign in to manage keys.'
|
|
6
11
|
}, {
|
|
7
12
|
status: 403
|
|
8
13
|
});
|
|
14
|
+
function describeError(error) {
|
|
15
|
+
const details = error.data?.errors;
|
|
16
|
+
const messages = details?.map(({ message })=>message).filter((message)=>typeof message === 'string');
|
|
17
|
+
return messages?.length ? messages.join(' ') : error.message;
|
|
18
|
+
}
|
|
9
19
|
const ownKeys = ({ req })=>req.user ? {
|
|
10
20
|
owner: {
|
|
11
21
|
equals: req.user.id
|
|
@@ -23,7 +33,8 @@ function mergeFields(...groups) {
|
|
|
23
33
|
...fields.values()
|
|
24
34
|
];
|
|
25
35
|
}
|
|
26
|
-
function createViews({ usageCollection, views }) {
|
|
36
|
+
function createViews({ collectionSlug, usageCollection, views }) {
|
|
37
|
+
const manager = managerComponent(collectionSlug);
|
|
27
38
|
if (!views?.length) {
|
|
28
39
|
return [
|
|
29
40
|
{
|
|
@@ -39,8 +50,8 @@ function createViews({ usageCollection, views }) {
|
|
|
39
50
|
'actions'
|
|
40
51
|
],
|
|
41
52
|
components: {
|
|
42
|
-
|
|
43
|
-
|
|
53
|
+
actions: [
|
|
54
|
+
manager
|
|
44
55
|
]
|
|
45
56
|
}
|
|
46
57
|
}
|
|
@@ -51,9 +62,9 @@ function createViews({ usageCollection, views }) {
|
|
|
51
62
|
...view,
|
|
52
63
|
components: {
|
|
53
64
|
...view.components,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
...view.components?.
|
|
65
|
+
actions: [
|
|
66
|
+
manager,
|
|
67
|
+
...view.components?.actions ?? []
|
|
57
68
|
]
|
|
58
69
|
}
|
|
59
70
|
} : view);
|
|
@@ -77,12 +88,21 @@ function createEndpoints({ collectionSlug, tokenPrefix, canRevokeAnyKey }) {
|
|
|
77
88
|
}, {
|
|
78
89
|
status: 400
|
|
79
90
|
});
|
|
91
|
+
const data = body?.data ?? {};
|
|
92
|
+
if (typeof data !== 'object' || data === null || Array.isArray(data)) {
|
|
93
|
+
return Response.json({
|
|
94
|
+
error: 'data must be an object'
|
|
95
|
+
}, {
|
|
96
|
+
status: 400
|
|
97
|
+
});
|
|
98
|
+
}
|
|
80
99
|
try {
|
|
81
100
|
return Response.json(await mintApiKey({
|
|
82
101
|
req,
|
|
83
102
|
collectionSlug,
|
|
84
103
|
tokenPrefix,
|
|
85
|
-
name
|
|
104
|
+
name,
|
|
105
|
+
data: data
|
|
86
106
|
}), {
|
|
87
107
|
status: 201
|
|
88
108
|
});
|
|
@@ -94,6 +114,13 @@ function createEndpoints({ collectionSlug, tokenPrefix, canRevokeAnyKey }) {
|
|
|
94
114
|
status: 401
|
|
95
115
|
});
|
|
96
116
|
}
|
|
117
|
+
if (error instanceof APIError && error.status < 500) {
|
|
118
|
+
return Response.json({
|
|
119
|
+
error: describeError(error)
|
|
120
|
+
}, {
|
|
121
|
+
status: error.status
|
|
122
|
+
});
|
|
123
|
+
}
|
|
97
124
|
throw error;
|
|
98
125
|
}
|
|
99
126
|
}
|
|
@@ -337,6 +364,7 @@ export function createApiKeysCollection(options) {
|
|
|
337
364
|
...collection?.admin?.components
|
|
338
365
|
},
|
|
339
366
|
views: createViews({
|
|
367
|
+
collectionSlug,
|
|
340
368
|
usageCollection,
|
|
341
369
|
views: collection?.admin?.views ?? existing?.admin?.views
|
|
342
370
|
})
|
package/dist/collection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/collection.ts"],"names":["moneyField","ApiKeyServiceError","isApiKeyRequest","mintApiKey","revokeApiKey","rotateApiKey","
|
|
1
|
+
{"version":3,"sources":["../src/collection.ts"],"names":["APIError","moneyField","ApiKeyServiceError","isApiKeyRequest","mintApiKey","revokeApiKey","rotateApiKey","managerComponent","collectionSlug","path","clientProps","sessionRequired","Response","json","error","status","describeError","details","data","errors","messages","map","message","filter","length","join","ownKeys","req","user","owner","equals","id","mergeFields","groups","fields","Map","group","field","key","name","JSON","stringify","set","values","createViews","usageCollection","views","manager","type","defaultFields","components","actions","index","findIndex","view","position","createEndpoints","tokenPrefix","canRevokeAnyKey","method","handler","body","catch","trim","Array","isArray","code","routeParams","anyOwner","_name","_owner","result","createApiKeysCollection","options","authCollection","collection","existing","required","relationTo","access","update","admin","readOnly","unique","read","hidden","condition","_","siblingData","Boolean","revokedAt","label","virtual","hooks","afterRead","undefined","frogbot","find","depth","overrideAccess","pagination","where","apiKey","docs","reduce","total","doc","cost","costUSD","Cell","endpoints","slug","labels","singular","plural","timestamps","versions","authorship","custom","internal","create","delete","icon","useAsTitle"],"mappings":"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","file":"collection.js"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,5 +12,12 @@ export type ApiKeysPluginOptions = {
|
|
|
12
12
|
collection?: Partial<CollectionConfig>;
|
|
13
13
|
canRevokeAnyKey?: (req: FrogBotRequest) => boolean | Promise<boolean>;
|
|
14
14
|
};
|
|
15
|
+
/** `apiKeysPlugin` options with defaults filled, read by other plugins through `plugins['plugin-api-keys']`. */
|
|
16
|
+
export type ApiKeysResolvedOptions = ApiKeysPluginOptions & Required<Pick<ApiKeysPluginOptions, 'authCollection' | 'collectionSlug' | 'headerNames' | 'tokenPrefix'>>;
|
|
17
|
+
declare module 'frogbot' {
|
|
18
|
+
interface RegisteredPlugins {
|
|
19
|
+
'plugin-api-keys': ApiKeysResolvedOptions;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
15
22
|
export declare function apiKeysPlugin(options?: ApiKeysPluginOptions): Plugin;
|
|
16
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAgB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAMhG,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAClG,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE,CAAC;AAEF,gHAAgH;AAChH,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GACvD,QAAQ,CACN,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC,CAChG,CAAC;AAEJ,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,iBAAiB;QACzB,iBAAiB,EAAE,sBAAsB,CAAC;KAC3C;CACF;AAuGD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,CAQxE"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { definePlugin } from 'frogbot';
|
|
2
|
+
import { cascadeDelete } from 'frogbot/internal';
|
|
1
3
|
import { createApiKeysCollection } from './collection.js';
|
|
2
4
|
import { apiKeyMeHook, apiKeyStrategyName, createApiKeyStrategy } from './strategy.js';
|
|
3
5
|
export { ApiKeyServiceError, mintApiKey, revokeApiKey, rotateApiKey } from './server/services.js';
|
|
4
6
|
export { createApiKeyToken, extractApiKeyToken, getApiKeyPrefix, hashApiKeyToken } from './server/token.js';
|
|
5
7
|
export { isApiKeyStrategy } from './strategy.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const collectionSlug = options
|
|
8
|
+
const apiKeys = definePlugin({
|
|
9
|
+
slug: 'plugin-api-keys',
|
|
10
|
+
plugin: ({ config, options })=>{
|
|
11
|
+
const { authCollection, collectionSlug, headerNames, tokenPrefix } = options;
|
|
10
12
|
const auth = config.collections.find((collection)=>collection.slug === authCollection);
|
|
11
13
|
if (!auth || auth.auth === undefined || auth.auth === false) {
|
|
12
14
|
throw new Error(`[plugin-api-keys] Auth collection '${authCollection}' must exist and have auth enabled.`);
|
|
@@ -20,7 +22,7 @@ export function apiKeysPlugin(options = {}) {
|
|
|
20
22
|
const collection = createApiKeysCollection({
|
|
21
23
|
authCollection,
|
|
22
24
|
collectionSlug,
|
|
23
|
-
tokenPrefix
|
|
25
|
+
tokenPrefix,
|
|
24
26
|
usageCollection: usageLog?.slug,
|
|
25
27
|
canRevokeAnyKey: options.canRevokeAnyKey,
|
|
26
28
|
collection: options.collection,
|
|
@@ -29,8 +31,8 @@ export function apiKeysPlugin(options = {}) {
|
|
|
29
31
|
const strategy = createApiKeyStrategy({
|
|
30
32
|
authCollection,
|
|
31
33
|
collectionSlug,
|
|
32
|
-
headerNames
|
|
33
|
-
tokenPrefix
|
|
34
|
+
headerNames,
|
|
35
|
+
tokenPrefix
|
|
34
36
|
});
|
|
35
37
|
const usageField = {
|
|
36
38
|
name: 'apiKey',
|
|
@@ -43,7 +45,7 @@ export function apiKeysPlugin(options = {}) {
|
|
|
43
45
|
if (item.slug === collectionSlug) next = collection;
|
|
44
46
|
if (item.slug === authCollection) {
|
|
45
47
|
const authConfig = typeof next.auth === 'object' ? next.auth : {};
|
|
46
|
-
next = {
|
|
48
|
+
next = cascadeDelete({
|
|
47
49
|
...next,
|
|
48
50
|
auth: {
|
|
49
51
|
...authConfig,
|
|
@@ -59,7 +61,10 @@ export function apiKeysPlugin(options = {}) {
|
|
|
59
61
|
apiKeyMeHook
|
|
60
62
|
]
|
|
61
63
|
}
|
|
62
|
-
}
|
|
64
|
+
}, {
|
|
65
|
+
collection: collectionSlug,
|
|
66
|
+
field: 'owner'
|
|
67
|
+
});
|
|
63
68
|
}
|
|
64
69
|
if (item === usageLog) next = {
|
|
65
70
|
...next,
|
|
@@ -105,7 +110,18 @@ export function apiKeysPlugin(options = {}) {
|
|
|
105
110
|
}
|
|
106
111
|
}
|
|
107
112
|
};
|
|
108
|
-
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
export function apiKeysPlugin(options = {}) {
|
|
116
|
+
return apiKeys({
|
|
117
|
+
...options,
|
|
118
|
+
authCollection: options.authCollection ?? 'users',
|
|
119
|
+
collectionSlug: options.collectionSlug ?? 'api-keys',
|
|
120
|
+
headerNames: options.headerNames ?? [
|
|
121
|
+
'x-api-key'
|
|
122
|
+
],
|
|
123
|
+
tokenPrefix: options.tokenPrefix ?? 'fb'
|
|
124
|
+
});
|
|
109
125
|
}
|
|
110
126
|
|
|
111
127
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["createApiKeysCollection","apiKeyMeHook","apiKeyStrategyName","createApiKeyStrategy","ApiKeyServiceError","mintApiKey","revokeApiKey","rotateApiKey","createApiKeyToken","extractApiKeyToken","getApiKeyPrefix","hashApiKeyToken","isApiKeyStrategy","
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["definePlugin","cascadeDelete","createApiKeysCollection","apiKeyMeHook","apiKeyStrategyName","createApiKeyStrategy","ApiKeyServiceError","mintApiKey","revokeApiKey","rotateApiKey","createApiKeyToken","extractApiKeyToken","getApiKeyPrefix","hashApiKeyToken","isApiKeyStrategy","apiKeys","slug","plugin","config","options","authCollection","collectionSlug","headerNames","tokenPrefix","auth","collections","find","collection","undefined","Error","existing","usageLog","ai","item","fields","usageCollection","canRevokeAnyKey","strategy","usageField","name","type","relationTo","index","map","next","authConfig","strategies","hooks","me","field","includes","beforeOperation","req","context","user","apiKeyId","_strategy","usageFields","apiKey","apiKeysPlugin"],"mappings":"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","file":"index.js"}
|
package/dist/rsc.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { RenderServerComponent } from '@frogbotai/ui/admin/rsc';
|
|
2
|
+
type RenderArgs = Parameters<typeof RenderServerComponent>[0];
|
|
3
|
+
type KeysCollectionAdmin = {
|
|
4
|
+
custom?: {
|
|
5
|
+
'plugin-api-keys'?: {
|
|
6
|
+
createFields?: RenderArgs['Component'][];
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export type ApiKeysManagerServerProps = {
|
|
11
|
+
collectionSlug: string;
|
|
12
|
+
i18n?: unknown;
|
|
13
|
+
payload: {
|
|
14
|
+
collections: Record<string, {
|
|
15
|
+
config: {
|
|
16
|
+
admin?: KeysCollectionAdmin;
|
|
17
|
+
};
|
|
18
|
+
} | undefined>;
|
|
19
|
+
importMap: RenderArgs['importMap'];
|
|
20
|
+
};
|
|
21
|
+
req?: unknown;
|
|
22
|
+
user?: unknown;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Renders the create dialog with the fields other plugins register on the keys collection under
|
|
26
|
+
* `admin.custom['plugin-api-keys'].createFields`. Each one gets the signed-in `user` and `req`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ApiKeysManagerServer({ collectionSlug, i18n, payload, req, user, }: ApiKeysManagerServerProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=rsc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../src/rsc.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,KAAK,mBAAmB,GAAG;IACzB,MAAM,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/E,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE;gBAAE,KAAK,CAAC,EAAE,mBAAmB,CAAA;aAAE,CAAA;SAAE,GAAG,SAAS,CAAC,CAAC;QACrF,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;KACpC,CAAC;IACF,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,cAAc,EACd,IAAI,EACJ,OAAO,EACP,GAAG,EACH,IAAI,GACL,EAAE,yBAAyB,2CAoB3B"}
|
package/dist/rsc.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { RenderServerComponent } from '@frogbotai/ui/admin/rsc';
|
|
3
|
+
import { ApiKeysManager } from './client/ApiKeysManager.js';
|
|
4
|
+
/**
|
|
5
|
+
* Renders the create dialog with the fields other plugins register on the keys collection under
|
|
6
|
+
* `admin.custom['plugin-api-keys'].createFields`. Each one gets the signed-in `user` and `req`.
|
|
7
|
+
*/ export function ApiKeysManagerServer({ collectionSlug, i18n, payload, req, user }) {
|
|
8
|
+
const components = payload.collections[collectionSlug]?.config.admin?.custom?.['plugin-api-keys']?.createFields ?? [];
|
|
9
|
+
const createFields = components.map((Component, index)=>RenderServerComponent({
|
|
10
|
+
Component,
|
|
11
|
+
importMap: payload.importMap,
|
|
12
|
+
key: `create-field-${index}`,
|
|
13
|
+
serverProps: {
|
|
14
|
+
collectionSlug,
|
|
15
|
+
i18n,
|
|
16
|
+
payload,
|
|
17
|
+
req,
|
|
18
|
+
user
|
|
19
|
+
}
|
|
20
|
+
}));
|
|
21
|
+
return /*#__PURE__*/ _jsx(ApiKeysManager, {
|
|
22
|
+
collectionSlug: collectionSlug,
|
|
23
|
+
createFields: createFields.length > 0 ? createFields : undefined
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=rsc.js.map
|
package/dist/rsc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc.tsx"],"names":["RenderServerComponent","ApiKeysManager","ApiKeysManagerServer","collectionSlug","i18n","payload","req","user","components","collections","config","admin","custom","createFields","map","Component","index","importMap","key","serverProps","length","undefined"],"mappings":";AAAA,SAASA,qBAAqB,QAAQ,0BAA0B;AAEhE,SAASC,cAAc,QAAQ,6BAA6B;AAmB5D;;;CAGC,GACD,OAAO,SAASC,qBAAqB,EACnCC,cAAc,EACdC,IAAI,EACJC,OAAO,EACPC,GAAG,EACHC,IAAI,EACsB;IAC1B,MAAMC,aACJH,QAAQI,WAAW,CAACN,eAAe,EAAEO,OAAOC,OAAOC,QAAQ,CAAC,kBAAkB,EAAEC,gBAChF,EAAE;IAEJ,MAAMA,eAAeL,WAAWM,GAAG,CAAC,CAACC,WAAWC,QAC9ChB,sBAAsB;YACpBe;YACAE,WAAWZ,QAAQY,SAAS;YAC5BC,KAAK,CAAC,aAAa,EAAEF,OAAO;YAC5BG,aAAa;gBAAEhB;gBAAgBC;gBAAMC;gBAASC;gBAAKC;YAAK;QAC1D;IAGF,qBACE,KAACN;QACCE,gBAAgBA;QAChBU,cAAcA,aAAaO,MAAM,GAAG,IAAIP,eAAeQ;;AAG7D","file":"rsc.js"}
|
|
@@ -4,6 +4,11 @@ export type MintApiKeyOptions = {
|
|
|
4
4
|
collectionSlug: string;
|
|
5
5
|
tokenPrefix: string;
|
|
6
6
|
name: string;
|
|
7
|
+
/**
|
|
8
|
+
* Values for fields other plugins add to the keys collection. They're written with access
|
|
9
|
+
* overridden, so their validation and hooks run but their field access doesn't.
|
|
10
|
+
*/
|
|
11
|
+
data?: Record<string, unknown>;
|
|
7
12
|
};
|
|
8
13
|
export type RevokeApiKeyOptions = {
|
|
9
14
|
req: FrogBotRequest;
|
|
@@ -23,9 +28,19 @@ export declare function mintApiKey(options: MintApiKeyOptions): Promise<{
|
|
|
23
28
|
token: string;
|
|
24
29
|
createdAt: unknown;
|
|
25
30
|
}>;
|
|
31
|
+
export declare function revokeApiKey(options: RevokeApiKeyOptions): Promise<{
|
|
32
|
+
id: string | number;
|
|
33
|
+
name: string;
|
|
34
|
+
owner: string | number;
|
|
35
|
+
revokedAt: string;
|
|
36
|
+
}>;
|
|
26
37
|
export type RotateApiKeyOptions = RevokeApiKeyOptions & {
|
|
27
38
|
tokenPrefix: string;
|
|
28
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* Revokes the key, then mints one with its name, owner and every field another plugin added, with
|
|
42
|
+
* `req.context.apiKeyRotatedFrom` set to the revoked key's ID.
|
|
43
|
+
*/
|
|
29
44
|
export declare function rotateApiKey({ req, collectionSlug, id, tokenPrefix, anyOwner, }: RotateApiKeyOptions): Promise<{
|
|
30
45
|
id: unknown;
|
|
31
46
|
name: string;
|
|
@@ -33,10 +48,4 @@ export declare function rotateApiKey({ req, collectionSlug, id, tokenPrefix, any
|
|
|
33
48
|
token: string;
|
|
34
49
|
createdAt: unknown;
|
|
35
50
|
}>;
|
|
36
|
-
export declare function revokeApiKey({ req, collectionSlug, id, anyOwner }: RevokeApiKeyOptions): Promise<{
|
|
37
|
-
id: string | number;
|
|
38
|
-
name: string;
|
|
39
|
-
owner: string | number;
|
|
40
|
-
revokedAt: string;
|
|
41
|
-
}>;
|
|
42
51
|
//# sourceMappingURL=services.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/server/services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,cAAc,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/server/services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,cAAc,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,cAAc,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAIF,qBAAa,kBAAmB,SAAQ,KAAK;aACf,IAAI,EAAE,yBAAyB,GAAG,WAAW,GAAG,kBAAkB;gBAAlE,IAAI,EAAE,yBAAyB,GAAG,WAAW,GAAG,kBAAkB;CAG/F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAE5D;AAuDD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB;;;;;;GAW1D;AAyCD,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB;;;;;GAI9D;AAED,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF;;;GAGG;AACH,wBAAsB,YAAY,CAAC,EACjC,GAAG,EACH,cAAc,EACd,EAAE,EACF,WAAW,EACX,QAAQ,GACT,EAAE,mBAAmB;;;;;;GAarB"}
|
package/dist/server/services.js
CHANGED
|
@@ -15,7 +15,23 @@ function requireSessionOwner(req) {
|
|
|
15
15
|
if (isApiKeyRequest(req)) throw new ApiKeyServiceError('session_required');
|
|
16
16
|
return owner;
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
const ownFields = new Set([
|
|
19
|
+
'id',
|
|
20
|
+
'createdAt',
|
|
21
|
+
'updatedAt',
|
|
22
|
+
'name',
|
|
23
|
+
'owner',
|
|
24
|
+
'prefix',
|
|
25
|
+
'tokenHash',
|
|
26
|
+
'lastUsedAt',
|
|
27
|
+
'revokedAt',
|
|
28
|
+
'totalCostUSD',
|
|
29
|
+
'actions'
|
|
30
|
+
]);
|
|
31
|
+
function foreignData(data) {
|
|
32
|
+
return Object.fromEntries(Object.entries(data ?? {}).filter(([key])=>!ownFields.has(key)));
|
|
33
|
+
}
|
|
34
|
+
async function mintForOwner({ req, collectionSlug, tokenPrefix, name, owner, data, context }) {
|
|
19
35
|
const token = createApiKeyToken({
|
|
20
36
|
tokenPrefix
|
|
21
37
|
});
|
|
@@ -23,13 +39,17 @@ async function mintForOwner({ req, collectionSlug, tokenPrefix, name, owner }) {
|
|
|
23
39
|
const doc = await req.frogbot.create({
|
|
24
40
|
collection: collectionSlug,
|
|
25
41
|
data: {
|
|
42
|
+
...foreignData(data),
|
|
26
43
|
name,
|
|
27
44
|
owner,
|
|
28
45
|
prefix,
|
|
29
46
|
tokenHash: hashApiKeyToken(token)
|
|
30
47
|
},
|
|
31
48
|
overrideAccess: true,
|
|
32
|
-
req
|
|
49
|
+
req,
|
|
50
|
+
...context && {
|
|
51
|
+
context
|
|
52
|
+
}
|
|
33
53
|
});
|
|
34
54
|
return {
|
|
35
55
|
id: doc.id,
|
|
@@ -46,26 +66,11 @@ export async function mintApiKey(options) {
|
|
|
46
66
|
collectionSlug: options.collectionSlug,
|
|
47
67
|
tokenPrefix: options.tokenPrefix,
|
|
48
68
|
name: options.name,
|
|
49
|
-
owner
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
export async function rotateApiKey({ req, collectionSlug, id, tokenPrefix, anyOwner }) {
|
|
53
|
-
requireSessionOwner(req);
|
|
54
|
-
const revoked = await revokeApiKey({
|
|
55
|
-
req,
|
|
56
|
-
collectionSlug,
|
|
57
|
-
id,
|
|
58
|
-
anyOwner
|
|
59
|
-
});
|
|
60
|
-
return mintForOwner({
|
|
61
|
-
req,
|
|
62
|
-
collectionSlug,
|
|
63
|
-
tokenPrefix,
|
|
64
|
-
name: revoked.name,
|
|
65
|
-
owner: revoked.owner
|
|
69
|
+
owner,
|
|
70
|
+
data: options.data
|
|
66
71
|
});
|
|
67
72
|
}
|
|
68
|
-
|
|
73
|
+
async function revokeKey({ req, collectionSlug, id, anyOwner }) {
|
|
69
74
|
const owner = req.user?.id;
|
|
70
75
|
if (owner === undefined) throw new ApiKeyServiceError('authentication_required');
|
|
71
76
|
const result = await req.frogbot.find({
|
|
@@ -107,6 +112,13 @@ export async function revokeApiKey({ req, collectionSlug, id, anyOwner }) {
|
|
|
107
112
|
overrideAccess: true,
|
|
108
113
|
req
|
|
109
114
|
});
|
|
115
|
+
return {
|
|
116
|
+
key: key,
|
|
117
|
+
revokedAt
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export async function revokeApiKey(options) {
|
|
121
|
+
const { key, revokedAt } = await revokeKey(options);
|
|
110
122
|
return {
|
|
111
123
|
id: key.id,
|
|
112
124
|
name: key.name,
|
|
@@ -114,5 +126,28 @@ export async function revokeApiKey({ req, collectionSlug, id, anyOwner }) {
|
|
|
114
126
|
revokedAt
|
|
115
127
|
};
|
|
116
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Revokes the key, then mints one with its name, owner and every field another plugin added, with
|
|
131
|
+
* `req.context.apiKeyRotatedFrom` set to the revoked key's ID.
|
|
132
|
+
*/ export async function rotateApiKey({ req, collectionSlug, id, tokenPrefix, anyOwner }) {
|
|
133
|
+
requireSessionOwner(req);
|
|
134
|
+
const { key } = await revokeKey({
|
|
135
|
+
req,
|
|
136
|
+
collectionSlug,
|
|
137
|
+
id,
|
|
138
|
+
anyOwner
|
|
139
|
+
});
|
|
140
|
+
return mintForOwner({
|
|
141
|
+
req,
|
|
142
|
+
collectionSlug,
|
|
143
|
+
tokenPrefix,
|
|
144
|
+
name: key.name,
|
|
145
|
+
owner: key.owner,
|
|
146
|
+
data: key,
|
|
147
|
+
context: {
|
|
148
|
+
apiKeyRotatedFrom: key.id
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
117
152
|
|
|
118
153
|
//# sourceMappingURL=services.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/services.ts"],"names":["apiKeyStrategyName","createApiKeyToken","getApiKeyPrefix","hashApiKeyToken","ApiKeyServiceError","Error","code","isApiKeyRequest","req","user","_strategy","requireSessionOwner","owner","id","undefined","mintForOwner","collectionSlug","tokenPrefix","name","token","prefix","doc","frogbot","create","collection","
|
|
1
|
+
{"version":3,"sources":["../../src/server/services.ts"],"names":["apiKeyStrategyName","createApiKeyToken","getApiKeyPrefix","hashApiKeyToken","ApiKeyServiceError","Error","code","isApiKeyRequest","req","user","_strategy","requireSessionOwner","owner","id","undefined","ownFields","Set","foreignData","data","Object","fromEntries","entries","filter","key","has","mintForOwner","collectionSlug","tokenPrefix","name","context","token","prefix","doc","frogbot","create","collection","tokenHash","overrideAccess","createdAt","mintApiKey","options","revokeKey","anyOwner","result","find","depth","limit","where","equals","and","docs","revokedAt","Date","toISOString","update","revokeApiKey","rotateApiKey","apiKeyRotatedFrom"],"mappings":"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","file":"services.js"}
|
package/dist/strategy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAI9D,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAI5C,KAAK,eAAe,GAAG;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAI9D,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAI5C,KAAK,eAAe,GAAG;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,YAAY,CA8D3E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAEhE;AAED,eAAO,MAAM,YAAY,EAAE,gBAI1B,CAAC"}
|
package/dist/strategy.js
CHANGED
|
@@ -48,6 +48,7 @@ export function createApiKeyStrategy(options) {
|
|
|
48
48
|
if (!user) return {
|
|
49
49
|
user: null
|
|
50
50
|
};
|
|
51
|
+
const { tokenHash: _tokenHash, ...apiKey } = key;
|
|
51
52
|
await frogbot.update({
|
|
52
53
|
collection: collectionSlug,
|
|
53
54
|
id: key.id,
|
|
@@ -62,12 +63,7 @@ export function createApiKeyStrategy(options) {
|
|
|
62
63
|
collection: authCollection,
|
|
63
64
|
_strategy: apiKeyStrategyName,
|
|
64
65
|
apiKeyId: key.id,
|
|
65
|
-
|
|
66
|
-
capture: key.capture
|
|
67
|
-
} : {},
|
|
68
|
-
...typeof key.captureSampleRate === 'number' ? {
|
|
69
|
-
captureSampleRate: key.captureSampleRate
|
|
70
|
-
} : {}
|
|
66
|
+
apiKey
|
|
71
67
|
}
|
|
72
68
|
};
|
|
73
69
|
}
|
package/dist/strategy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/strategy.ts"],"names":["extractApiKeyToken","hashApiKeyToken","apiKeyStrategyName","apiKeyStrategies","WeakSet","createApiKeyStrategy","options","authCollection","collectionSlug","headerNames","tokenPrefix","strategy","name","authenticate","frogbot","headers","token","user","keys","find","collection","depth","limit","overrideAccess","where","and","tokenHash","equals","revokedAt","exists","key","docs","id","owner","findByID","catch","update","data","lastUsedAt","Date","toISOString","_strategy","apiKeyId","
|
|
1
|
+
{"version":3,"sources":["../src/strategy.ts"],"names":["extractApiKeyToken","hashApiKeyToken","apiKeyStrategyName","apiKeyStrategies","WeakSet","createApiKeyStrategy","options","authCollection","collectionSlug","headerNames","tokenPrefix","strategy","name","authenticate","frogbot","headers","token","user","keys","find","collection","depth","limit","overrideAccess","where","and","tokenHash","equals","revokedAt","exists","key","docs","id","owner","findByID","catch","_tokenHash","apiKey","update","data","lastUsedAt","Date","toISOString","_strategy","apiKeyId","add","isApiKeyStrategy","has","apiKeyMeHook"],"mappings":"AAEA,SAASA,kBAAkB,EAAEC,eAAe,QAAQ,oBAAoB;AAExE,OAAO,MAAMC,qBAAqB,UAAU;AAE5C,MAAMC,mBAAmB,IAAIC;AAS7B,OAAO,SAASC,qBAAqBC,OAAwB;IAC3D,MAAM,EAAEC,cAAc,EAAEC,cAAc,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGJ;IACrE,MAAMK,WAAyB;QAC7BC,MAAMV;QACNW,cAAc,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAE;YACvC,MAAMC,QAAQhB,mBAAmBe,SAAS;gBAAEN;gBAAaC;YAAY;YAErE,IAAI,CAACM,OAAO,OAAO;gBAAEC,MAAM;YAAK;YAEhC,MAAMC,OAAO,MAAMJ,QAAQK,IAAI,CAAC;gBAC9BC,YAAYZ;gBACZa,OAAO;gBACPC,OAAO;gBACPC,gBAAgB;gBAChBC,OAAO;oBACLC,KAAK;wBACH;4BAAEC,WAAW;gCAAEC,QAAQ1B,gBAAgBe;4BAAO;wBAAE;wBAChD;4BAAEY,WAAW;gCAAEC,QAAQ;4BAAM;wBAAE;qBAChC;gBACH;YACF;YAEA,MAAMC,MAAMZ,KAAKa,IAAI,CAAC,EAAE;YAExB,IACE,CAACD,OACA,OAAOA,IAAIE,EAAE,KAAK,YAAY,OAAOF,IAAIE,EAAE,KAAK,YAChD,OAAOF,IAAIG,KAAK,KAAK,YAAY,OAAOH,IAAIG,KAAK,KAAK,UACvD;gBACA,OAAO;oBAAEhB,MAAM;gBAAK;YACtB;YAEA,MAAMA,OAAO,MAAMH,QAChBoB,QAAQ,CAAC;gBAAEd,YAAYb;gBAAgByB,IAAIF,IAAIG,KAAK;gBAAEZ,OAAO;gBAAGE,gBAAgB;YAAK,GACrFY,KAAK,CAAC,IAAM;YAEf,IAAI,CAAClB,MAAM,OAAO;gBAAEA,MAAM;YAAK;YAE/B,MAAM,EAAES,WAAWU,UAAU,EAAE,GAAGC,QAAQ,GAAGP;YAE7C,MAAMhB,QAAQwB,MAAM,CAAC;gBACnBlB,YAAYZ;gBACZwB,IAAIF,IAAIE,EAAE;gBACVO,MAAM;oBAAEC,YAAY,IAAIC,OAAOC,WAAW;gBAAG;gBAC7CnB,gBAAgB;YAClB;YAEA,OAAO;gBACLN,MAAM;oBACJ,GAAGA,IAAI;oBACPG,YAAYb;oBACZoC,WAAWzC;oBACX0C,UAAUd,IAAIE,EAAE;oBAChBK;gBACF;YACF;QACF;IACF;IAEAlC,iBAAiB0C,GAAG,CAAClC;IAErB,OAAOA;AACT;AAEA,OAAO,SAASmC,iBAAiBnC,QAAsB;IACrD,OAAOR,iBAAiB4C,GAAG,CAACpC;AAC9B;AAEA,OAAO,MAAMqC,eAAiC,CAAC,EAAE/B,IAAI,EAAE;IACrD,IAAIA,MAAM0B,cAAczC,oBAAoB;IAE5C,OAAO;QAAEe;IAAK;AAChB,EAAE","file":"strategy.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frogbotai/plugin-api-keys",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "Multiple named API keys for FrogBot.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Colby Gilbert",
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
"import": "./dist/client.js",
|
|
24
24
|
"types": "./dist/client.d.ts",
|
|
25
25
|
"default": "./dist/client.js"
|
|
26
|
+
},
|
|
27
|
+
"./rsc": {
|
|
28
|
+
"import": "./dist/rsc.js",
|
|
29
|
+
"types": "./dist/rsc.d.ts",
|
|
30
|
+
"default": "./dist/rsc.js"
|
|
26
31
|
}
|
|
27
32
|
},
|
|
28
33
|
"files": [
|
|
@@ -37,9 +42,9 @@
|
|
|
37
42
|
"peerDependencies": {
|
|
38
43
|
"react": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
39
44
|
"react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
40
|
-
"@frogbotai/gateway": "0.
|
|
41
|
-
"
|
|
42
|
-
"
|
|
45
|
+
"@frogbotai/gateway": "0.37.0",
|
|
46
|
+
"@frogbotai/ui": "0.37.0",
|
|
47
|
+
"frogbot": "0.37.0"
|
|
43
48
|
},
|
|
44
49
|
"devDependencies": {
|
|
45
50
|
"@testing-library/react": "^16.3.0",
|
|
@@ -47,10 +52,10 @@
|
|
|
47
52
|
"react": "19.3.1",
|
|
48
53
|
"react-dom": "19.3.1",
|
|
49
54
|
"typescript": "6.0.3",
|
|
50
|
-
"@frogbotai/plugin-roles": "0.
|
|
51
|
-
"@frogbotai/gateway": "0.
|
|
52
|
-
"
|
|
53
|
-
"
|
|
55
|
+
"@frogbotai/plugin-roles": "0.37.0",
|
|
56
|
+
"@frogbotai/gateway": "0.37.0",
|
|
57
|
+
"frogbot": "0.37.0",
|
|
58
|
+
"@frogbotai/ui": "0.37.0"
|
|
54
59
|
},
|
|
55
60
|
"publishConfig": {
|
|
56
61
|
"access": "public"
|