@qwickapps/server 1.2.0 → 1.3.1
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 +392 -0
- package/dist/core/control-panel.d.ts +7 -2
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +120 -54
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/gateway.d.ts +159 -79
- package/dist/core/gateway.d.ts.map +1 -1
- package/dist/core/gateway.js +679 -319
- package/dist/core/gateway.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +307 -0
- package/dist/core/plugin-registry.d.ts.map +1 -0
- package/dist/core/plugin-registry.js +352 -0
- package/dist/core/plugin-registry.js.map +1 -0
- package/dist/core/types.d.ts +16 -33
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/plugins/auth/adapters/auth0-adapter.d.ts +14 -0
- package/dist/plugins/auth/adapters/auth0-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/auth0-adapter.js +179 -0
- package/dist/plugins/auth/adapters/auth0-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts +13 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.js +51 -0
- package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/index.d.ts +10 -0
- package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/index.js +10 -0
- package/dist/plugins/auth/adapters/index.js.map +1 -0
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts +13 -0
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/supabase-adapter.js +109 -0
- package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.d.ts +18 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.js +267 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.js.map +1 -0
- package/dist/plugins/auth/auth-plugin.d.ts +40 -0
- package/dist/plugins/auth/auth-plugin.d.ts.map +1 -0
- package/dist/plugins/auth/auth-plugin.js +255 -0
- package/dist/plugins/auth/auth-plugin.js.map +1 -0
- package/dist/plugins/auth/auth-plugin.test.d.ts +9 -0
- package/dist/plugins/auth/auth-plugin.test.d.ts.map +1 -0
- package/dist/plugins/auth/auth-plugin.test.js +147 -0
- package/dist/plugins/auth/auth-plugin.test.js.map +1 -0
- package/dist/plugins/auth/env-config.d.ts +88 -0
- package/dist/plugins/auth/env-config.d.ts.map +1 -0
- package/dist/plugins/auth/env-config.js +489 -0
- package/dist/plugins/auth/env-config.js.map +1 -0
- package/dist/plugins/auth/index.d.ts +14 -0
- package/dist/plugins/auth/index.d.ts.map +1 -0
- package/dist/plugins/auth/index.js +16 -0
- package/dist/plugins/auth/index.js.map +1 -0
- package/dist/plugins/auth/supertokens-adapter.test.d.ts +10 -0
- package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +1 -0
- package/dist/plugins/auth/supertokens-adapter.test.js +486 -0
- package/dist/plugins/auth/supertokens-adapter.test.js.map +1 -0
- package/dist/plugins/auth/types.d.ts +218 -0
- package/dist/plugins/auth/types.d.ts.map +1 -0
- package/dist/plugins/auth/types.js +14 -0
- package/dist/plugins/auth/types.js.map +1 -0
- package/dist/plugins/bans/bans-plugin.d.ts +59 -0
- package/dist/plugins/bans/bans-plugin.d.ts.map +1 -0
- package/dist/plugins/bans/bans-plugin.js +428 -0
- package/dist/plugins/bans/bans-plugin.js.map +1 -0
- package/dist/plugins/bans/index.d.ts +9 -0
- package/dist/plugins/bans/index.d.ts.map +1 -0
- package/dist/plugins/bans/index.js +10 -0
- package/dist/plugins/bans/index.js.map +1 -0
- package/dist/plugins/bans/stores/index.d.ts +7 -0
- package/dist/plugins/bans/stores/index.d.ts.map +1 -0
- package/dist/plugins/bans/stores/index.js +7 -0
- package/dist/plugins/bans/stores/index.js.map +1 -0
- package/dist/plugins/bans/stores/postgres-store.d.ts +29 -0
- package/dist/plugins/bans/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/bans/stores/postgres-store.js +132 -0
- package/dist/plugins/bans/stores/postgres-store.js.map +1 -0
- package/dist/plugins/bans/types.d.ts +128 -0
- package/dist/plugins/bans/types.d.ts.map +1 -0
- package/dist/plugins/bans/types.js +11 -0
- package/dist/plugins/bans/types.js.map +1 -0
- package/dist/plugins/cache-plugin.d.ts +14 -3
- package/dist/plugins/cache-plugin.d.ts.map +1 -1
- package/dist/plugins/cache-plugin.js +27 -7
- package/dist/plugins/cache-plugin.js.map +1 -1
- package/dist/plugins/cache-plugin.test.js +99 -32
- package/dist/plugins/cache-plugin.test.js.map +1 -1
- package/dist/plugins/config-plugin.d.ts +3 -2
- package/dist/plugins/config-plugin.d.ts.map +1 -1
- package/dist/plugins/config-plugin.js +17 -10
- package/dist/plugins/config-plugin.js.map +1 -1
- package/dist/plugins/diagnostics-plugin.d.ts +2 -2
- package/dist/plugins/diagnostics-plugin.d.ts.map +1 -1
- package/dist/plugins/diagnostics-plugin.js +17 -10
- package/dist/plugins/diagnostics-plugin.js.map +1 -1
- package/dist/plugins/entitlements/entitlements-plugin.d.ts +95 -0
- package/dist/plugins/entitlements/entitlements-plugin.d.ts.map +1 -0
- package/dist/plugins/entitlements/entitlements-plugin.js +707 -0
- package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -0
- package/dist/plugins/entitlements/index.d.ts +12 -0
- package/dist/plugins/entitlements/index.d.ts.map +1 -0
- package/dist/plugins/entitlements/index.js +16 -0
- package/dist/plugins/entitlements/index.js.map +1 -0
- package/dist/plugins/entitlements/sources/index.d.ts +9 -0
- package/dist/plugins/entitlements/sources/index.d.ts.map +1 -0
- package/dist/plugins/entitlements/sources/index.js +9 -0
- package/dist/plugins/entitlements/sources/index.js.map +1 -0
- package/dist/plugins/entitlements/sources/postgres-source.d.ts +29 -0
- package/dist/plugins/entitlements/sources/postgres-source.d.ts.map +1 -0
- package/dist/plugins/entitlements/sources/postgres-source.js +169 -0
- package/dist/plugins/entitlements/sources/postgres-source.js.map +1 -0
- package/dist/plugins/entitlements/types.d.ts +232 -0
- package/dist/plugins/entitlements/types.d.ts.map +1 -0
- package/dist/plugins/entitlements/types.js +11 -0
- package/dist/plugins/entitlements/types.js.map +1 -0
- package/dist/plugins/frontend-app-plugin.d.ts +9 -3
- package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
- package/dist/plugins/frontend-app-plugin.js +14 -9
- package/dist/plugins/frontend-app-plugin.js.map +1 -1
- package/dist/plugins/health-plugin.d.ts +5 -2
- package/dist/plugins/health-plugin.d.ts.map +1 -1
- package/dist/plugins/health-plugin.js +20 -5
- package/dist/plugins/health-plugin.js.map +1 -1
- package/dist/plugins/index.d.ts +10 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +10 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/logs-plugin.d.ts +3 -2
- package/dist/plugins/logs-plugin.d.ts.map +1 -1
- package/dist/plugins/logs-plugin.js +21 -12
- package/dist/plugins/logs-plugin.js.map +1 -1
- package/dist/plugins/postgres-plugin.d.ts +3 -3
- package/dist/plugins/postgres-plugin.d.ts.map +1 -1
- package/dist/plugins/postgres-plugin.js +9 -7
- package/dist/plugins/postgres-plugin.js.map +1 -1
- package/dist/plugins/postgres-plugin.test.js +50 -29
- package/dist/plugins/postgres-plugin.test.js.map +1 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +7 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +1 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.js +215 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +1 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +7 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +1 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +265 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +1 -0
- package/dist/plugins/preferences/index.d.ts +12 -0
- package/dist/plugins/preferences/index.d.ts.map +1 -0
- package/dist/plugins/preferences/index.js +13 -0
- package/dist/plugins/preferences/index.js.map +1 -0
- package/dist/plugins/preferences/preferences-plugin.d.ts +39 -0
- package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -0
- package/dist/plugins/preferences/preferences-plugin.js +226 -0
- package/dist/plugins/preferences/preferences-plugin.js.map +1 -0
- package/dist/plugins/preferences/stores/index.d.ts +9 -0
- package/dist/plugins/preferences/stores/index.d.ts.map +1 -0
- package/dist/plugins/preferences/stores/index.js +9 -0
- package/dist/plugins/preferences/stores/index.js.map +1 -0
- package/dist/plugins/preferences/stores/postgres-store.d.ts +41 -0
- package/dist/plugins/preferences/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/preferences/stores/postgres-store.js +181 -0
- package/dist/plugins/preferences/stores/postgres-store.js.map +1 -0
- package/dist/plugins/preferences/types.d.ts +91 -0
- package/dist/plugins/preferences/types.d.ts.map +1 -0
- package/dist/plugins/preferences/types.js +10 -0
- package/dist/plugins/preferences/types.js.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts +9 -0
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js +546 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -0
- package/dist/plugins/users/index.d.ts +12 -0
- package/dist/plugins/users/index.d.ts.map +1 -0
- package/dist/plugins/users/index.js +13 -0
- package/dist/plugins/users/index.js.map +1 -0
- package/dist/plugins/users/stores/index.d.ts +7 -0
- package/dist/plugins/users/stores/index.d.ts.map +1 -0
- package/dist/plugins/users/stores/index.js +7 -0
- package/dist/plugins/users/stores/index.js.map +1 -0
- package/dist/plugins/users/stores/postgres-store.d.ts +28 -0
- package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/users/stores/postgres-store.js +157 -0
- package/dist/plugins/users/stores/postgres-store.js.map +1 -0
- package/dist/plugins/users/types.d.ts +225 -0
- package/dist/plugins/users/types.d.ts.map +1 -0
- package/dist/plugins/users/types.js +12 -0
- package/dist/plugins/users/types.js.map +1 -0
- package/dist/plugins/users/users-plugin.d.ts +45 -0
- package/dist/plugins/users/users-plugin.d.ts.map +1 -0
- package/dist/plugins/users/users-plugin.js +359 -0
- package/dist/plugins/users/users-plugin.js.map +1 -0
- package/dist-ui/assets/index-BY8OxNgO.js +465 -0
- package/dist-ui/assets/index-BY8OxNgO.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +278 -0
- package/dist-ui-lib/components/ControlPanelApp.d.ts +61 -0
- package/dist-ui-lib/components/index.d.ts +18 -0
- package/dist-ui-lib/config/AppConfig.d.ts +7 -0
- package/dist-ui-lib/dashboard/DashboardWidgetRegistry.d.ts +62 -0
- package/dist-ui-lib/dashboard/DashboardWidgetRenderer.d.ts +8 -0
- package/dist-ui-lib/dashboard/PluginWidgetRenderer.d.ts +19 -0
- package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +48 -0
- package/dist-ui-lib/dashboard/builtInWidgets.d.ts +25 -0
- package/dist-ui-lib/dashboard/index.d.ts +13 -0
- package/dist-ui-lib/dashboard/widgets/ServiceHealthWidget.d.ts +12 -0
- package/dist-ui-lib/dashboard/widgets/index.d.ts +6 -0
- package/dist-ui-lib/index.js +5172 -0
- package/dist-ui-lib/index.js.map +1 -0
- package/dist-ui-lib/pages/AuthPage.d.ts +1 -0
- package/dist-ui-lib/pages/ConfigPage.d.ts +1 -0
- package/dist-ui-lib/pages/DashboardPage.d.ts +1 -0
- package/dist-ui-lib/pages/DiagnosticsPage.d.ts +1 -0
- package/dist-ui-lib/pages/EntitlementsPage.d.ts +17 -0
- package/dist-ui-lib/pages/LogsPage.d.ts +1 -0
- package/dist-ui-lib/pages/NotFoundPage.d.ts +1 -0
- package/dist-ui-lib/pages/PluginPage.d.ts +15 -0
- package/dist-ui-lib/pages/PluginsPage.d.ts +1 -0
- package/dist-ui-lib/pages/SystemPage.d.ts +1 -0
- package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
- package/package.json +24 -7
- package/src/core/control-panel.ts +145 -61
- package/src/core/gateway.ts +863 -403
- package/src/core/index.ts +21 -2
- package/src/core/plugin-registry.ts +716 -0
- package/src/core/types.ts +31 -37
- package/src/index.ts +125 -19
- package/src/plugins/auth/adapters/auth0-adapter.ts +214 -0
- package/src/plugins/auth/adapters/basic-adapter.ts +61 -0
- package/src/plugins/auth/adapters/index.ts +10 -0
- package/src/plugins/auth/adapters/supabase-adapter.ts +149 -0
- package/src/plugins/auth/adapters/supertokens-adapter.ts +326 -0
- package/src/plugins/auth/auth-plugin.test.ts +176 -0
- package/src/plugins/auth/auth-plugin.ts +303 -0
- package/src/plugins/auth/env-config.ts +572 -0
- package/src/plugins/auth/index.ts +42 -0
- package/src/plugins/auth/supertokens-adapter.test.ts +621 -0
- package/src/plugins/auth/types.ts +245 -0
- package/src/plugins/bans/bans-plugin.ts +485 -0
- package/src/plugins/bans/index.ts +31 -0
- package/src/plugins/bans/stores/index.ts +7 -0
- package/src/plugins/bans/stores/postgres-store.ts +195 -0
- package/src/plugins/bans/types.ts +141 -0
- package/src/plugins/cache-plugin.test.ts +108 -32
- package/src/plugins/cache-plugin.ts +40 -9
- package/src/plugins/config-plugin.ts +23 -12
- package/src/plugins/diagnostics-plugin.ts +22 -12
- package/src/plugins/entitlements/entitlements-plugin.ts +820 -0
- package/src/plugins/entitlements/index.ts +51 -0
- package/src/plugins/entitlements/sources/index.ts +9 -0
- package/src/plugins/entitlements/sources/postgres-source.ts +253 -0
- package/src/plugins/entitlements/types.ts +256 -0
- package/src/plugins/frontend-app-plugin.ts +24 -12
- package/src/plugins/health-plugin.ts +27 -7
- package/src/plugins/index.ts +132 -4
- package/src/plugins/logs-plugin.ts +28 -14
- package/src/plugins/postgres-plugin.test.ts +52 -29
- package/src/plugins/postgres-plugin.ts +11 -9
- package/src/plugins/preferences/__tests__/deep-merge.test.ts +242 -0
- package/src/plugins/preferences/__tests__/preferences-plugin.test.ts +350 -0
- package/src/plugins/preferences/index.ts +30 -0
- package/src/plugins/preferences/preferences-plugin.ts +270 -0
- package/src/plugins/preferences/stores/index.ts +9 -0
- package/src/plugins/preferences/stores/postgres-store.ts +252 -0
- package/src/plugins/preferences/types.ts +100 -0
- package/src/plugins/users/__tests__/users-plugin.test.ts +690 -0
- package/src/plugins/users/index.ts +38 -0
- package/src/plugins/users/stores/index.ts +7 -0
- package/src/plugins/users/stores/postgres-store.ts +225 -0
- package/src/plugins/users/types.ts +247 -0
- package/src/plugins/users/users-plugin.ts +418 -0
- package/ui/src/App.tsx +188 -31
- package/ui/src/api/controlPanelApi.ts +453 -1
- package/ui/src/components/ControlPanelApp.tsx +212 -0
- package/ui/src/components/index.ts +62 -0
- package/ui/src/dashboard/DashboardWidgetRegistry.tsx +129 -0
- package/ui/src/dashboard/DashboardWidgetRenderer.tsx +34 -0
- package/ui/src/dashboard/PluginWidgetRenderer.tsx +118 -0
- package/ui/src/dashboard/WidgetComponentRegistry.tsx +120 -0
- package/ui/src/dashboard/builtInWidgets.tsx +35 -0
- package/ui/src/dashboard/index.ts +35 -0
- package/ui/src/dashboard/widgets/ServiceHealthWidget.tsx +140 -0
- package/ui/src/dashboard/widgets/index.ts +7 -0
- package/ui/src/pages/AuthPage.tsx +259 -0
- package/ui/src/pages/DashboardPage.tsx +28 -149
- package/ui/src/pages/EntitlementsPage.tsx +557 -0
- package/ui/src/pages/LogsPage.tsx +174 -8
- package/ui/src/pages/PluginPage.tsx +148 -0
- package/ui/src/pages/PluginsPage.tsx +394 -0
- package/ui/src/pages/SystemPage.tsx +445 -0
- package/ui/src/pages/UsersPage.tsx +837 -0
- package/ui/tsconfig.lib.json +11 -0
- package/ui/vite.lib.config.ts +56 -0
- package/dist-ui/assets/index-CW1BviRn.js +0 -465
- package/dist-ui/assets/index-CW1BviRn.js.map +0 -1
- package/ui/src/pages/HealthPage.tsx +0 -204
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth0 Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides Auth0 authentication using express-openid-connect.
|
|
5
|
+
* Enhanced with RBAC support, domain whitelisting, and token exposure.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Extract user roles from Auth0 claims
|
|
11
|
+
*/
|
|
12
|
+
function extractUserRoles(req, domain) {
|
|
13
|
+
const oidc = req.oidc;
|
|
14
|
+
const user = oidc?.user;
|
|
15
|
+
if (!user)
|
|
16
|
+
return [];
|
|
17
|
+
// Check various common locations for roles
|
|
18
|
+
const roles = [];
|
|
19
|
+
// Standard RBAC claim
|
|
20
|
+
if (Array.isArray(user['https://roles'])) {
|
|
21
|
+
roles.push(...user['https://roles']);
|
|
22
|
+
}
|
|
23
|
+
// Namespaced roles (common pattern)
|
|
24
|
+
const namespace = domain ? `https://${domain}/` : '';
|
|
25
|
+
if (namespace && Array.isArray(user[`${namespace}roles`])) {
|
|
26
|
+
roles.push(...user[`${namespace}roles`]);
|
|
27
|
+
}
|
|
28
|
+
// Auth0 authorization extension
|
|
29
|
+
if (Array.isArray(user.roles)) {
|
|
30
|
+
roles.push(...user.roles);
|
|
31
|
+
}
|
|
32
|
+
// Custom claims
|
|
33
|
+
if (Array.isArray(user['custom:roles'])) {
|
|
34
|
+
roles.push(...user['custom:roles']);
|
|
35
|
+
}
|
|
36
|
+
return [...new Set(roles)]; // Deduplicate
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create an Auth0 authentication adapter
|
|
40
|
+
*/
|
|
41
|
+
export function auth0Adapter(config) {
|
|
42
|
+
let authMiddleware = null;
|
|
43
|
+
let initializationError = null;
|
|
44
|
+
const adapter = {
|
|
45
|
+
name: 'auth0',
|
|
46
|
+
initialize() {
|
|
47
|
+
// Return a middleware that lazily initializes Auth0
|
|
48
|
+
return async (req, res, next) => {
|
|
49
|
+
// Skip if already initialized with error
|
|
50
|
+
if (initializationError) {
|
|
51
|
+
return res.status(500).json({
|
|
52
|
+
error: 'Auth Configuration Error',
|
|
53
|
+
message: 'Auth0 is not properly configured.',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// Lazy initialize the Auth0 middleware
|
|
57
|
+
if (!authMiddleware) {
|
|
58
|
+
try {
|
|
59
|
+
const { auth } = await import('express-openid-connect');
|
|
60
|
+
const authConfig = {
|
|
61
|
+
authRequired: false, // We handle auth requirement ourselves
|
|
62
|
+
auth0Logout: true,
|
|
63
|
+
secret: config.secret,
|
|
64
|
+
baseURL: config.baseUrl,
|
|
65
|
+
clientID: config.clientId,
|
|
66
|
+
issuerBaseURL: `https://${config.domain}`,
|
|
67
|
+
clientSecret: config.clientSecret,
|
|
68
|
+
idpLogout: true,
|
|
69
|
+
routes: {
|
|
70
|
+
login: config.routes?.login || '/login',
|
|
71
|
+
logout: config.routes?.logout || '/logout',
|
|
72
|
+
callback: config.routes?.callback || '/callback',
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
// Add audience if specified (for API access tokens)
|
|
76
|
+
if (config.audience) {
|
|
77
|
+
authConfig.authorizationParams = {
|
|
78
|
+
audience: config.audience,
|
|
79
|
+
scope: (config.scopes || ['openid', 'profile', 'email']).join(' '),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Enable access token fetching if needed
|
|
83
|
+
if (config.exposeAccessToken && config.audience) {
|
|
84
|
+
authConfig.afterCallback = (_req, _res, session) => {
|
|
85
|
+
// Access token is automatically stored in session
|
|
86
|
+
return session;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
authMiddleware = auth(authConfig);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
initializationError =
|
|
93
|
+
error instanceof Error ? error : new Error('Failed to initialize Auth0');
|
|
94
|
+
console.error('[Auth0Adapter] Initialization error:', error);
|
|
95
|
+
return res.status(500).json({
|
|
96
|
+
error: 'Auth Configuration Error',
|
|
97
|
+
message: 'Auth0 is not properly configured. Install express-openid-connect package.',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Apply the Auth0 middleware
|
|
102
|
+
authMiddleware(req, res, next);
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
isAuthenticated(req) {
|
|
106
|
+
const oidc = req.oidc;
|
|
107
|
+
if (!oidc?.isAuthenticated()) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Check domain whitelist if configured
|
|
111
|
+
if (config.allowedDomains && config.allowedDomains.length > 0) {
|
|
112
|
+
const email = oidc.user?.email;
|
|
113
|
+
if (!email)
|
|
114
|
+
return false;
|
|
115
|
+
const domain = email.split('@')[1];
|
|
116
|
+
if (!config.allowedDomains.includes(domain) && !config.allowedDomains.includes(`@${domain}`)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Check role whitelist if configured
|
|
121
|
+
if (config.allowedRoles && config.allowedRoles.length > 0) {
|
|
122
|
+
const userRoles = extractUserRoles(req, config.domain);
|
|
123
|
+
const hasRole = config.allowedRoles.some((role) => userRoles.includes(role));
|
|
124
|
+
if (!hasRole) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
},
|
|
130
|
+
getUser(req) {
|
|
131
|
+
const oidc = req.oidc;
|
|
132
|
+
if (!adapter.isAuthenticated(req)) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const user = oidc.user;
|
|
136
|
+
if (!user)
|
|
137
|
+
return null;
|
|
138
|
+
return {
|
|
139
|
+
id: user.sub,
|
|
140
|
+
email: user.email,
|
|
141
|
+
name: user.name || user.nickname,
|
|
142
|
+
picture: user.picture,
|
|
143
|
+
emailVerified: user.email_verified,
|
|
144
|
+
roles: extractUserRoles(req, config.domain),
|
|
145
|
+
raw: user,
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
hasRoles(req, roles) {
|
|
149
|
+
const userRoles = extractUserRoles(req, config.domain);
|
|
150
|
+
return roles.every((role) => userRoles.includes(role));
|
|
151
|
+
},
|
|
152
|
+
getAccessToken(req) {
|
|
153
|
+
if (!config.exposeAccessToken) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
const oidc = req.oidc;
|
|
157
|
+
return oidc?.accessToken?.access_token || null;
|
|
158
|
+
},
|
|
159
|
+
onUnauthorized(req, res) {
|
|
160
|
+
// Check if it's an API request
|
|
161
|
+
const isApiRequest = req.headers.accept?.includes('application/json') || req.path.startsWith('/api/');
|
|
162
|
+
if (isApiRequest) {
|
|
163
|
+
res.status(401).json({
|
|
164
|
+
error: 'Unauthorized',
|
|
165
|
+
message: 'Authentication required',
|
|
166
|
+
loginUrl: config.routes?.login || '/login',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// Redirect to login for browser requests
|
|
171
|
+
const loginPath = config.routes?.login || '/login';
|
|
172
|
+
const returnTo = encodeURIComponent(req.originalUrl);
|
|
173
|
+
res.redirect(`${loginPath}?returnTo=${returnTo}`);
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
return adapter;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=auth0-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth0-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/auth0-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic Auth Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides HTTP Basic authentication for simple use cases.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuthAdapter, BasicAdapterConfig } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a Basic authentication adapter
|
|
11
|
+
*/
|
|
12
|
+
export declare function basicAdapter(config: BasicAdapterConfig): AuthAdapter;
|
|
13
|
+
//# sourceMappingURL=basic-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/basic-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,WAAW,CA8CpE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic Auth Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides HTTP Basic authentication for simple use cases.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create a Basic authentication adapter
|
|
10
|
+
*/
|
|
11
|
+
export function basicAdapter(config) {
|
|
12
|
+
const expectedAuth = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString('base64')}`;
|
|
13
|
+
const realm = config.realm || 'Protected';
|
|
14
|
+
// Create a static user for basic auth
|
|
15
|
+
const staticUser = {
|
|
16
|
+
id: 'basic-auth-user',
|
|
17
|
+
email: `${config.username}@localhost`,
|
|
18
|
+
name: config.username,
|
|
19
|
+
roles: ['admin'], // Basic auth users typically have full access
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
name: 'basic',
|
|
23
|
+
initialize() {
|
|
24
|
+
// Basic auth doesn't need initialization middleware
|
|
25
|
+
// Just return a pass-through middleware
|
|
26
|
+
return (_req, _res, next) => next();
|
|
27
|
+
},
|
|
28
|
+
isAuthenticated(req) {
|
|
29
|
+
const authHeader = req.headers.authorization;
|
|
30
|
+
return authHeader === expectedAuth;
|
|
31
|
+
},
|
|
32
|
+
getUser(req) {
|
|
33
|
+
if (!this.isAuthenticated(req)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return staticUser;
|
|
37
|
+
},
|
|
38
|
+
hasRoles(_req, roles) {
|
|
39
|
+
// Basic auth user has 'admin' role
|
|
40
|
+
return roles.every((role) => staticUser.roles?.includes(role));
|
|
41
|
+
},
|
|
42
|
+
onUnauthorized(_req, res) {
|
|
43
|
+
res.setHeader('WWW-Authenticate', `Basic realm="${realm}"`);
|
|
44
|
+
res.status(401).json({
|
|
45
|
+
error: 'Unauthorized',
|
|
46
|
+
message: 'Authentication required.',
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=basic-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/basic-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,YAAY,GAAG,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC;IAE1C,sCAAsC;IACtC,MAAM,UAAU,GAAsB;QACpC,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,YAAY;QACrC,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,8CAA8C;KACjE,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,OAAO;QAEb,UAAU;YACR,oDAAoD;YACpD,wCAAwC;YACxC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAED,eAAe,CAAC,GAAY;YAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;YAC7C,OAAO,UAAU,KAAK,YAAY,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,GAAY;YAClB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,QAAQ,CAAC,IAAa,EAAE,KAAe;YACrC,mCAAmC;YACnC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,cAAc,CAAC,IAAa,EAAE,GAAa;YACzC,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,KAAK,GAAG,CAAC,CAAC;YAC5D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Adapters Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { auth0Adapter } from './auth0-adapter.js';
|
|
7
|
+
export { basicAdapter } from './basic-adapter.js';
|
|
8
|
+
export { supabaseAdapter } from './supabase-adapter.js';
|
|
9
|
+
export { supertokensAdapter } from './supertokens-adapter.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Adapters Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { auth0Adapter } from './auth0-adapter.js';
|
|
7
|
+
export { basicAdapter } from './basic-adapter.js';
|
|
8
|
+
export { supabaseAdapter } from './supabase-adapter.js';
|
|
9
|
+
export { supertokensAdapter } from './supertokens-adapter.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Auth Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides Supabase authentication using JWT validation.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuthAdapter, SupabaseAdapterConfig } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a Supabase authentication adapter
|
|
11
|
+
*/
|
|
12
|
+
export declare function supabaseAdapter(config: SupabaseAdapterConfig): AuthAdapter;
|
|
13
|
+
//# sourceMappingURL=supabase-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supabase-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAqB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAsBzF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,WAAW,CAkH1E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Auth Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides Supabase authentication using JWT validation.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create a Supabase authentication adapter
|
|
10
|
+
*/
|
|
11
|
+
export function supabaseAdapter(config) {
|
|
12
|
+
// Cache for validated users (short TTL to avoid stale data)
|
|
13
|
+
const userCache = new Map();
|
|
14
|
+
const CACHE_TTL = 60 * 1000; // 1 minute
|
|
15
|
+
return {
|
|
16
|
+
name: 'supabase',
|
|
17
|
+
initialize() {
|
|
18
|
+
// Supabase validation happens per-request, no initialization needed
|
|
19
|
+
return (_req, _res, next) => next();
|
|
20
|
+
},
|
|
21
|
+
isAuthenticated(req) {
|
|
22
|
+
// Check if we already validated this request
|
|
23
|
+
if (req._supabaseUser) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const authHeader = req.headers.authorization;
|
|
27
|
+
return !!authHeader && authHeader.startsWith('Bearer ');
|
|
28
|
+
},
|
|
29
|
+
async getUser(req) {
|
|
30
|
+
// Return cached user if available
|
|
31
|
+
if (req._supabaseUser) {
|
|
32
|
+
return req._supabaseUser;
|
|
33
|
+
}
|
|
34
|
+
const authHeader = req.headers.authorization;
|
|
35
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const token = authHeader.substring(7);
|
|
39
|
+
// Check token cache
|
|
40
|
+
const cached = userCache.get(token);
|
|
41
|
+
if (cached && cached.expires > Date.now()) {
|
|
42
|
+
req._supabaseUser = cached.user;
|
|
43
|
+
return cached.user;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Validate the JWT with Supabase
|
|
47
|
+
const response = await fetch(`${config.url}/auth/v1/user`, {
|
|
48
|
+
headers: {
|
|
49
|
+
Authorization: `Bearer ${token}`,
|
|
50
|
+
apikey: config.anonKey,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const supabaseUser = (await response.json());
|
|
57
|
+
const user = {
|
|
58
|
+
id: supabaseUser.id,
|
|
59
|
+
email: supabaseUser.email,
|
|
60
|
+
name: supabaseUser.user_metadata?.full_name || supabaseUser.user_metadata?.name,
|
|
61
|
+
picture: supabaseUser.user_metadata?.avatar_url,
|
|
62
|
+
emailVerified: !!supabaseUser.email_confirmed_at,
|
|
63
|
+
roles: supabaseUser.app_metadata?.roles || [],
|
|
64
|
+
raw: supabaseUser,
|
|
65
|
+
};
|
|
66
|
+
// Cache the validated user
|
|
67
|
+
userCache.set(token, { user, expires: Date.now() + CACHE_TTL });
|
|
68
|
+
req._supabaseUser = user;
|
|
69
|
+
// Cleanup old cache entries periodically
|
|
70
|
+
if (userCache.size > 1000) {
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
for (const [key, value] of userCache) {
|
|
73
|
+
if (value.expires < now) {
|
|
74
|
+
userCache.delete(key);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return user;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('[SupabaseAdapter] Token validation error:', error);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
hasRoles(req, roles) {
|
|
86
|
+
const user = req._supabaseUser;
|
|
87
|
+
if (!user?.roles)
|
|
88
|
+
return false;
|
|
89
|
+
return roles.every((role) => user.roles?.includes(role));
|
|
90
|
+
},
|
|
91
|
+
getAccessToken(req) {
|
|
92
|
+
const authHeader = req.headers.authorization;
|
|
93
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return authHeader.substring(7);
|
|
97
|
+
},
|
|
98
|
+
onUnauthorized(_req, res) {
|
|
99
|
+
res.status(401).json({
|
|
100
|
+
error: 'Unauthorized',
|
|
101
|
+
message: 'Missing or invalid authorization header. Expected: Bearer <token>',
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
async shutdown() {
|
|
105
|
+
userCache.clear();
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=supabase-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supabase-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supertokens Auth Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides Supertokens authentication using EmailPassword and ThirdParty recipes.
|
|
5
|
+
* Supports email/password and social logins (Google, Apple, GitHub).
|
|
6
|
+
*
|
|
7
|
+
* Note: Requires supertokens-node v20+
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
|
+
*/
|
|
11
|
+
import type { AuthAdapter, SupertokensAdapterConfig } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create a Supertokens authentication adapter
|
|
14
|
+
*
|
|
15
|
+
* Uses EmailPassword and ThirdParty recipes (Supertokens v20+)
|
|
16
|
+
*/
|
|
17
|
+
export declare function supertokensAdapter(config: SupertokensAdapterConfig): AuthAdapter;
|
|
18
|
+
//# sourceMappingURL=supertokens-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supertokens-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supertokens-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAqB,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAc5F;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,WAAW,CAsShF"}
|