@agentuity/auth 0.0.109 → 0.0.110
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/AGENTS.md +82 -28
- package/README.md +259 -236
- package/dist/agentuity/config.d.ts +2386 -0
- package/dist/agentuity/config.d.ts.map +1 -0
- package/dist/agentuity/config.js +220 -0
- package/dist/agentuity/config.js.map +1 -0
- package/dist/agentuity/plugins/api-key.d.ts +152 -0
- package/dist/agentuity/plugins/api-key.d.ts.map +1 -0
- package/dist/agentuity/plugins/api-key.js +21 -0
- package/dist/agentuity/plugins/api-key.js.map +1 -0
- package/dist/agentuity/plugins/index.d.ts +23 -0
- package/dist/agentuity/plugins/index.d.ts.map +1 -0
- package/dist/agentuity/plugins/index.js +10 -0
- package/dist/agentuity/plugins/index.js.map +1 -0
- package/dist/agentuity/plugins/jwt.d.ts +34 -0
- package/dist/agentuity/plugins/jwt.d.ts.map +1 -0
- package/dist/agentuity/plugins/jwt.js +11 -0
- package/dist/agentuity/plugins/jwt.js.map +1 -0
- package/dist/agentuity/plugins/organization.d.ts +355 -0
- package/dist/agentuity/plugins/organization.d.ts.map +1 -0
- package/dist/agentuity/plugins/organization.js +12 -0
- package/dist/agentuity/plugins/organization.js.map +1 -0
- package/dist/agentuity/react.d.ts +1375 -0
- package/dist/agentuity/react.d.ts.map +1 -0
- package/dist/agentuity/react.js +206 -0
- package/dist/agentuity/react.js.map +1 -0
- package/dist/agentuity/server.d.ts +220 -0
- package/dist/agentuity/server.d.ts.map +1 -0
- package/dist/agentuity/server.js +505 -0
- package/dist/agentuity/server.js.map +1 -0
- package/dist/agentuity/types.d.ts +172 -0
- package/dist/agentuity/types.d.ts.map +1 -0
- package/dist/agentuity/types.js +7 -0
- package/dist/agentuity/types.js.map +1 -0
- package/dist/index.d.ts +31 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -8
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +2922 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +223 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +14 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +15 -39
- package/src/agentuity/config.ts +401 -0
- package/src/agentuity/plugins/api-key.ts +158 -0
- package/src/agentuity/plugins/index.ts +35 -0
- package/src/agentuity/plugins/jwt.ts +30 -0
- package/src/agentuity/plugins/organization.ts +345 -0
- package/src/agentuity/react.tsx +328 -0
- package/src/agentuity/server.ts +734 -0
- package/src/agentuity/types.ts +201 -0
- package/src/index.ts +76 -8
- package/src/schema.ts +270 -0
- package/src/types.ts +14 -22
- package/test/agentuity/config.test.ts +621 -0
- package/test/agentuity/server.test.ts +537 -0
- package/test/schema.test.ts +147 -0
- package/tsconfig.json +3 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/auth0/client.d.ts +0 -44
- package/dist/auth0/client.d.ts.map +0 -1
- package/dist/auth0/client.js +0 -79
- package/dist/auth0/client.js.map +0 -1
- package/dist/auth0/index.d.ts +0 -35
- package/dist/auth0/index.d.ts.map +0 -1
- package/dist/auth0/index.js +0 -38
- package/dist/auth0/index.js.map +0 -1
- package/dist/auth0/server.d.ts +0 -91
- package/dist/auth0/server.d.ts.map +0 -1
- package/dist/auth0/server.js +0 -237
- package/dist/auth0/server.js.map +0 -1
- package/dist/clerk/client.d.ts +0 -42
- package/dist/clerk/client.d.ts.map +0 -1
- package/dist/clerk/client.js +0 -65
- package/dist/clerk/client.js.map +0 -1
- package/dist/clerk/index.d.ts +0 -37
- package/dist/clerk/index.d.ts.map +0 -1
- package/dist/clerk/index.js +0 -35
- package/dist/clerk/index.js.map +0 -1
- package/dist/clerk/server.d.ts +0 -55
- package/dist/clerk/server.d.ts.map +0 -1
- package/dist/clerk/server.js +0 -111
- package/dist/clerk/server.js.map +0 -1
- package/docs/adding-providers.md +0 -261
- package/src/auth0/client.tsx +0 -109
- package/src/auth0/index.ts +0 -40
- package/src/auth0/server.ts +0 -378
- package/src/clerk/client.tsx +0 -86
- package/src/clerk/index.ts +0 -37
- package/src/clerk/server.ts +0 -168
- package/test/clerk-client.test.tsx +0 -21
- package/test/clerk-server.test.ts +0 -51
package/dist/clerk/client.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* Clerk client-side authentication provider for React.
|
|
4
|
-
*
|
|
5
|
-
* @module clerk/client
|
|
6
|
-
*/
|
|
7
|
-
import { useEffect } from 'react';
|
|
8
|
-
import { useAuth } from '@agentuity/react';
|
|
9
|
-
/**
|
|
10
|
-
* Agentuity authentication provider for Clerk.
|
|
11
|
-
*
|
|
12
|
-
* This component integrates Clerk authentication with Agentuity's context,
|
|
13
|
-
* automatically injecting auth tokens into API calls via useAPI and useWebsocket.
|
|
14
|
-
*
|
|
15
|
-
* Must be a child of both ClerkProvider and AgentuityProvider.
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```tsx
|
|
19
|
-
* import { ClerkProvider, useAuth } from '@clerk/clerk-react';
|
|
20
|
-
* import { AgentuityProvider } from '@agentuity/react';
|
|
21
|
-
* import { AgentuityClerk } from '@agentuity/auth/clerk';
|
|
22
|
-
*
|
|
23
|
-
* <ClerkProvider publishableKey={key}>
|
|
24
|
-
* <AgentuityProvider>
|
|
25
|
-
* <AgentuityClerk useAuth={useAuth}>
|
|
26
|
-
* <App />
|
|
27
|
-
* </AgentuityClerk>
|
|
28
|
-
* </AgentuityProvider>
|
|
29
|
-
* </ClerkProvider>
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export function AgentuityClerk({ children, useAuth: clerkUseAuth, refreshInterval = 60000, }) {
|
|
33
|
-
const { getToken, isLoaded } = clerkUseAuth();
|
|
34
|
-
const { setAuthHeader, setAuthLoading } = useAuth();
|
|
35
|
-
// Fetch and update token in AgentuityContext
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
if (!isLoaded || !setAuthHeader || !setAuthLoading) {
|
|
38
|
-
if (setAuthLoading) {
|
|
39
|
-
setAuthLoading(true);
|
|
40
|
-
}
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const fetchToken = async () => {
|
|
44
|
-
try {
|
|
45
|
-
setAuthLoading(true);
|
|
46
|
-
const token = await getToken();
|
|
47
|
-
setAuthHeader(token ? `Bearer ${token}` : null);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
console.error('Failed to get Clerk token:', error);
|
|
51
|
-
setAuthHeader(null);
|
|
52
|
-
}
|
|
53
|
-
finally {
|
|
54
|
-
setAuthLoading(false);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
fetchToken();
|
|
58
|
-
// Clerk handles token expiry internally, we refresh periodically
|
|
59
|
-
const interval = setInterval(fetchToken, refreshInterval);
|
|
60
|
-
return () => clearInterval(interval);
|
|
61
|
-
}, [getToken, isLoaded, setAuthHeader, setAuthLoading, refreshInterval]);
|
|
62
|
-
// Render children directly - auth header is now in AgentuityContext
|
|
63
|
-
return _jsx(_Fragment, { children: children });
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=client.js.map
|
package/dist/clerk/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/clerk/client.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAe3C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC9B,QAAQ,EACR,OAAO,EAAE,YAAY,EACrB,eAAe,GAAG,KAAK,GACF;IACrB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC;IAC9C,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpD,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC;YACpD,IAAI,cAAc,EAAE,CAAC;gBACpB,cAAc,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YACD,OAAO;QACR,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACJ,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAC/B,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;gBACnD,aAAa,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;oBAAS,CAAC;gBACV,cAAc,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC,CAAC;QAEF,UAAU,EAAE,CAAC;QAEb,iEAAiE;QACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC1D,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzE,oEAAoE;IACpE,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACxB,CAAC"}
|
package/dist/clerk/index.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Clerk authentication provider for Agentuity.
|
|
3
|
-
*
|
|
4
|
-
* Provides both client-side (React) and server-side (Hono) authentication.
|
|
5
|
-
*
|
|
6
|
-
* @example Client-side
|
|
7
|
-
* ```tsx
|
|
8
|
-
* import { ClerkProvider, useAuth } from '@clerk/clerk-react';
|
|
9
|
-
* import { AgentuityProvider } from '@agentuity/react';
|
|
10
|
-
* import { AgentuityClerk } from '@agentuity/auth/clerk';
|
|
11
|
-
*
|
|
12
|
-
* <ClerkProvider publishableKey={key}>
|
|
13
|
-
* <AgentuityProvider>
|
|
14
|
-
* <AgentuityClerk useAuth={useAuth}>
|
|
15
|
-
* <App />
|
|
16
|
-
* </AgentuityClerk>
|
|
17
|
-
* </AgentuityProvider>
|
|
18
|
-
* </ClerkProvider>
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* @example Server-side
|
|
22
|
-
* ```typescript
|
|
23
|
-
* import { createMiddleware } from '@agentuity/auth/clerk';
|
|
24
|
-
*
|
|
25
|
-
* router.get('/api/profile', createMiddleware(), async (c) => {
|
|
26
|
-
* const user = await c.var.auth.getUser();
|
|
27
|
-
* return c.json({ email: user.email });
|
|
28
|
-
* });
|
|
29
|
-
* ```
|
|
30
|
-
*
|
|
31
|
-
* @module clerk
|
|
32
|
-
*/
|
|
33
|
-
export { AgentuityClerk } from './client';
|
|
34
|
-
export type { AgentuityClerkProps } from './client';
|
|
35
|
-
export { createMiddleware } from './server';
|
|
36
|
-
export type { ClerkMiddlewareOptions, ClerkJWTPayload, ClerkEnv } from './server';
|
|
37
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clerk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/clerk/index.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Clerk authentication provider for Agentuity.
|
|
3
|
-
*
|
|
4
|
-
* Provides both client-side (React) and server-side (Hono) authentication.
|
|
5
|
-
*
|
|
6
|
-
* @example Client-side
|
|
7
|
-
* ```tsx
|
|
8
|
-
* import { ClerkProvider, useAuth } from '@clerk/clerk-react';
|
|
9
|
-
* import { AgentuityProvider } from '@agentuity/react';
|
|
10
|
-
* import { AgentuityClerk } from '@agentuity/auth/clerk';
|
|
11
|
-
*
|
|
12
|
-
* <ClerkProvider publishableKey={key}>
|
|
13
|
-
* <AgentuityProvider>
|
|
14
|
-
* <AgentuityClerk useAuth={useAuth}>
|
|
15
|
-
* <App />
|
|
16
|
-
* </AgentuityClerk>
|
|
17
|
-
* </AgentuityProvider>
|
|
18
|
-
* </ClerkProvider>
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* @example Server-side
|
|
22
|
-
* ```typescript
|
|
23
|
-
* import { createMiddleware } from '@agentuity/auth/clerk';
|
|
24
|
-
*
|
|
25
|
-
* router.get('/api/profile', createMiddleware(), async (c) => {
|
|
26
|
-
* const user = await c.var.auth.getUser();
|
|
27
|
-
* return c.json({ email: user.email });
|
|
28
|
-
* });
|
|
29
|
-
* ```
|
|
30
|
-
*
|
|
31
|
-
* @module clerk
|
|
32
|
-
*/
|
|
33
|
-
export { AgentuityClerk } from './client';
|
|
34
|
-
export { createMiddleware } from './server';
|
|
35
|
-
//# sourceMappingURL=index.js.map
|
package/dist/clerk/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clerk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/clerk/server.d.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Clerk server-side authentication middleware for Hono.
|
|
3
|
-
*
|
|
4
|
-
* @module clerk/server
|
|
5
|
-
*/
|
|
6
|
-
import type { User } from '@clerk/backend';
|
|
7
|
-
import type { AgentuityAuth } from '../types';
|
|
8
|
-
/**
|
|
9
|
-
* Clerk JWT payload structure.
|
|
10
|
-
*/
|
|
11
|
-
export interface ClerkJWTPayload {
|
|
12
|
-
/** Subject (user ID) */
|
|
13
|
-
sub: string;
|
|
14
|
-
/** Additional claims */
|
|
15
|
-
[key: string]: unknown;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Environment type for Clerk middleware - provides typed context variables.
|
|
19
|
-
*/
|
|
20
|
-
export type ClerkEnv = {
|
|
21
|
-
Variables: {
|
|
22
|
-
auth: AgentuityAuth<User, ClerkJWTPayload>;
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Options for Clerk middleware.
|
|
27
|
-
*/
|
|
28
|
-
export interface ClerkMiddlewareOptions {
|
|
29
|
-
/** Clerk secret key (defaults to process.env.CLERK_SECRET_KEY) */
|
|
30
|
-
secretKey?: string;
|
|
31
|
-
/** Custom token extractor function */
|
|
32
|
-
getToken?: (authHeader: string) => string;
|
|
33
|
-
/** Clerk publishable key for token verification */
|
|
34
|
-
publishableKey?: string;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Create Hono middleware for Clerk authentication.
|
|
38
|
-
*
|
|
39
|
-
* This middleware:
|
|
40
|
-
* - Extracts and validates JWT tokens from Authorization header
|
|
41
|
-
* - Returns 401 if token is missing or invalid
|
|
42
|
-
* - Exposes authenticated user via c.var.auth
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```typescript
|
|
46
|
-
* import { createMiddleware } from '@agentuity/auth/clerk';
|
|
47
|
-
*
|
|
48
|
-
* router.get('/api/profile', createMiddleware(), async (c) => {
|
|
49
|
-
* const user = await c.var.auth.getUser();
|
|
50
|
-
* return c.json({ email: user.email });
|
|
51
|
-
* });
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export declare function createMiddleware(options?: ClerkMiddlewareOptions): import("hono/types").MiddlewareHandler<ClerkEnv, string, {}, Response>;
|
|
55
|
-
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/clerk/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,SAAS,EAAE;QACV,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;KAC3C,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAE1C,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,sBAA2B,0EA6FpE"}
|
package/dist/clerk/server.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Clerk server-side authentication middleware for Hono.
|
|
3
|
-
*
|
|
4
|
-
* @module clerk/server
|
|
5
|
-
*/
|
|
6
|
-
import { createMiddleware as createHonoMiddleware } from 'hono/factory';
|
|
7
|
-
import { createClerkClient, verifyToken } from '@clerk/backend';
|
|
8
|
-
/**
|
|
9
|
-
* Create Hono middleware for Clerk authentication.
|
|
10
|
-
*
|
|
11
|
-
* This middleware:
|
|
12
|
-
* - Extracts and validates JWT tokens from Authorization header
|
|
13
|
-
* - Returns 401 if token is missing or invalid
|
|
14
|
-
* - Exposes authenticated user via c.var.auth
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* import { createMiddleware } from '@agentuity/auth/clerk';
|
|
19
|
-
*
|
|
20
|
-
* router.get('/api/profile', createMiddleware(), async (c) => {
|
|
21
|
-
* const user = await c.var.auth.getUser();
|
|
22
|
-
* return c.json({ email: user.email });
|
|
23
|
-
* });
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export function createMiddleware(options = {}) {
|
|
27
|
-
const secretKey = options.secretKey || process.env.CLERK_SECRET_KEY;
|
|
28
|
-
const publishableKey = options.publishableKey ||
|
|
29
|
-
process.env.AGENTUITY_PUBLIC_CLERK_PUBLISHABLE_KEY ||
|
|
30
|
-
process.env.CLERK_PUBLISHABLE_KEY;
|
|
31
|
-
if (!secretKey) {
|
|
32
|
-
console.error('[Clerk Auth] CLERK_SECRET_KEY is not set. Add it to your .env file or pass secretKey option to createMiddleware()');
|
|
33
|
-
throw new Error('Clerk secret key is required (set CLERK_SECRET_KEY or pass secretKey option)');
|
|
34
|
-
}
|
|
35
|
-
if (!publishableKey) {
|
|
36
|
-
console.warn('[Clerk Auth] AGENTUITY_PUBLIC_CLERK_PUBLISHABLE_KEY is not set. Token validation may fail. Add it to your .env file.');
|
|
37
|
-
}
|
|
38
|
-
// Create Clerk client instance
|
|
39
|
-
const clerkClient = createClerkClient({ secretKey });
|
|
40
|
-
return createHonoMiddleware(async (c, next) => {
|
|
41
|
-
const authHeader = c.req.header('Authorization');
|
|
42
|
-
if (!authHeader) {
|
|
43
|
-
return c.json({ error: 'Unauthorized' }, 401);
|
|
44
|
-
}
|
|
45
|
-
try {
|
|
46
|
-
// Extract token from Bearer header
|
|
47
|
-
let token;
|
|
48
|
-
if (options.getToken) {
|
|
49
|
-
token = options.getToken(authHeader);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
// Validate Authorization scheme is Bearer
|
|
53
|
-
if (!authHeader.match(/^Bearer\s+/i)) {
|
|
54
|
-
return c.json({ error: 'Unauthorized' }, 401);
|
|
55
|
-
}
|
|
56
|
-
token = authHeader.replace(/^Bearer\s+/i, '');
|
|
57
|
-
}
|
|
58
|
-
// Ensure token is not empty
|
|
59
|
-
if (!token || token.trim().length === 0) {
|
|
60
|
-
return c.json({ error: 'Unauthorized' }, 401);
|
|
61
|
-
}
|
|
62
|
-
// Verify token with Clerk (delegates validation to provider)
|
|
63
|
-
const payload = (await verifyToken(token, {
|
|
64
|
-
secretKey,
|
|
65
|
-
}));
|
|
66
|
-
// Validate payload has required subject claim
|
|
67
|
-
if (!payload.sub || typeof payload.sub !== 'string') {
|
|
68
|
-
throw new Error('Invalid token: missing or invalid subject claim');
|
|
69
|
-
}
|
|
70
|
-
// Memoize user fetch to avoid multiple API calls
|
|
71
|
-
let cachedUser = null;
|
|
72
|
-
// Create auth object with Clerk user and payload types
|
|
73
|
-
const auth = {
|
|
74
|
-
async getUser() {
|
|
75
|
-
if (cachedUser) {
|
|
76
|
-
return cachedUser;
|
|
77
|
-
}
|
|
78
|
-
const user = await clerkClient.users.getUser(payload.sub);
|
|
79
|
-
cachedUser = mapClerkUserToAgentuityUser(user);
|
|
80
|
-
return cachedUser;
|
|
81
|
-
},
|
|
82
|
-
async getToken() {
|
|
83
|
-
return token;
|
|
84
|
-
},
|
|
85
|
-
raw: payload,
|
|
86
|
-
};
|
|
87
|
-
c.set('auth', auth);
|
|
88
|
-
await next();
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
92
|
-
const errorCode = error && typeof error === 'object' && 'code' in error && typeof error.code === 'string'
|
|
93
|
-
? error.code
|
|
94
|
-
: 'CLERK_AUTH_ERROR';
|
|
95
|
-
console.error(`[Clerk Auth] Authentication failed: ${errorCode} - ${errorMessage}`);
|
|
96
|
-
return c.json({ error: 'Unauthorized' }, 401);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Map Clerk User to AgentuityAuthUser.
|
|
102
|
-
*/
|
|
103
|
-
function mapClerkUserToAgentuityUser(clerkUser) {
|
|
104
|
-
return {
|
|
105
|
-
id: clerkUser.id,
|
|
106
|
-
name: `${clerkUser.firstName || ''} ${clerkUser.lastName || ''}`.trim() || undefined,
|
|
107
|
-
email: clerkUser.emailAddresses[0]?.emailAddress,
|
|
108
|
-
raw: clerkUser,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=server.js.map
|
package/dist/clerk/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/clerk/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqChE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkC,EAAE;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpE,MAAM,cAAc,GACnB,OAAO,CAAC,cAAc;QACtB,OAAO,CAAC,GAAG,CAAC,sCAAsC;QAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAEnC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CACZ,mHAAmH,CACnH,CAAC;QACF,MAAM,IAAI,KAAK,CACd,8EAA8E,CAC9E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CACX,sHAAsH,CACtH,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAErD,OAAO,oBAAoB,CAAW,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvD,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC;YACJ,mCAAmC;YACnC,IAAI,KAAa,CAAC;YAClB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACP,0CAA0C;gBAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC/C,CAAC;gBACD,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC;YAED,6DAA6D;YAC7D,MAAM,OAAO,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE;gBACzC,SAAS;aACT,CAAC,CAAoB,CAAC;YAEvB,8CAA8C;YAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACpE,CAAC;YAED,iDAAiD;YACjD,IAAI,UAAU,GAAmC,IAAI,CAAC;YAEtD,uDAAuD;YACvD,MAAM,IAAI,GAAyC;gBAClD,KAAK,CAAC,OAAO;oBACZ,IAAI,UAAU,EAAE,CAAC;wBAChB,OAAO,UAAU,CAAC;oBACnB,CAAC;oBACD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1D,UAAU,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;oBAC/C,OAAO,UAAU,CAAC;gBACnB,CAAC;gBAED,KAAK,CAAC,QAAQ;oBACb,OAAO,KAAK,CAAC;gBACd,CAAC;gBAED,GAAG,EAAE,OAAO;aACZ,CAAC;YAEF,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpB,MAAM,IAAI,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC9E,MAAM,SAAS,GACd,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBACtF,CAAC,CAAC,KAAK,CAAC,IAAI;gBACZ,CAAC,CAAC,kBAAkB,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,uCAAuC,SAAS,MAAM,YAAY,EAAE,CAAC,CAAC;YACpF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,SAAe;IACnD,OAAO;QACN,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,IAAI,EAAE,IAAI,SAAS,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,SAAS;QACpF,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY;QAChD,GAAG,EAAE,SAAS;KACd,CAAC;AACH,CAAC"}
|
package/docs/adding-providers.md
DELETED
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
# Adding New Auth Providers
|
|
2
|
-
|
|
3
|
-
Guide for implementing new authentication providers in `@agentuity/auth`.
|
|
4
|
-
|
|
5
|
-
## Provider Structure
|
|
6
|
-
|
|
7
|
-
Each provider follows a consistent structure:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
src/<provider>/
|
|
11
|
-
├── index.ts # Re-exports client and server
|
|
12
|
-
├── client.tsx # React component for client-side auth
|
|
13
|
-
└── server.ts # Hono middleware for server-side validation
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Step 1: Create Provider Directory
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
mkdir -p src/workos
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Step 2: Implement Client Component
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
// src/workos/client.tsx
|
|
26
|
-
import React, { useEffect } from 'react';
|
|
27
|
-
import { useAuth } from '@agentuity/react';
|
|
28
|
-
import type { useAuth as WorkOSUseAuth } from '@workos/react';
|
|
29
|
-
|
|
30
|
-
export interface AgentuityWorkOSProps {
|
|
31
|
-
children: React.ReactNode;
|
|
32
|
-
useAuth: typeof WorkOSUseAuth;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function AgentuityWorkOS({ children, useAuth: workosUseAuth }: AgentuityWorkOSProps) {
|
|
36
|
-
const { getToken, isLoaded } = workosUseAuth();
|
|
37
|
-
const { setAuthHeader, setAuthLoading } = useAuth();
|
|
38
|
-
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
if (!isLoaded || !setAuthHeader || !setAuthLoading) {
|
|
41
|
-
setAuthLoading?.(true);
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const fetchToken = async () => {
|
|
46
|
-
try {
|
|
47
|
-
setAuthLoading(true);
|
|
48
|
-
const token = await getToken();
|
|
49
|
-
setAuthHeader(token ? `Bearer ${token}` : null);
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error('Failed to get WorkOS token:', error);
|
|
52
|
-
setAuthHeader(null);
|
|
53
|
-
} finally {
|
|
54
|
-
setAuthLoading(false);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
fetchToken();
|
|
59
|
-
}, [getToken, isLoaded, setAuthHeader, setAuthLoading]);
|
|
60
|
-
|
|
61
|
-
return <>{children}</>;
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Step 3: Implement Server Middleware
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
// src/workos/server.ts
|
|
69
|
-
import type { MiddlewareHandler } from 'hono';
|
|
70
|
-
import { WorkOS } from '@workos-inc/node';
|
|
71
|
-
import type { AgentuityAuth, AgentuityAuthUser } from '../types';
|
|
72
|
-
|
|
73
|
-
export interface WorkOSMiddlewareOptions {
|
|
74
|
-
apiKey?: string;
|
|
75
|
-
clientId?: string;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export function createMiddleware(options: WorkOSMiddlewareOptions = {}): MiddlewareHandler {
|
|
79
|
-
const apiKey = options.apiKey || process.env.WORKOS_API_KEY;
|
|
80
|
-
const clientId = options.clientId || process.env.WORKOS_CLIENT_ID;
|
|
81
|
-
|
|
82
|
-
if (!apiKey) {
|
|
83
|
-
console.error('[WorkOS Auth] WORKOS_API_KEY is not set');
|
|
84
|
-
throw new Error('WorkOS API key is required');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const workos = new WorkOS(apiKey);
|
|
88
|
-
|
|
89
|
-
return async (c, next) => {
|
|
90
|
-
const authHeader = c.req.header('Authorization');
|
|
91
|
-
|
|
92
|
-
if (!authHeader) {
|
|
93
|
-
return c.json({ error: 'Unauthorized' }, 401);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
const token = authHeader.replace(/^Bearer\s+/i, '');
|
|
98
|
-
const { user } = await workos.userManagement.authenticateWithSessionCookie(token);
|
|
99
|
-
|
|
100
|
-
const auth: AgentuityAuth<typeof user, unknown> = {
|
|
101
|
-
async requireUser() {
|
|
102
|
-
return {
|
|
103
|
-
id: user.id,
|
|
104
|
-
email: user.email,
|
|
105
|
-
name: `${user.firstName} ${user.lastName}`.trim(),
|
|
106
|
-
raw: user,
|
|
107
|
-
};
|
|
108
|
-
},
|
|
109
|
-
async getToken() {
|
|
110
|
-
return token;
|
|
111
|
-
},
|
|
112
|
-
raw: {},
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
c.set('auth', auth);
|
|
116
|
-
await next();
|
|
117
|
-
} catch (error) {
|
|
118
|
-
console.error('WorkOS auth error:', error);
|
|
119
|
-
return c.json({ error: 'Unauthorized' }, 401);
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
declare module 'hono' {
|
|
125
|
-
interface ContextVariableMap {
|
|
126
|
-
auth: AgentuityAuth<any, unknown>;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Step 4: Create Index File
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
// src/workos/index.ts
|
|
135
|
-
export { AgentuityWorkOS } from './client';
|
|
136
|
-
export type { AgentuityWorkOSProps } from './client';
|
|
137
|
-
export { createMiddleware } from './server';
|
|
138
|
-
export type { WorkOSMiddlewareOptions } from './server';
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Step 5: Update Package Exports
|
|
142
|
-
|
|
143
|
-
```json
|
|
144
|
-
// package.json
|
|
145
|
-
{
|
|
146
|
-
"exports": {
|
|
147
|
-
".": "./src/index.ts",
|
|
148
|
-
"./clerk": "./src/clerk/index.ts",
|
|
149
|
-
"./workos": "./src/workos/index.ts"
|
|
150
|
-
},
|
|
151
|
-
"peerDependencies": {
|
|
152
|
-
"@workos-inc/node": "^7.0.0"
|
|
153
|
-
},
|
|
154
|
-
"peerDependenciesMeta": {
|
|
155
|
-
"@workos-inc/node": { "optional": true }
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## Step 6: Write Tests
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
// test/workos-server.test.ts
|
|
164
|
-
import { describe, test, expect } from 'bun:test';
|
|
165
|
-
import { createMiddleware } from '../src/workos/server';
|
|
166
|
-
|
|
167
|
-
describe('WorkOS server middleware', () => {
|
|
168
|
-
test('throws error when WORKOS_API_KEY is missing', () => {
|
|
169
|
-
delete process.env.WORKOS_API_KEY;
|
|
170
|
-
expect(() => createMiddleware()).toThrow('WorkOS API key is required');
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## Type Safety Requirements
|
|
176
|
-
|
|
177
|
-
### Generic Types
|
|
178
|
-
|
|
179
|
-
Providers must use generic types for full type safety:
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
export interface AgentuityAuthUser<T = unknown> {
|
|
183
|
-
id: string;
|
|
184
|
-
name?: string;
|
|
185
|
-
email?: string;
|
|
186
|
-
raw: T; // Provider-specific user object
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
export interface AgentuityAuth<TUser = unknown, TRaw = unknown> {
|
|
190
|
-
requireUser(): Promise<AgentuityAuthUser<TUser>>;
|
|
191
|
-
getToken(): Promise<string | null>;
|
|
192
|
-
raw: TRaw; // Provider-specific auth object
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Hono Module Augmentation
|
|
197
|
-
|
|
198
|
-
Each provider must augment Hono's types:
|
|
199
|
-
|
|
200
|
-
```typescript
|
|
201
|
-
declare module 'hono' {
|
|
202
|
-
interface ContextVariableMap {
|
|
203
|
-
auth: AgentuityAuth<User, ClerkJWTPayload>;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Environment Variables
|
|
209
|
-
|
|
210
|
-
Support these patterns:
|
|
211
|
-
|
|
212
|
-
- **Public keys**: `AGENTUITY_PUBLIC_<PROVIDER>_<KEY>`
|
|
213
|
-
- **Secret keys**: `<PROVIDER>_SECRET_KEY`
|
|
214
|
-
- **Fallback**: Standard provider env var names
|
|
215
|
-
|
|
216
|
-
## Common Patterns
|
|
217
|
-
|
|
218
|
-
### Conditional Rendering
|
|
219
|
-
|
|
220
|
-
```tsx
|
|
221
|
-
function ProtectedComponent() {
|
|
222
|
-
const { isAuthenticated, authLoading } = useAuth();
|
|
223
|
-
|
|
224
|
-
if (authLoading) return <div>Loading...</div>;
|
|
225
|
-
if (!isAuthenticated) return <SignInButton />;
|
|
226
|
-
return <div>Protected content</div>;
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Optional Auth Routes
|
|
231
|
-
|
|
232
|
-
```typescript
|
|
233
|
-
router.get('/public-or-personalized', async (c) => {
|
|
234
|
-
const authHeader = c.req.header('Authorization');
|
|
235
|
-
if (authHeader) {
|
|
236
|
-
try {
|
|
237
|
-
const user = await c.var.auth?.requireUser();
|
|
238
|
-
return c.json({ personalized: true, userId: user?.id });
|
|
239
|
-
} catch {
|
|
240
|
-
// Auth failed, treat as public
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return c.json({ personalized: false });
|
|
244
|
-
});
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
## Security Rules
|
|
248
|
-
|
|
249
|
-
- **Never log secrets**: `console.log('Auth present:', !!authHeader)` not the actual token
|
|
250
|
-
- **Validate on every request**: Don't cache validation results
|
|
251
|
-
- **Use provider SDKs**: Never manually verify JWTs
|
|
252
|
-
|
|
253
|
-
## Checklist
|
|
254
|
-
|
|
255
|
-
1. Research provider's auth flow (JWT, session, OAuth)
|
|
256
|
-
2. Implement client component (token fetching)
|
|
257
|
-
3. Implement server middleware (token validation)
|
|
258
|
-
4. Add Hono type augmentation
|
|
259
|
-
5. Write tests
|
|
260
|
-
6. Update package.json exports
|
|
261
|
-
7. Create template if commonly used
|