@kaiz11/stack-client 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +32 -0
- package/README.md +586 -0
- package/dist/accounts/accounts-client.d.ts +188 -0
- package/dist/accounts/accounts-client.d.ts.map +1 -0
- package/dist/accounts/accounts-client.js +264 -0
- package/dist/accounts/accounts-client.js.map +1 -0
- package/dist/accounts/index.d.ts +8 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +8 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mock-accounts.d.ts +90 -0
- package/dist/accounts/mock-accounts.d.ts.map +1 -0
- package/dist/accounts/mock-accounts.js +434 -0
- package/dist/accounts/mock-accounts.js.map +1 -0
- package/dist/accounts/types.d.ts +180 -0
- package/dist/accounts/types.d.ts.map +1 -0
- package/dist/accounts/types.js +59 -0
- package/dist/accounts/types.js.map +1 -0
- package/dist/auth/auth-client.d.ts +224 -0
- package/dist/auth/auth-client.d.ts.map +1 -0
- package/dist/auth/auth-client.js +230 -0
- package/dist/auth/auth-client.js.map +1 -0
- package/dist/auth/base-auth.d.ts +44 -0
- package/dist/auth/base-auth.d.ts.map +1 -0
- package/dist/auth/base-auth.js +55 -0
- package/dist/auth/base-auth.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/methods/admin.d.ts +59 -0
- package/dist/auth/methods/admin.d.ts.map +1 -0
- package/dist/auth/methods/admin.js +55 -0
- package/dist/auth/methods/admin.js.map +1 -0
- package/dist/auth/methods/index.d.ts +9 -0
- package/dist/auth/methods/index.d.ts.map +1 -0
- package/dist/auth/methods/index.js +8 -0
- package/dist/auth/methods/index.js.map +1 -0
- package/dist/auth/methods/magic-link.d.ts +27 -0
- package/dist/auth/methods/magic-link.d.ts.map +1 -0
- package/dist/auth/methods/magic-link.js +37 -0
- package/dist/auth/methods/magic-link.js.map +1 -0
- package/dist/auth/methods/mfa.d.ts +92 -0
- package/dist/auth/methods/mfa.d.ts.map +1 -0
- package/dist/auth/methods/mfa.js +153 -0
- package/dist/auth/methods/mfa.js.map +1 -0
- package/dist/auth/methods/oauth.d.ts +62 -0
- package/dist/auth/methods/oauth.d.ts.map +1 -0
- package/dist/auth/methods/oauth.js +165 -0
- package/dist/auth/methods/oauth.js.map +1 -0
- package/dist/auth/methods/otp.d.ts +43 -0
- package/dist/auth/methods/otp.d.ts.map +1 -0
- package/dist/auth/methods/otp.js +66 -0
- package/dist/auth/methods/otp.js.map +1 -0
- package/dist/auth/methods/password.d.ts +64 -0
- package/dist/auth/methods/password.d.ts.map +1 -0
- package/dist/auth/methods/password.js +116 -0
- package/dist/auth/methods/password.js.map +1 -0
- package/dist/auth/methods/recovery.d.ts +62 -0
- package/dist/auth/methods/recovery.d.ts.map +1 -0
- package/dist/auth/methods/recovery.js +100 -0
- package/dist/auth/methods/recovery.js.map +1 -0
- package/dist/auth/mock-auth.d.ts +135 -0
- package/dist/auth/mock-auth.d.ts.map +1 -0
- package/dist/auth/mock-auth.js +417 -0
- package/dist/auth/mock-auth.js.map +1 -0
- package/dist/auth/server/helpers.d.ts +215 -0
- package/dist/auth/server/helpers.d.ts.map +1 -0
- package/dist/auth/server/helpers.js +241 -0
- package/dist/auth/server/helpers.js.map +1 -0
- package/dist/auth/server/index.d.ts +24 -0
- package/dist/auth/server/index.d.ts.map +1 -0
- package/dist/auth/server/index.js +40 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/middleware.d.ts +305 -0
- package/dist/auth/server/middleware.d.ts.map +1 -0
- package/dist/auth/server/middleware.js +405 -0
- package/dist/auth/server/middleware.js.map +1 -0
- package/dist/auth/server/verify.d.ts +184 -0
- package/dist/auth/server/verify.d.ts.map +1 -0
- package/dist/auth/server/verify.js +222 -0
- package/dist/auth/server/verify.js.map +1 -0
- package/dist/auth/token-manager.d.ts +94 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +231 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/auth/types.d.ts +412 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +66 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user/identities.d.ts +62 -0
- package/dist/auth/user/identities.d.ts.map +1 -0
- package/dist/auth/user/identities.js +88 -0
- package/dist/auth/user/identities.js.map +1 -0
- package/dist/auth/user/index.d.ts +4 -0
- package/dist/auth/user/index.d.ts.map +1 -0
- package/dist/auth/user/index.js +4 -0
- package/dist/auth/user/index.js.map +1 -0
- package/dist/auth/user/user.d.ts +64 -0
- package/dist/auth/user/user.d.ts.map +1 -0
- package/dist/auth/user/user.js +105 -0
- package/dist/auth/user/user.js.map +1 -0
- package/dist/auth/user/verification.d.ts +49 -0
- package/dist/auth/user/verification.d.ts.map +1 -0
- package/dist/auth/user/verification.js +71 -0
- package/dist/auth/user/verification.js.map +1 -0
- package/dist/cli/browser.d.ts +11 -0
- package/dist/cli/browser.d.ts.map +1 -0
- package/dist/cli/browser.js +35 -0
- package/dist/cli/browser.js.map +1 -0
- package/dist/cli/callback-server.d.ts +30 -0
- package/dist/cli/callback-server.d.ts.map +1 -0
- package/dist/cli/callback-server.js +100 -0
- package/dist/cli/callback-server.js.map +1 -0
- package/dist/cli/file-token-store.d.ts +79 -0
- package/dist/cli/file-token-store.d.ts.map +1 -0
- package/dist/cli/file-token-store.js +138 -0
- package/dist/cli/file-token-store.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/oauth.d.ts +67 -0
- package/dist/cli/oauth.d.ts.map +1 -0
- package/dist/cli/oauth.js +101 -0
- package/dist/cli/oauth.js.map +1 -0
- package/dist/cli/pkce.d.ts +35 -0
- package/dist/cli/pkce.d.ts.map +1 -0
- package/dist/cli/pkce.js +43 -0
- package/dist/cli/pkce.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +99 -0
- package/dist/client.js.map +1 -0
- package/dist/db/client.d.ts +9 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +19 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +19 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +57 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/mock.d.ts +28 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +459 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/types.d.ts +73 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +33 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +76 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +81 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +163 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/keys.d.ts +87 -0
- package/dist/lib/keys.d.ts.map +1 -0
- package/dist/lib/keys.js +147 -0
- package/dist/lib/keys.js.map +1 -0
- package/dist/lib/paths.d.ts +37 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +49 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/token-store.d.ts +42 -0
- package/dist/lib/token-store.d.ts.map +1 -0
- package/dist/lib/token-store.js +75 -0
- package/dist/lib/token-store.js.map +1 -0
- package/dist/mocks/handlers.d.ts +29 -0
- package/dist/mocks/handlers.d.ts.map +1 -0
- package/dist/mocks/handlers.js +79 -0
- package/dist/mocks/handlers.js.map +1 -0
- package/dist/mocks/index.d.ts +5 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +9 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/responses.d.ts +76 -0
- package/dist/mocks/responses.d.ts.map +1 -0
- package/dist/mocks/responses.js +91 -0
- package/dist/mocks/responses.js.map +1 -0
- package/dist/mocks/server.d.ts +7 -0
- package/dist/mocks/server.d.ts.map +1 -0
- package/dist/mocks/server.js +9 -0
- package/dist/mocks/server.js.map +1 -0
- package/dist/mocks/state.d.ts +86 -0
- package/dist/mocks/state.d.ts.map +1 -0
- package/dist/mocks/state.js +77 -0
- package/dist/mocks/state.js.map +1 -0
- package/dist/storage/bucket-ref.d.ts +183 -0
- package/dist/storage/bucket-ref.d.ts.map +1 -0
- package/dist/storage/bucket-ref.js +529 -0
- package/dist/storage/bucket-ref.js.map +1 -0
- package/dist/storage/errors.d.ts +27 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +89 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interface.d.ts +245 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/mock-storage.d.ts +67 -0
- package/dist/storage/mock-storage.d.ts.map +1 -0
- package/dist/storage/mock-storage.js +478 -0
- package/dist/storage/mock-storage.js.map +1 -0
- package/dist/storage/policies-client.d.ts +77 -0
- package/dist/storage/policies-client.d.ts.map +1 -0
- package/dist/storage/policies-client.js +115 -0
- package/dist/storage/policies-client.js.map +1 -0
- package/dist/storage/policy-templates.d.ts +6 -0
- package/dist/storage/policy-templates.d.ts.map +1 -0
- package/dist/storage/policy-templates.js +290 -0
- package/dist/storage/policy-templates.js.map +1 -0
- package/dist/storage/policy-types.d.ts +98 -0
- package/dist/storage/policy-types.d.ts.map +1 -0
- package/dist/storage/policy-types.js +20 -0
- package/dist/storage/policy-types.js.map +1 -0
- package/dist/storage/storage-client.d.ts +32 -0
- package/dist/storage/storage-client.d.ts.map +1 -0
- package/dist/storage/storage-client.js +94 -0
- package/dist/storage/storage-client.js.map +1 -0
- package/dist/storage/tus-upload.d.ts +56 -0
- package/dist/storage/tus-upload.d.ts.map +1 -0
- package/dist/storage/tus-upload.js +236 -0
- package/dist/storage/tus-upload.js.map +1 -0
- package/dist/storage/types.d.ts +335 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +39 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/test/auth/helpers.d.ts +33 -0
- package/dist/test/auth/helpers.d.ts.map +1 -0
- package/dist/test/auth/helpers.js +80 -0
- package/dist/test/auth/helpers.js.map +1 -0
- package/dist/test/helpers/jwt.d.ts +61 -0
- package/dist/test/helpers/jwt.d.ts.map +1 -0
- package/dist/test/helpers/jwt.js +132 -0
- package/dist/test/helpers/jwt.js.map +1 -0
- package/dist/test/helpers/mailpit.d.ts +61 -0
- package/dist/test/helpers/mailpit.d.ts.map +1 -0
- package/dist/test/helpers/mailpit.js +107 -0
- package/dist/test/helpers/mailpit.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +17 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { type TokenPayload, type VerifyOptions, type JWKSKeyGetter } from "./verify.js";
|
|
2
|
+
/**
|
|
3
|
+
* User info extracted from a verified token
|
|
4
|
+
*/
|
|
5
|
+
export interface AuthUser {
|
|
6
|
+
/** User ID */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Email address */
|
|
9
|
+
email: string | null;
|
|
10
|
+
/** Phone number */
|
|
11
|
+
phone: string | null;
|
|
12
|
+
/** User role */
|
|
13
|
+
role: string;
|
|
14
|
+
/** Authenticator assurance level */
|
|
15
|
+
aal: "aal1" | "aal2";
|
|
16
|
+
/** App metadata */
|
|
17
|
+
appMetadata: Record<string, unknown>;
|
|
18
|
+
/** User metadata */
|
|
19
|
+
userMetadata: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Auth context extracted from a request
|
|
23
|
+
*/
|
|
24
|
+
export interface AuthContext {
|
|
25
|
+
/** Whether the request is authenticated */
|
|
26
|
+
isAuthenticated: boolean;
|
|
27
|
+
/** Authenticated user (null if not authenticated) */
|
|
28
|
+
user: AuthUser | null;
|
|
29
|
+
/** Raw token payload (null if not authenticated) */
|
|
30
|
+
tokenPayload: TokenPayload | null;
|
|
31
|
+
/** Access token (null if not authenticated) */
|
|
32
|
+
accessToken: string | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Request-like interface (works with Hono, Express, Fetch API, etc.)
|
|
36
|
+
*/
|
|
37
|
+
interface RequestLike {
|
|
38
|
+
headers: {
|
|
39
|
+
get(name: string): string | null;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get authenticated user from a request
|
|
44
|
+
*
|
|
45
|
+
* Extracts and verifies the JWT from the Authorization header.
|
|
46
|
+
* Returns null if no token or invalid token.
|
|
47
|
+
*
|
|
48
|
+
* ## Token Handling
|
|
49
|
+
*
|
|
50
|
+
* | Token Type | Result |
|
|
51
|
+
* |---------------|-------------------------------------------------|
|
|
52
|
+
* | No token | Returns `null` |
|
|
53
|
+
* | Invalid token | Returns `null` |
|
|
54
|
+
* | Anon JWT | Returns `AuthUser` with `role = "anon"` |
|
|
55
|
+
* | Auth JWT | Returns `AuthUser` with `role = "authenticated"`|
|
|
56
|
+
* | Service JWT | Returns `AuthUser` with `role = "service_role"` |
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* import { getUserFromRequest, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
61
|
+
*
|
|
62
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
63
|
+
*
|
|
64
|
+
* // Hono
|
|
65
|
+
* app.get("/api/me", async (c) => {
|
|
66
|
+
* const user = await getUserFromRequest(c.req.raw, getKey);
|
|
67
|
+
* if (!user) {
|
|
68
|
+
* return c.json({ error: "Unauthorized" }, 401);
|
|
69
|
+
* }
|
|
70
|
+
* return c.json({ user });
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // Express
|
|
74
|
+
* app.get("/api/me", async (req, res) => {
|
|
75
|
+
* const user = await getUserFromRequest(req, getKey);
|
|
76
|
+
* if (!user) {
|
|
77
|
+
* return res.status(401).json({ error: "Unauthorized" });
|
|
78
|
+
* }
|
|
79
|
+
* res.json({ user });
|
|
80
|
+
* });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function getUserFromRequest(request: RequestLike, keyGetter: JWKSKeyGetter, options?: VerifyOptions): Promise<AuthUser | null>;
|
|
84
|
+
/**
|
|
85
|
+
* Get auth context from a request
|
|
86
|
+
*
|
|
87
|
+
* Returns full auth context including authentication status,
|
|
88
|
+
* user info, and raw token payload.
|
|
89
|
+
*
|
|
90
|
+
* ## Token Handling
|
|
91
|
+
*
|
|
92
|
+
* | Token Type | `isAuthenticated` | `user.role` |
|
|
93
|
+
* |---------------|-------------------|---------------------|
|
|
94
|
+
* | No token | `false` | N/A (`user = null`) |
|
|
95
|
+
* | Invalid token | `false` | N/A (`user = null`) |
|
|
96
|
+
* | Anon JWT | `true` | `"anon"` |
|
|
97
|
+
* | Auth JWT | `true` | `"authenticated"` |
|
|
98
|
+
* | Service JWT | `true` | `"service_role"` |
|
|
99
|
+
*
|
|
100
|
+
* **Note:** `isAuthenticated = true` for anon tokens because they are
|
|
101
|
+
* valid, signed JWTs. Check `user.role` if you need to distinguish.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* import { getAuthContext, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
106
|
+
*
|
|
107
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
108
|
+
* const ctx = await getAuthContext(request, getKey);
|
|
109
|
+
*
|
|
110
|
+
* if (!ctx.isAuthenticated) {
|
|
111
|
+
* // No token or invalid token
|
|
112
|
+
* } else if (ctx.user.role === "anon") {
|
|
113
|
+
* // Valid anon token
|
|
114
|
+
* } else {
|
|
115
|
+
* // Authenticated or service_role
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare function getAuthContext(request: RequestLike, keyGetter: JWKSKeyGetter, options?: VerifyOptions): Promise<AuthContext>;
|
|
120
|
+
/**
|
|
121
|
+
* Require authentication for a request
|
|
122
|
+
*
|
|
123
|
+
* Throws VerifyError if not authenticated.
|
|
124
|
+
*
|
|
125
|
+
* ## Token Handling
|
|
126
|
+
*
|
|
127
|
+
* | Token Type | Result |
|
|
128
|
+
* |---------------|-------------------------------------------------|
|
|
129
|
+
* | No token | Throws `VerifyError` (401) |
|
|
130
|
+
* | Invalid token | Throws `VerifyError` (401) |
|
|
131
|
+
* | Anon JWT | ✅ Returns `AuthUser` with `role = "anon"` |
|
|
132
|
+
* | Auth JWT | ✅ Returns `AuthUser` with `role = "authenticated"` |
|
|
133
|
+
* | Service JWT | ✅ Returns `AuthUser` with `role = "service_role"` |
|
|
134
|
+
*
|
|
135
|
+
* **Note:** Anon tokens pass because they are valid JWTs. Use `requireRole`
|
|
136
|
+
* if you need to reject anon tokens.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* import { requireAuth, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
141
|
+
*
|
|
142
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
143
|
+
*
|
|
144
|
+
* try {
|
|
145
|
+
* const user = await requireAuth(request, getKey);
|
|
146
|
+
* // User has a valid token (anon, authenticated, or service_role)
|
|
147
|
+
* } catch (error) {
|
|
148
|
+
* if (error instanceof VerifyError) {
|
|
149
|
+
* return new Response(error.message, { status: error.statusCode });
|
|
150
|
+
* }
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export declare function requireAuth(request: RequestLike, keyGetter: JWKSKeyGetter, options?: VerifyOptions): Promise<AuthUser>;
|
|
155
|
+
/**
|
|
156
|
+
* Require a specific role
|
|
157
|
+
*
|
|
158
|
+
* ## Token Handling
|
|
159
|
+
*
|
|
160
|
+
* | Token Type | `requireRole(..., "authenticated")` | `requireRole(..., "service_role")` |
|
|
161
|
+
* |---------------|-------------------------------------|-----------------------------------|
|
|
162
|
+
* | No token | Throws (401) | Throws (401) |
|
|
163
|
+
* | Invalid token | Throws (401) | Throws (401) |
|
|
164
|
+
* | Anon JWT | Throws (403) | Throws (403) |
|
|
165
|
+
* | Auth JWT | ✅ Returns user | Throws (403) |
|
|
166
|
+
* | Service JWT | Throws (403) | ✅ Returns user |
|
|
167
|
+
*
|
|
168
|
+
* **Common patterns:**
|
|
169
|
+
* - `requireRole(req, key, "authenticated")` — Reject anon, require login
|
|
170
|
+
* - `requireRole(req, key, "service_role")` — Server-only / admin endpoints
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* import { requireRole, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
175
|
+
*
|
|
176
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
177
|
+
*
|
|
178
|
+
* // Require actual login (reject anon)
|
|
179
|
+
* const user = await requireRole(request, getKey, "authenticated");
|
|
180
|
+
*
|
|
181
|
+
* // Require service_role for admin endpoints
|
|
182
|
+
* const admin = await requireRole(request, getKey, "service_role");
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export declare function requireRole(request: RequestLike, keyGetter: JWKSKeyGetter, role: string): Promise<AuthUser>;
|
|
186
|
+
/**
|
|
187
|
+
* Require MFA (AAL2)
|
|
188
|
+
*
|
|
189
|
+
* ## Token Handling
|
|
190
|
+
*
|
|
191
|
+
* | Token Type | AAL Level | Result |
|
|
192
|
+
* |------------------|-----------|------------------|
|
|
193
|
+
* | No token | N/A | Throws (401) |
|
|
194
|
+
* | Invalid token | N/A | Throws (401) |
|
|
195
|
+
* | Anon JWT | aal1 | Throws (403) |
|
|
196
|
+
* | Auth JWT | aal1 | Throws (403) |
|
|
197
|
+
* | Auth JWT + MFA | aal2 | ✅ Returns user |
|
|
198
|
+
* | Service JWT | aal1 | Throws (403) |
|
|
199
|
+
*
|
|
200
|
+
* **Note:** Service role tokens typically have aal1. For admin access to
|
|
201
|
+
* MFA-protected operations, check the role explicitly.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* import { requireMfa, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
206
|
+
*
|
|
207
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
208
|
+
*
|
|
209
|
+
* // Require MFA for sensitive operations
|
|
210
|
+
* const user = await requireMfa(request, getKey);
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
export declare function requireMfa(request: RequestLike, keyGetter: JWKSKeyGetter): Promise<AuthUser>;
|
|
214
|
+
export {};
|
|
215
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/auth/server/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,cAAc;IACd,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,mBAAmB;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,eAAe,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,oDAAoD;IACpD,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,OAAO,EAAE;QACP,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;KAClC,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAc1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,WAAW,CAAC,CA6BtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAEnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,QAAQ,CAAC,CAEnB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { verifyToken, extractBearerToken, VerifyError, } from "./verify.js";
|
|
2
|
+
/**
|
|
3
|
+
* Get authenticated user from a request
|
|
4
|
+
*
|
|
5
|
+
* Extracts and verifies the JWT from the Authorization header.
|
|
6
|
+
* Returns null if no token or invalid token.
|
|
7
|
+
*
|
|
8
|
+
* ## Token Handling
|
|
9
|
+
*
|
|
10
|
+
* | Token Type | Result |
|
|
11
|
+
* |---------------|-------------------------------------------------|
|
|
12
|
+
* | No token | Returns `null` |
|
|
13
|
+
* | Invalid token | Returns `null` |
|
|
14
|
+
* | Anon JWT | Returns `AuthUser` with `role = "anon"` |
|
|
15
|
+
* | Auth JWT | Returns `AuthUser` with `role = "authenticated"`|
|
|
16
|
+
* | Service JWT | Returns `AuthUser` with `role = "service_role"` |
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { getUserFromRequest, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
21
|
+
*
|
|
22
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
23
|
+
*
|
|
24
|
+
* // Hono
|
|
25
|
+
* app.get("/api/me", async (c) => {
|
|
26
|
+
* const user = await getUserFromRequest(c.req.raw, getKey);
|
|
27
|
+
* if (!user) {
|
|
28
|
+
* return c.json({ error: "Unauthorized" }, 401);
|
|
29
|
+
* }
|
|
30
|
+
* return c.json({ user });
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Express
|
|
34
|
+
* app.get("/api/me", async (req, res) => {
|
|
35
|
+
* const user = await getUserFromRequest(req, getKey);
|
|
36
|
+
* if (!user) {
|
|
37
|
+
* return res.status(401).json({ error: "Unauthorized" });
|
|
38
|
+
* }
|
|
39
|
+
* res.json({ user });
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export async function getUserFromRequest(request, keyGetter, options) {
|
|
44
|
+
const authHeader = request.headers.get("authorization");
|
|
45
|
+
const token = extractBearerToken(authHeader);
|
|
46
|
+
if (!token) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const payload = await verifyToken(token, keyGetter, options);
|
|
51
|
+
return tokenPayloadToUser(payload);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get auth context from a request
|
|
59
|
+
*
|
|
60
|
+
* Returns full auth context including authentication status,
|
|
61
|
+
* user info, and raw token payload.
|
|
62
|
+
*
|
|
63
|
+
* ## Token Handling
|
|
64
|
+
*
|
|
65
|
+
* | Token Type | `isAuthenticated` | `user.role` |
|
|
66
|
+
* |---------------|-------------------|---------------------|
|
|
67
|
+
* | No token | `false` | N/A (`user = null`) |
|
|
68
|
+
* | Invalid token | `false` | N/A (`user = null`) |
|
|
69
|
+
* | Anon JWT | `true` | `"anon"` |
|
|
70
|
+
* | Auth JWT | `true` | `"authenticated"` |
|
|
71
|
+
* | Service JWT | `true` | `"service_role"` |
|
|
72
|
+
*
|
|
73
|
+
* **Note:** `isAuthenticated = true` for anon tokens because they are
|
|
74
|
+
* valid, signed JWTs. Check `user.role` if you need to distinguish.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* import { getAuthContext, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
79
|
+
*
|
|
80
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
81
|
+
* const ctx = await getAuthContext(request, getKey);
|
|
82
|
+
*
|
|
83
|
+
* if (!ctx.isAuthenticated) {
|
|
84
|
+
* // No token or invalid token
|
|
85
|
+
* } else if (ctx.user.role === "anon") {
|
|
86
|
+
* // Valid anon token
|
|
87
|
+
* } else {
|
|
88
|
+
* // Authenticated or service_role
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export async function getAuthContext(request, keyGetter, options) {
|
|
93
|
+
const authHeader = request.headers.get("authorization");
|
|
94
|
+
const token = extractBearerToken(authHeader);
|
|
95
|
+
if (!token) {
|
|
96
|
+
return {
|
|
97
|
+
isAuthenticated: false,
|
|
98
|
+
user: null,
|
|
99
|
+
tokenPayload: null,
|
|
100
|
+
accessToken: null,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const payload = await verifyToken(token, keyGetter, options);
|
|
105
|
+
return {
|
|
106
|
+
isAuthenticated: true,
|
|
107
|
+
user: tokenPayloadToUser(payload),
|
|
108
|
+
tokenPayload: payload,
|
|
109
|
+
accessToken: token,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return {
|
|
114
|
+
isAuthenticated: false,
|
|
115
|
+
user: null,
|
|
116
|
+
tokenPayload: null,
|
|
117
|
+
accessToken: null,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Require authentication for a request
|
|
123
|
+
*
|
|
124
|
+
* Throws VerifyError if not authenticated.
|
|
125
|
+
*
|
|
126
|
+
* ## Token Handling
|
|
127
|
+
*
|
|
128
|
+
* | Token Type | Result |
|
|
129
|
+
* |---------------|-------------------------------------------------|
|
|
130
|
+
* | No token | Throws `VerifyError` (401) |
|
|
131
|
+
* | Invalid token | Throws `VerifyError` (401) |
|
|
132
|
+
* | Anon JWT | ✅ Returns `AuthUser` with `role = "anon"` |
|
|
133
|
+
* | Auth JWT | ✅ Returns `AuthUser` with `role = "authenticated"` |
|
|
134
|
+
* | Service JWT | ✅ Returns `AuthUser` with `role = "service_role"` |
|
|
135
|
+
*
|
|
136
|
+
* **Note:** Anon tokens pass because they are valid JWTs. Use `requireRole`
|
|
137
|
+
* if you need to reject anon tokens.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* import { requireAuth, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
142
|
+
*
|
|
143
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
144
|
+
*
|
|
145
|
+
* try {
|
|
146
|
+
* const user = await requireAuth(request, getKey);
|
|
147
|
+
* // User has a valid token (anon, authenticated, or service_role)
|
|
148
|
+
* } catch (error) {
|
|
149
|
+
* if (error instanceof VerifyError) {
|
|
150
|
+
* return new Response(error.message, { status: error.statusCode });
|
|
151
|
+
* }
|
|
152
|
+
* }
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export async function requireAuth(request, keyGetter, options) {
|
|
156
|
+
const authHeader = request.headers.get("authorization");
|
|
157
|
+
const token = extractBearerToken(authHeader);
|
|
158
|
+
if (!token) {
|
|
159
|
+
throw VerifyError.missingToken();
|
|
160
|
+
}
|
|
161
|
+
const payload = await verifyToken(token, keyGetter, options);
|
|
162
|
+
return tokenPayloadToUser(payload);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Require a specific role
|
|
166
|
+
*
|
|
167
|
+
* ## Token Handling
|
|
168
|
+
*
|
|
169
|
+
* | Token Type | `requireRole(..., "authenticated")` | `requireRole(..., "service_role")` |
|
|
170
|
+
* |---------------|-------------------------------------|-----------------------------------|
|
|
171
|
+
* | No token | Throws (401) | Throws (401) |
|
|
172
|
+
* | Invalid token | Throws (401) | Throws (401) |
|
|
173
|
+
* | Anon JWT | Throws (403) | Throws (403) |
|
|
174
|
+
* | Auth JWT | ✅ Returns user | Throws (403) |
|
|
175
|
+
* | Service JWT | Throws (403) | ✅ Returns user |
|
|
176
|
+
*
|
|
177
|
+
* **Common patterns:**
|
|
178
|
+
* - `requireRole(req, key, "authenticated")` — Reject anon, require login
|
|
179
|
+
* - `requireRole(req, key, "service_role")` — Server-only / admin endpoints
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* import { requireRole, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
184
|
+
*
|
|
185
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
186
|
+
*
|
|
187
|
+
* // Require actual login (reject anon)
|
|
188
|
+
* const user = await requireRole(request, getKey, "authenticated");
|
|
189
|
+
*
|
|
190
|
+
* // Require service_role for admin endpoints
|
|
191
|
+
* const admin = await requireRole(request, getKey, "service_role");
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
export async function requireRole(request, keyGetter, role) {
|
|
195
|
+
return requireAuth(request, keyGetter, { requiredRole: role });
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Require MFA (AAL2)
|
|
199
|
+
*
|
|
200
|
+
* ## Token Handling
|
|
201
|
+
*
|
|
202
|
+
* | Token Type | AAL Level | Result |
|
|
203
|
+
* |------------------|-----------|------------------|
|
|
204
|
+
* | No token | N/A | Throws (401) |
|
|
205
|
+
* | Invalid token | N/A | Throws (401) |
|
|
206
|
+
* | Anon JWT | aal1 | Throws (403) |
|
|
207
|
+
* | Auth JWT | aal1 | Throws (403) |
|
|
208
|
+
* | Auth JWT + MFA | aal2 | ✅ Returns user |
|
|
209
|
+
* | Service JWT | aal1 | Throws (403) |
|
|
210
|
+
*
|
|
211
|
+
* **Note:** Service role tokens typically have aal1. For admin access to
|
|
212
|
+
* MFA-protected operations, check the role explicitly.
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* import { requireMfa, createJWKS } from "@kaiz11/stack-client/auth/server";
|
|
217
|
+
*
|
|
218
|
+
* const getKey = createJWKS("https://stack.zenku.app", "my-tenant");
|
|
219
|
+
*
|
|
220
|
+
* // Require MFA for sensitive operations
|
|
221
|
+
* const user = await requireMfa(request, getKey);
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
export async function requireMfa(request, keyGetter) {
|
|
225
|
+
return requireAuth(request, keyGetter, { requiredAal: "aal2" });
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Convert token payload to AuthUser
|
|
229
|
+
*/
|
|
230
|
+
function tokenPayloadToUser(payload) {
|
|
231
|
+
return {
|
|
232
|
+
id: payload.sub,
|
|
233
|
+
email: payload.email ?? null,
|
|
234
|
+
phone: payload.phone ?? null,
|
|
235
|
+
role: payload.role,
|
|
236
|
+
aal: payload.aal || "aal1",
|
|
237
|
+
appMetadata: payload.app_metadata ?? {},
|
|
238
|
+
userMetadata: payload.user_metadata ?? {},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/auth/server/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend auth utilities for server-side token verification
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* // Platform API (omit tenantId)
|
|
7
|
+
* import { createStackAuthMiddleware } from "@kaiz11/stack-client/auth/server";
|
|
8
|
+
*
|
|
9
|
+
* app.use("*", createStackAuthMiddleware({
|
|
10
|
+
* baseUrl: "https://stack.zenku.app",
|
|
11
|
+
* }));
|
|
12
|
+
*
|
|
13
|
+
* // Tenant API (specify tenantId)
|
|
14
|
+
* app.use("*", createStackAuthMiddleware({
|
|
15
|
+
* baseUrl: "https://stack.zenku.app",
|
|
16
|
+
* tenantId: "acme-corp",
|
|
17
|
+
* }));
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export { verifyToken, extractBearerToken, createJWKS, getJWKSUrl, createRemoteJWKS, createLocalJWKS, clearJWKSCache, VerifyError, type TokenPayload, type VerifyOptions, type JWKSKeyGetter, } from "./verify.js";
|
|
21
|
+
export { getUserFromRequest, getAuthContext, requireAuth, requireRole, requireMfa, type AuthUser, type AuthContext, } from "./helpers.js";
|
|
22
|
+
export { createStackAuthMiddleware, optionalStackAuthMiddleware, createAuthMiddleware, optionalAuthMiddleware, requireRoleMiddleware, requireMfaMiddleware, type StackAuthMiddlewareConfig, type AuthMiddlewareConfig, type OptionalStackAuthConfig, type OptionalAuthConfig, } from "./middleware.js";
|
|
23
|
+
export { fetchAnonKey, fetchAnonKeyCached, clearAnonKeyCache, buildPublicKeyUrl, AnonKeyError, } from "../../lib/keys.js";
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EACL,WAAW,EACX,kBAAkB,EAElB,UAAU,EACV,UAAU,EAEV,gBAAgB,EAChB,eAAe,EACf,cAAc,EAEd,WAAW,EAEX,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,yBAAyB,EACzB,2BAA2B,EAE3B,oBAAoB,EACpB,sBAAsB,EAEtB,qBAAqB,EACrB,oBAAoB,EAEpB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend auth utilities for server-side token verification
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* // Platform API (omit tenantId)
|
|
7
|
+
* import { createStackAuthMiddleware } from "@kaiz11/stack-client/auth/server";
|
|
8
|
+
*
|
|
9
|
+
* app.use("*", createStackAuthMiddleware({
|
|
10
|
+
* baseUrl: "https://stack.zenku.app",
|
|
11
|
+
* }));
|
|
12
|
+
*
|
|
13
|
+
* // Tenant API (specify tenantId)
|
|
14
|
+
* app.use("*", createStackAuthMiddleware({
|
|
15
|
+
* baseUrl: "https://stack.zenku.app",
|
|
16
|
+
* tenantId: "acme-corp",
|
|
17
|
+
* }));
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
// Verification
|
|
21
|
+
export { verifyToken, extractBearerToken,
|
|
22
|
+
// JWKS helpers (unified)
|
|
23
|
+
createJWKS, getJWKSUrl,
|
|
24
|
+
// JWKS helpers (advanced)
|
|
25
|
+
createRemoteJWKS, createLocalJWKS, clearJWKSCache,
|
|
26
|
+
// Error
|
|
27
|
+
VerifyError, } from "./verify.js";
|
|
28
|
+
// Helpers
|
|
29
|
+
export { getUserFromRequest, getAuthContext, requireAuth, requireRole, requireMfa, } from "./helpers.js";
|
|
30
|
+
// Middleware
|
|
31
|
+
export {
|
|
32
|
+
// Unified middleware (recommended)
|
|
33
|
+
createStackAuthMiddleware, optionalStackAuthMiddleware,
|
|
34
|
+
// Advanced middleware (with custom keyGetter)
|
|
35
|
+
createAuthMiddleware, optionalAuthMiddleware,
|
|
36
|
+
// Guard middleware
|
|
37
|
+
requireRoleMiddleware, requireMfaMiddleware, } from "./middleware.js";
|
|
38
|
+
// Key utilities (re-export from lib for convenience)
|
|
39
|
+
export { fetchAnonKey, fetchAnonKeyCached, clearAnonKeyCache, buildPublicKeyUrl, AnonKeyError, } from "../../lib/keys.js";
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAe;AACf,OAAO,EACL,WAAW,EACX,kBAAkB;AAClB,yBAAyB;AACzB,UAAU,EACV,UAAU;AACV,0BAA0B;AAC1B,gBAAgB,EAChB,eAAe,EACf,cAAc;AACd,QAAQ;AACR,WAAW,GAKZ,MAAM,aAAa,CAAC;AAErB,UAAU;AACV,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,GAGX,MAAM,cAAc,CAAC;AAEtB,aAAa;AACb,OAAO;AACL,mCAAmC;AACnC,yBAAyB,EACzB,2BAA2B;AAC3B,8CAA8C;AAC9C,oBAAoB,EACpB,sBAAsB;AACtB,mBAAmB;AACnB,qBAAqB,EACrB,oBAAoB,GAMrB,MAAM,iBAAiB,CAAC;AAEzB,qDAAqD;AACrD,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,mBAAmB,CAAC"}
|