@qwickapps/server 1.1.9 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +318 -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 +99 -60
- 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 +683 -315
- 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 +271 -0
- package/dist/core/plugin-registry.d.ts.map +1 -0
- package/dist/core/plugin-registry.js +326 -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 +9 -0
- package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/index.js +9 -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/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/index.d.ts +12 -0
- package/dist/plugins/auth/index.d.ts.map +1 -0
- package/dist/plugins/auth/index.js +13 -0
- package/dist/plugins/auth/index.js.map +1 -0
- package/dist/plugins/auth/types.d.ts +148 -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 +96 -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 +8 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +8 -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 +47 -29
- package/dist/plugins/postgres-plugin.test.js.map +1 -1
- 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 +189 -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 +39 -0
- package/dist/plugins/users/users-plugin.d.ts.map +1 -0
- package/dist/plugins/users/users-plugin.js +242 -0
- package/dist/plugins/users/users-plugin.js.map +1 -0
- package/dist-ui/assets/index-Bsp2ntcw.js +465 -0
- package/dist-ui/assets/index-Bsp2ntcw.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +232 -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 +44 -0
- package/dist-ui-lib/dashboard/builtInWidgets.d.ts +19 -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 +6441 -0
- package/dist-ui-lib/index.js.map +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/SystemPage.d.ts +1 -0
- package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
- package/package.json +18 -6
- package/src/core/control-panel.ts +122 -68
- package/src/core/gateway.ts +870 -399
- package/src/core/index.ts +21 -2
- package/src/core/plugin-registry.ts +653 -0
- package/src/core/types.ts +31 -37
- package/src/index.ts +118 -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 +9 -0
- package/src/plugins/auth/adapters/supabase-adapter.ts +141 -0
- package/src/plugins/auth/auth-plugin.test.ts +176 -0
- package/src/plugins/auth/auth-plugin.ts +303 -0
- package/src/plugins/auth/index.ts +33 -0
- package/src/plugins/auth/types.ts +165 -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 +105 -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 +106 -4
- package/src/plugins/logs-plugin.ts +28 -14
- package/src/plugins/postgres-plugin.test.ts +49 -29
- package/src/plugins/postgres-plugin.ts +11 -9
- package/src/plugins/users/index.ts +35 -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 +209 -0
- package/src/plugins/users/users-plugin.ts +281 -0
- package/ui/src/App.tsx +185 -31
- package/ui/src/api/controlPanelApi.ts +354 -1
- package/ui/src/components/ControlPanelApp.tsx +209 -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 +115 -0
- package/ui/src/dashboard/WidgetComponentRegistry.tsx +116 -0
- package/ui/src/dashboard/builtInWidgets.tsx +29 -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/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/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 +51 -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,9 @@
|
|
|
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
|
+
//# 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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
//# 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"}
|
|
@@ -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;AAEzF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,WAAW,CA8H1E"}
|
|
@@ -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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin
|
|
3
|
+
*
|
|
4
|
+
* Pluggable authentication plugin for @qwickapps/server.
|
|
5
|
+
* Supports multiple adapters (Auth0, Supabase, Basic) with fallback chain.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
import type { Request, RequestHandler } from 'express';
|
|
10
|
+
import type { Plugin } from '../../core/plugin-registry.js';
|
|
11
|
+
import type { AuthPluginConfig, AuthenticatedUser } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create the Auth plugin
|
|
14
|
+
*/
|
|
15
|
+
export declare function createAuthPlugin(config: AuthPluginConfig): Plugin;
|
|
16
|
+
/**
|
|
17
|
+
* Check if the current request is authenticated
|
|
18
|
+
*/
|
|
19
|
+
export declare function isAuthenticated(req: Request): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Get the authenticated user from the request
|
|
22
|
+
*/
|
|
23
|
+
export declare function getAuthenticatedUser(req: Request): AuthenticatedUser | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get the access token from the request
|
|
26
|
+
*/
|
|
27
|
+
export declare function getAccessToken(req: Request): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Middleware to require authentication
|
|
30
|
+
*/
|
|
31
|
+
export declare function requireAuth(): RequestHandler;
|
|
32
|
+
/**
|
|
33
|
+
* Middleware to require specific roles
|
|
34
|
+
*/
|
|
35
|
+
export declare function requireRoles(...roles: string[]): RequestHandler;
|
|
36
|
+
/**
|
|
37
|
+
* Middleware to require any of the specified roles
|
|
38
|
+
*/
|
|
39
|
+
export declare function requireAnyRole(...roles: string[]): RequestHandler;
|
|
40
|
+
//# sourceMappingURL=auth-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/auth-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAA0B,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EACV,gBAAgB,EAEhB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAsLjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAG3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAG1D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAU5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAuB/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAuBjE"}
|