@lenne.tech/nest-server 11.6.1 → 11.7.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/dist/config.env.js +132 -0
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/decorators/graphql-populate.decorator.d.ts +2 -2
- package/dist/core/common/decorators/restricted.decorator.d.ts +1 -0
- package/dist/core/common/decorators/restricted.decorator.js +1 -1
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +9 -9
- package/dist/core/common/helpers/filter.helper.js +2 -4
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/gridfs.helper.js +3 -3
- package/dist/core/common/helpers/gridfs.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.d.ts +1 -0
- package/dist/core/common/helpers/input.helper.js +1 -1
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +51 -0
- package/dist/core/common/services/crud.service.d.ts +16 -16
- package/dist/core/common/services/crud.service.js +1 -1
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/modules/auth/auth-guard-strategy.enum.d.ts +1 -0
- package/dist/core/modules/auth/auth-guard-strategy.enum.js +1 -0
- package/dist/core/modules/auth/auth-guard-strategy.enum.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.js +11 -5
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/auth/tokens.decorator.d.ts +1 -1
- package/dist/core/modules/better-auth/better-auth-auth.model.d.ts +9 -0
- package/dist/core/modules/better-auth/better-auth-auth.model.js +63 -0
- package/dist/core/modules/better-auth/better-auth-auth.model.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth-models.d.ts +43 -0
- package/dist/core/modules/better-auth/better-auth-models.js +181 -0
- package/dist/core/modules/better-auth/better-auth-models.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth-rate-limit.middleware.d.ts +12 -0
- package/dist/core/modules/better-auth/better-auth-rate-limit.middleware.js +70 -0
- package/dist/core/modules/better-auth/better-auth-rate-limit.middleware.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth-rate-limiter.service.d.ts +32 -0
- package/dist/core/modules/better-auth/better-auth-rate-limiter.service.js +173 -0
- package/dist/core/modules/better-auth/better-auth-rate-limiter.service.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth-user.mapper.d.ts +43 -0
- package/dist/core/modules/better-auth/better-auth-user.mapper.js +159 -0
- package/dist/core/modules/better-auth/better-auth-user.mapper.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth.config.d.ts +9 -0
- package/dist/core/modules/better-auth/better-auth.config.js +254 -0
- package/dist/core/modules/better-auth/better-auth.config.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth.middleware.d.ts +20 -0
- package/dist/core/modules/better-auth/better-auth.middleware.js +79 -0
- package/dist/core/modules/better-auth/better-auth.middleware.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth.module.d.ts +38 -0
- package/dist/core/modules/better-auth/better-auth.module.js +253 -0
- package/dist/core/modules/better-auth/better-auth.module.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth.resolver.d.ts +45 -0
- package/dist/core/modules/better-auth/better-auth.resolver.js +221 -0
- package/dist/core/modules/better-auth/better-auth.resolver.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth.service.d.ts +37 -0
- package/dist/core/modules/better-auth/better-auth.service.js +148 -0
- package/dist/core/modules/better-auth/better-auth.service.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth.types.d.ts +39 -0
- package/dist/core/modules/better-auth/better-auth.types.js +26 -0
- package/dist/core/modules/better-auth/better-auth.types.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth.controller.d.ts +66 -0
- package/dist/core/modules/better-auth/core-better-auth.controller.js +491 -0
- package/dist/core/modules/better-auth/core-better-auth.controller.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth.resolver.d.ts +59 -0
- package/dist/core/modules/better-auth/core-better-auth.resolver.js +538 -0
- package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -0
- package/dist/core/modules/better-auth/index.d.ts +13 -0
- package/dist/core/modules/better-auth/index.js +30 -0
- package/dist/core/modules/better-auth/index.js.map +1 -0
- package/dist/core/modules/user/core-user.model.d.ts +2 -0
- package/dist/core/modules/user/core-user.model.js +21 -0
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core.module.js +7 -0
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server/modules/better-auth/better-auth.controller.d.ts +10 -0
- package/dist/server/modules/better-auth/better-auth.controller.js +36 -0
- package/dist/server/modules/better-auth/better-auth.controller.js.map +1 -0
- package/dist/server/modules/better-auth/better-auth.module.d.ts +9 -0
- package/dist/server/modules/better-auth/better-auth.module.js +44 -0
- package/dist/server/modules/better-auth/better-auth.module.js.map +1 -0
- package/dist/server/modules/better-auth/better-auth.resolver.d.ts +45 -0
- package/dist/server/modules/better-auth/better-auth.resolver.js +221 -0
- package/dist/server/modules/better-auth/better-auth.resolver.js.map +1 -0
- package/dist/server/modules/file/file-info.model.d.ts +71 -3
- package/dist/server/modules/user/user.model.d.ts +169 -3
- package/dist/server/server.module.js +6 -1
- package/dist/server/server.module.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +21 -22
- package/src/config.env.ts +139 -1
- package/src/core/common/decorators/restricted.decorator.ts +2 -2
- package/src/core/common/helpers/filter.helper.ts +15 -17
- package/src/core/common/helpers/gridfs.helper.ts +5 -5
- package/src/core/common/helpers/input.helper.ts +2 -2
- package/src/core/common/interfaces/server-options.interface.ts +377 -20
- package/src/core/common/services/crud.service.ts +22 -22
- package/src/core/modules/auth/auth-guard-strategy.enum.ts +1 -0
- package/src/core/modules/auth/guards/auth.guard.ts +20 -6
- package/src/core/modules/better-auth/README.md +1422 -0
- package/src/core/modules/better-auth/better-auth-auth.model.ts +69 -0
- package/src/core/modules/better-auth/better-auth-models.ts +140 -0
- package/src/core/modules/better-auth/better-auth-rate-limit.middleware.ts +113 -0
- package/src/core/modules/better-auth/better-auth-rate-limiter.service.ts +326 -0
- package/src/core/modules/better-auth/better-auth-user.mapper.ts +269 -0
- package/src/core/modules/better-auth/better-auth.config.ts +488 -0
- package/src/core/modules/better-auth/better-auth.middleware.ts +111 -0
- package/src/core/modules/better-auth/better-auth.module.ts +474 -0
- package/src/core/modules/better-auth/better-auth.resolver.ts +213 -0
- package/src/core/modules/better-auth/better-auth.service.ts +314 -0
- package/src/core/modules/better-auth/better-auth.types.ts +90 -0
- package/src/core/modules/better-auth/core-better-auth.controller.ts +605 -0
- package/src/core/modules/better-auth/core-better-auth.resolver.ts +705 -0
- package/src/core/modules/better-auth/index.ts +32 -0
- package/src/core/modules/user/core-user.model.ts +29 -0
- package/src/core.module.ts +13 -0
- package/src/index.ts +6 -0
- package/src/server/modules/better-auth/better-auth.controller.ts +41 -0
- package/src/server/modules/better-auth/better-auth.module.ts +88 -0
- package/src/server/modules/better-auth/better-auth.resolver.ts +201 -0
- package/src/server/server.module.ts +10 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBetterAuthInstance = createBetterAuthInstance;
|
|
4
|
+
const passkey_1 = require("@better-auth/passkey");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const better_auth_1 = require("better-auth");
|
|
7
|
+
const mongodb_1 = require("better-auth/adapters/mongodb");
|
|
8
|
+
const plugins_1 = require("better-auth/plugins");
|
|
9
|
+
const crypto = require("crypto");
|
|
10
|
+
function generateSecureSecret() {
|
|
11
|
+
return crypto.randomBytes(32).toString('base64');
|
|
12
|
+
}
|
|
13
|
+
let cachedAutoGeneratedSecret = null;
|
|
14
|
+
function createBetterAuthInstance(options) {
|
|
15
|
+
const logger = new common_1.Logger('BetterAuthConfig');
|
|
16
|
+
const { config, db, fallbackSecrets } = options;
|
|
17
|
+
if (config?.enabled === false) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const validation = validateConfig(config, fallbackSecrets);
|
|
21
|
+
for (const warning of validation.warnings) {
|
|
22
|
+
logger.warn(warning);
|
|
23
|
+
}
|
|
24
|
+
if (!validation.valid) {
|
|
25
|
+
throw new Error(`BetterAuth configuration invalid: ${validation.errors.join('; ')}`);
|
|
26
|
+
}
|
|
27
|
+
const plugins = buildPlugins(config);
|
|
28
|
+
const socialProviders = buildSocialProviders(config);
|
|
29
|
+
const trustedOrigins = buildTrustedOrigins(config);
|
|
30
|
+
const additionalFields = buildUserFields(config);
|
|
31
|
+
const betterAuthConfig = {
|
|
32
|
+
basePath: config.basePath || '/iam',
|
|
33
|
+
baseURL: config.baseUrl || 'http://localhost:3000',
|
|
34
|
+
database: (0, mongodb_1.mongodbAdapter)(db),
|
|
35
|
+
emailAndPassword: {
|
|
36
|
+
enabled: config.emailAndPassword?.enabled !== false,
|
|
37
|
+
},
|
|
38
|
+
plugins,
|
|
39
|
+
secret: config.secret,
|
|
40
|
+
socialProviders,
|
|
41
|
+
trustedOrigins,
|
|
42
|
+
user: {
|
|
43
|
+
additionalFields,
|
|
44
|
+
modelName: 'users',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
const finalConfig = config.options ? { ...betterAuthConfig, ...config.options } : betterAuthConfig;
|
|
48
|
+
return (0, better_auth_1.betterAuth)(finalConfig);
|
|
49
|
+
}
|
|
50
|
+
function buildPlugins(config) {
|
|
51
|
+
const plugins = [];
|
|
52
|
+
if (config.jwt && config.jwt.enabled !== false) {
|
|
53
|
+
plugins.push((0, plugins_1.jwt)({
|
|
54
|
+
jwt: {
|
|
55
|
+
expirationTime: config.jwt.expiresIn || '15m',
|
|
56
|
+
},
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
if (config.twoFactor && config.twoFactor.enabled !== false) {
|
|
60
|
+
plugins.push((0, plugins_1.twoFactor)({
|
|
61
|
+
issuer: config.twoFactor.appName || 'Nest Server',
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
if (config.passkey && config.passkey.enabled !== false) {
|
|
65
|
+
plugins.push((0, passkey_1.passkey)({
|
|
66
|
+
origin: config.passkey.origin || 'http://localhost:3000',
|
|
67
|
+
rpID: config.passkey.rpId || 'localhost',
|
|
68
|
+
rpName: config.passkey.rpName || 'Nest Server',
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
if (config.plugins?.length) {
|
|
72
|
+
plugins.push(...config.plugins);
|
|
73
|
+
}
|
|
74
|
+
return plugins;
|
|
75
|
+
}
|
|
76
|
+
function buildSocialProviders(config) {
|
|
77
|
+
const socialProvidersConfig = {};
|
|
78
|
+
if (config.socialProviders) {
|
|
79
|
+
for (const [name, provider] of Object.entries(config.socialProviders)) {
|
|
80
|
+
if (provider?.clientId && provider?.clientSecret && provider?.enabled !== false) {
|
|
81
|
+
socialProvidersConfig[name] = {
|
|
82
|
+
clientId: provider.clientId,
|
|
83
|
+
clientSecret: provider.clientSecret,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return socialProvidersConfig;
|
|
89
|
+
}
|
|
90
|
+
function buildTrustedOrigins(config) {
|
|
91
|
+
if (config.trustedOrigins?.length) {
|
|
92
|
+
return config.trustedOrigins;
|
|
93
|
+
}
|
|
94
|
+
if (config.baseUrl) {
|
|
95
|
+
return [config.baseUrl];
|
|
96
|
+
}
|
|
97
|
+
return ['http://localhost:3000'];
|
|
98
|
+
}
|
|
99
|
+
function buildUserFields(config) {
|
|
100
|
+
const coreFields = {
|
|
101
|
+
firstName: {
|
|
102
|
+
defaultValue: null,
|
|
103
|
+
fieldName: 'firstName',
|
|
104
|
+
type: 'string',
|
|
105
|
+
},
|
|
106
|
+
iamId: {
|
|
107
|
+
defaultValue: null,
|
|
108
|
+
fieldName: 'iamId',
|
|
109
|
+
type: 'string',
|
|
110
|
+
},
|
|
111
|
+
lastName: {
|
|
112
|
+
defaultValue: null,
|
|
113
|
+
fieldName: 'lastName',
|
|
114
|
+
type: 'string',
|
|
115
|
+
},
|
|
116
|
+
roles: {
|
|
117
|
+
defaultValue: [],
|
|
118
|
+
fieldName: 'roles',
|
|
119
|
+
type: 'string[]',
|
|
120
|
+
},
|
|
121
|
+
twoFactorEnabled: {
|
|
122
|
+
defaultValue: false,
|
|
123
|
+
fieldName: 'twoFactorEnabled',
|
|
124
|
+
type: 'boolean',
|
|
125
|
+
},
|
|
126
|
+
verified: {
|
|
127
|
+
defaultValue: false,
|
|
128
|
+
fieldName: 'verified',
|
|
129
|
+
type: 'boolean',
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
if (config.additionalUserFields) {
|
|
133
|
+
for (const [key, field] of Object.entries(config.additionalUserFields)) {
|
|
134
|
+
coreFields[key] = {
|
|
135
|
+
defaultValue: field.defaultValue,
|
|
136
|
+
fieldName: field.fieldName || key,
|
|
137
|
+
required: field.required,
|
|
138
|
+
type: field.type,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return coreFields;
|
|
143
|
+
}
|
|
144
|
+
function getAutoGeneratedSecret() {
|
|
145
|
+
if (!cachedAutoGeneratedSecret) {
|
|
146
|
+
cachedAutoGeneratedSecret = generateSecureSecret();
|
|
147
|
+
}
|
|
148
|
+
return cachedAutoGeneratedSecret;
|
|
149
|
+
}
|
|
150
|
+
function isValidSecretLength(secret) {
|
|
151
|
+
return secret && secret.length >= 32;
|
|
152
|
+
}
|
|
153
|
+
function isValidUrl(url) {
|
|
154
|
+
try {
|
|
155
|
+
new URL(url);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function validateConfig(config, fallbackSecrets) {
|
|
163
|
+
const errors = [];
|
|
164
|
+
const warnings = [];
|
|
165
|
+
let secretSource = 'explicit';
|
|
166
|
+
if (!config.secret || config.secret.trim() === '') {
|
|
167
|
+
const validFallback = fallbackSecrets?.find((secret) => secret && isValidSecretLength(secret));
|
|
168
|
+
if (validFallback) {
|
|
169
|
+
config.secret = validFallback;
|
|
170
|
+
secretSource = 'fallback';
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
config.secret = getAutoGeneratedSecret();
|
|
174
|
+
secretSource = 'auto-generated';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const secretValidation = validateSecret(config.secret);
|
|
178
|
+
if (!secretValidation.valid) {
|
|
179
|
+
errors.push(secretValidation.message);
|
|
180
|
+
}
|
|
181
|
+
else if (secretValidation.message) {
|
|
182
|
+
warnings.push(secretValidation.message);
|
|
183
|
+
}
|
|
184
|
+
switch (secretSource) {
|
|
185
|
+
case 'auto-generated':
|
|
186
|
+
warnings.push('⚠️ BETTER_AUTH: No secret configured - using auto-generated secret.');
|
|
187
|
+
warnings.push('⚠️ CONSEQUENCE: All user sessions will be invalidated on server restart!');
|
|
188
|
+
warnings.push('💡 FOR PRODUCTION: Set betterAuth.secret in config or provide a valid fallback secret (min 32 chars).');
|
|
189
|
+
warnings.push("💡 Generate with: node -e \"console.log(require('crypto').randomBytes(32).toString('base64'))\"");
|
|
190
|
+
break;
|
|
191
|
+
case 'fallback':
|
|
192
|
+
warnings.push('💡 BETTER_AUTH: Using fallback secret (backwards compatible). Consider setting betterAuth.secret explicitly.');
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
if (config.baseUrl && !isValidUrl(config.baseUrl)) {
|
|
196
|
+
errors.push(`Invalid baseUrl format: ${config.baseUrl}`);
|
|
197
|
+
}
|
|
198
|
+
if (config.trustedOrigins) {
|
|
199
|
+
for (const origin of config.trustedOrigins) {
|
|
200
|
+
if (!isValidUrl(origin)) {
|
|
201
|
+
errors.push(`Invalid trustedOrigin format: ${origin}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (config.passkey?.enabled && config.passkey.origin && !isValidUrl(config.passkey.origin)) {
|
|
206
|
+
errors.push(`Invalid passkey origin format: ${config.passkey.origin}`);
|
|
207
|
+
}
|
|
208
|
+
if (config.socialProviders) {
|
|
209
|
+
for (const [name, provider] of Object.entries(config.socialProviders)) {
|
|
210
|
+
if (provider && provider.enabled !== false) {
|
|
211
|
+
const hasClientId = !!provider.clientId;
|
|
212
|
+
const hasClientSecret = !!provider.clientSecret;
|
|
213
|
+
if (hasClientId && hasClientSecret) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
else if (hasClientId || hasClientSecret) {
|
|
217
|
+
if (!hasClientId) {
|
|
218
|
+
errors.push(`Social provider '${name}' is missing clientId`);
|
|
219
|
+
}
|
|
220
|
+
if (!hasClientSecret) {
|
|
221
|
+
errors.push(`Social provider '${name}' is missing clientSecret`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
warnings.push(`Social provider '${name}' is configured but missing both clientId and clientSecret. ` +
|
|
226
|
+
`Set 'enabled: false' to disable it explicitly, or provide credentials to enable it.`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
errors,
|
|
233
|
+
valid: errors.length === 0,
|
|
234
|
+
warnings,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function validateSecret(secret) {
|
|
238
|
+
if (!secret || secret.length < 32) {
|
|
239
|
+
return { message: 'Secret must be at least 32 characters long', valid: false };
|
|
240
|
+
}
|
|
241
|
+
const hasLowercase = /[a-z]/.test(secret);
|
|
242
|
+
const hasUppercase = /[A-Z]/.test(secret);
|
|
243
|
+
const hasNumbers = /[0-9]/.test(secret);
|
|
244
|
+
const hasSpecial = /[^a-zA-Z0-9]/.test(secret);
|
|
245
|
+
const diversityCount = [hasLowercase, hasUppercase, hasNumbers, hasSpecial].filter(Boolean).length;
|
|
246
|
+
if (diversityCount < 2) {
|
|
247
|
+
return {
|
|
248
|
+
message: 'Secret should contain at least 2 different character types (lowercase, uppercase, numbers, special)',
|
|
249
|
+
valid: true,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return { valid: true };
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=better-auth.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-auth.config.js","sourceRoot":"","sources":["../../../../src/core/modules/better-auth/better-auth.config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NestMiddleware } from '@nestjs/common';
|
|
2
|
+
import { NextFunction, Request, Response } from 'express';
|
|
3
|
+
import { BetterAuthSessionUser, BetterAuthUserMapper, MappedUser } from './better-auth-user.mapper';
|
|
4
|
+
import { BetterAuthService } from './better-auth.service';
|
|
5
|
+
export interface BetterAuthRequest extends Request {
|
|
6
|
+
betterAuthSession?: {
|
|
7
|
+
session: any;
|
|
8
|
+
user: BetterAuthSessionUser;
|
|
9
|
+
};
|
|
10
|
+
betterAuthUser?: BetterAuthSessionUser;
|
|
11
|
+
user?: MappedUser | Request['user'];
|
|
12
|
+
}
|
|
13
|
+
export declare class BetterAuthMiddleware implements NestMiddleware {
|
|
14
|
+
private readonly betterAuthService;
|
|
15
|
+
private readonly userMapper;
|
|
16
|
+
private readonly logger;
|
|
17
|
+
constructor(betterAuthService: BetterAuthService, userMapper: BetterAuthUserMapper);
|
|
18
|
+
use(req: BetterAuthRequest, _res: Response, next: NextFunction): Promise<void>;
|
|
19
|
+
private getSession;
|
|
20
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var BetterAuthMiddleware_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.BetterAuthMiddleware = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const better_auth_user_mapper_1 = require("./better-auth-user.mapper");
|
|
16
|
+
const better_auth_service_1 = require("./better-auth.service");
|
|
17
|
+
let BetterAuthMiddleware = BetterAuthMiddleware_1 = class BetterAuthMiddleware {
|
|
18
|
+
constructor(betterAuthService, userMapper) {
|
|
19
|
+
this.betterAuthService = betterAuthService;
|
|
20
|
+
this.userMapper = userMapper;
|
|
21
|
+
this.logger = new common_1.Logger(BetterAuthMiddleware_1.name);
|
|
22
|
+
}
|
|
23
|
+
async use(req, _res, next) {
|
|
24
|
+
if (!this.betterAuthService.isEnabled()) {
|
|
25
|
+
return next();
|
|
26
|
+
}
|
|
27
|
+
if (req.user) {
|
|
28
|
+
return next();
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const session = await this.getSession(req);
|
|
32
|
+
if (session?.user) {
|
|
33
|
+
req.betterAuthSession = session;
|
|
34
|
+
req.betterAuthUser = session.user;
|
|
35
|
+
const mappedUser = await this.userMapper.mapSessionUser(session.user);
|
|
36
|
+
if (mappedUser) {
|
|
37
|
+
req.user = mappedUser;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
this.logger.debug(`Session validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
43
|
+
}
|
|
44
|
+
next();
|
|
45
|
+
}
|
|
46
|
+
async getSession(req) {
|
|
47
|
+
const api = this.betterAuthService.getApi();
|
|
48
|
+
if (!api) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const headers = new Headers();
|
|
53
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
54
|
+
if (typeof value === 'string') {
|
|
55
|
+
headers.set(key, value);
|
|
56
|
+
}
|
|
57
|
+
else if (Array.isArray(value)) {
|
|
58
|
+
headers.set(key, value.join(', '));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const response = await api.getSession({ headers });
|
|
62
|
+
if (response && typeof response === 'object' && 'user' in response) {
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
this.logger.debug(`getSession error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.BetterAuthMiddleware = BetterAuthMiddleware;
|
|
74
|
+
exports.BetterAuthMiddleware = BetterAuthMiddleware = BetterAuthMiddleware_1 = __decorate([
|
|
75
|
+
(0, common_1.Injectable)(),
|
|
76
|
+
__metadata("design:paramtypes", [better_auth_service_1.BetterAuthService,
|
|
77
|
+
better_auth_user_mapper_1.BetterAuthUserMapper])
|
|
78
|
+
], BetterAuthMiddleware);
|
|
79
|
+
//# sourceMappingURL=better-auth.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-auth.middleware.js","sourceRoot":"","sources":["../../../../src/core/modules/better-auth/better-auth.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DynamicModule, MiddlewareConsumer, NestModule, OnModuleInit, Type } from '@nestjs/common';
|
|
2
|
+
import { IBetterAuth } from '../../common/interfaces/server-options.interface';
|
|
3
|
+
import { BetterAuthRateLimiter } from './better-auth-rate-limiter.service';
|
|
4
|
+
import { BetterAuthInstance } from './better-auth.config';
|
|
5
|
+
import { BetterAuthService } from './better-auth.service';
|
|
6
|
+
import { CoreBetterAuthController } from './core-better-auth.controller';
|
|
7
|
+
import { CoreBetterAuthResolver } from './core-better-auth.resolver';
|
|
8
|
+
export declare const BETTER_AUTH_INSTANCE = "BETTER_AUTH_INSTANCE";
|
|
9
|
+
export interface BetterAuthModuleOptions {
|
|
10
|
+
config: IBetterAuth;
|
|
11
|
+
controller?: Type<CoreBetterAuthController>;
|
|
12
|
+
fallbackSecrets?: (string | undefined)[];
|
|
13
|
+
resolver?: Type<CoreBetterAuthResolver>;
|
|
14
|
+
}
|
|
15
|
+
export declare class BetterAuthModule implements NestModule, OnModuleInit {
|
|
16
|
+
private readonly betterAuthService?;
|
|
17
|
+
private readonly rateLimiter?;
|
|
18
|
+
private static logger;
|
|
19
|
+
private static authInstance;
|
|
20
|
+
private static initialized;
|
|
21
|
+
private static initLogged;
|
|
22
|
+
private static betterAuthEnabled;
|
|
23
|
+
private static currentConfig;
|
|
24
|
+
private static customController;
|
|
25
|
+
private static customResolver;
|
|
26
|
+
private static getControllerClass;
|
|
27
|
+
private static getResolverClass;
|
|
28
|
+
constructor(betterAuthService?: BetterAuthService, rateLimiter?: BetterAuthRateLimiter);
|
|
29
|
+
onModuleInit(): void;
|
|
30
|
+
configure(consumer: MiddlewareConsumer): void;
|
|
31
|
+
private static waitForMongoConnection;
|
|
32
|
+
static forRoot(options: BetterAuthModuleOptions): DynamicModule;
|
|
33
|
+
static forRootAsync(): DynamicModule;
|
|
34
|
+
static getInstance(): BetterAuthInstance | null;
|
|
35
|
+
static reset(): void;
|
|
36
|
+
private static createDeferredModule;
|
|
37
|
+
private static logEnabledFeatures;
|
|
38
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var BetterAuthModule_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.BetterAuthModule = exports.BETTER_AUTH_INSTANCE = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const mongoose_1 = require("@nestjs/mongoose");
|
|
19
|
+
const mongoose_2 = require("mongoose");
|
|
20
|
+
const config_service_1 = require("../../common/services/config.service");
|
|
21
|
+
const better_auth_rate_limit_middleware_1 = require("./better-auth-rate-limit.middleware");
|
|
22
|
+
const better_auth_rate_limiter_service_1 = require("./better-auth-rate-limiter.service");
|
|
23
|
+
const better_auth_user_mapper_1 = require("./better-auth-user.mapper");
|
|
24
|
+
const better_auth_config_1 = require("./better-auth.config");
|
|
25
|
+
const better_auth_middleware_1 = require("./better-auth.middleware");
|
|
26
|
+
const better_auth_resolver_1 = require("./better-auth.resolver");
|
|
27
|
+
const better_auth_service_1 = require("./better-auth.service");
|
|
28
|
+
const core_better_auth_controller_1 = require("./core-better-auth.controller");
|
|
29
|
+
exports.BETTER_AUTH_INSTANCE = 'BETTER_AUTH_INSTANCE';
|
|
30
|
+
let BetterAuthModule = BetterAuthModule_1 = class BetterAuthModule {
|
|
31
|
+
static getControllerClass() {
|
|
32
|
+
return this.customController || core_better_auth_controller_1.CoreBetterAuthController;
|
|
33
|
+
}
|
|
34
|
+
static getResolverClass() {
|
|
35
|
+
return this.customResolver || better_auth_resolver_1.BetterAuthResolver;
|
|
36
|
+
}
|
|
37
|
+
constructor(betterAuthService, rateLimiter) {
|
|
38
|
+
this.betterAuthService = betterAuthService;
|
|
39
|
+
this.rateLimiter = rateLimiter;
|
|
40
|
+
}
|
|
41
|
+
onModuleInit() {
|
|
42
|
+
if (BetterAuthModule_1.authInstance && !BetterAuthModule_1.initialized) {
|
|
43
|
+
BetterAuthModule_1.initialized = true;
|
|
44
|
+
BetterAuthModule_1.logger.log('BetterAuthModule ready');
|
|
45
|
+
}
|
|
46
|
+
if (this.rateLimiter && BetterAuthModule_1.currentConfig?.rateLimit) {
|
|
47
|
+
this.rateLimiter.configure(BetterAuthModule_1.currentConfig.rateLimit);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
configure(consumer) {
|
|
51
|
+
if (BetterAuthModule_1.betterAuthEnabled && this.betterAuthService?.isEnabled()) {
|
|
52
|
+
const basePath = BetterAuthModule_1.currentConfig?.basePath || '/iam';
|
|
53
|
+
if (BetterAuthModule_1.currentConfig?.rateLimit?.enabled) {
|
|
54
|
+
consumer.apply(better_auth_rate_limit_middleware_1.BetterAuthRateLimitMiddleware).forRoutes(`${basePath}/*path`);
|
|
55
|
+
BetterAuthModule_1.logger.log(`Rate limiting enabled for ${basePath}/*path endpoints`);
|
|
56
|
+
}
|
|
57
|
+
consumer.apply(better_auth_middleware_1.BetterAuthMiddleware).forRoutes('(.*)');
|
|
58
|
+
BetterAuthModule_1.logger.log('BetterAuthMiddleware registered for all routes');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
static async waitForMongoConnection() {
|
|
62
|
+
const maxAttempts = 60;
|
|
63
|
+
const pollInterval = 500;
|
|
64
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
65
|
+
if (mongoose_2.default.connection.readyState === 1 && mongoose_2.default.connection.db) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (mongoose_2.default.connection.readyState === 0) {
|
|
69
|
+
this.logger.debug(`MongoDB not connected (attempt ${attempt + 1}/${maxAttempts})`);
|
|
70
|
+
}
|
|
71
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
72
|
+
}
|
|
73
|
+
throw new Error('MongoDB connection timeout - ensure MongoDB is running and accessible');
|
|
74
|
+
}
|
|
75
|
+
static forRoot(options) {
|
|
76
|
+
const { config, controller, fallbackSecrets, resolver } = options;
|
|
77
|
+
this.currentConfig = config;
|
|
78
|
+
this.customController = controller || null;
|
|
79
|
+
this.customResolver = resolver || null;
|
|
80
|
+
if (config?.enabled === false) {
|
|
81
|
+
this.logger.debug('BetterAuth is explicitly disabled - skipping initialization');
|
|
82
|
+
this.betterAuthEnabled = false;
|
|
83
|
+
return {
|
|
84
|
+
exports: [exports.BETTER_AUTH_INSTANCE, better_auth_service_1.BetterAuthService, better_auth_user_mapper_1.BetterAuthUserMapper, better_auth_rate_limiter_service_1.BetterAuthRateLimiter],
|
|
85
|
+
module: BetterAuthModule_1,
|
|
86
|
+
providers: [
|
|
87
|
+
{
|
|
88
|
+
provide: exports.BETTER_AUTH_INSTANCE,
|
|
89
|
+
useValue: null,
|
|
90
|
+
},
|
|
91
|
+
better_auth_service_1.BetterAuthService,
|
|
92
|
+
better_auth_user_mapper_1.BetterAuthUserMapper,
|
|
93
|
+
better_auth_rate_limiter_service_1.BetterAuthRateLimiter,
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
this.betterAuthEnabled = true;
|
|
98
|
+
return this.createDeferredModule(config, fallbackSecrets);
|
|
99
|
+
}
|
|
100
|
+
static forRootAsync() {
|
|
101
|
+
return {
|
|
102
|
+
controllers: [this.getControllerClass()],
|
|
103
|
+
exports: [exports.BETTER_AUTH_INSTANCE, better_auth_service_1.BetterAuthService, better_auth_user_mapper_1.BetterAuthUserMapper, better_auth_rate_limiter_service_1.BetterAuthRateLimiter],
|
|
104
|
+
imports: [],
|
|
105
|
+
module: BetterAuthModule_1,
|
|
106
|
+
providers: [
|
|
107
|
+
{
|
|
108
|
+
inject: [config_service_1.ConfigService],
|
|
109
|
+
provide: exports.BETTER_AUTH_INSTANCE,
|
|
110
|
+
useFactory: async (configService) => {
|
|
111
|
+
const config = configService.get('betterAuth');
|
|
112
|
+
this.currentConfig = config || null;
|
|
113
|
+
if (config?.enabled === false) {
|
|
114
|
+
this.logger.debug('BetterAuth is explicitly disabled');
|
|
115
|
+
this.betterAuthEnabled = false;
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
this.betterAuthEnabled = true;
|
|
119
|
+
await this.waitForMongoConnection();
|
|
120
|
+
const db = mongoose_2.default.connection.db;
|
|
121
|
+
if (!db) {
|
|
122
|
+
throw new Error('MongoDB database not available');
|
|
123
|
+
}
|
|
124
|
+
const jwtConfig = configService.get('jwt');
|
|
125
|
+
const fallbackSecrets = [jwtConfig?.secret, jwtConfig?.refresh?.secret];
|
|
126
|
+
this.authInstance = (0, better_auth_config_1.createBetterAuthInstance)({ config, db, fallbackSecrets });
|
|
127
|
+
if (this.authInstance) {
|
|
128
|
+
this.logger.log('BetterAuth initialized successfully');
|
|
129
|
+
this.logEnabledFeatures(config);
|
|
130
|
+
}
|
|
131
|
+
return this.authInstance;
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
inject: [exports.BETTER_AUTH_INSTANCE, config_service_1.ConfigService],
|
|
136
|
+
provide: better_auth_service_1.BetterAuthService,
|
|
137
|
+
useFactory: (authInstance, configService) => {
|
|
138
|
+
return new better_auth_service_1.BetterAuthService(authInstance, configService);
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
better_auth_user_mapper_1.BetterAuthUserMapper,
|
|
142
|
+
better_auth_middleware_1.BetterAuthMiddleware,
|
|
143
|
+
better_auth_rate_limiter_service_1.BetterAuthRateLimiter,
|
|
144
|
+
better_auth_rate_limit_middleware_1.BetterAuthRateLimitMiddleware,
|
|
145
|
+
this.getResolverClass(),
|
|
146
|
+
],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
static getInstance() {
|
|
150
|
+
return this.authInstance;
|
|
151
|
+
}
|
|
152
|
+
static reset() {
|
|
153
|
+
this.authInstance = null;
|
|
154
|
+
this.initialized = false;
|
|
155
|
+
this.initLogged = false;
|
|
156
|
+
this.betterAuthEnabled = false;
|
|
157
|
+
this.currentConfig = null;
|
|
158
|
+
this.customController = null;
|
|
159
|
+
this.customResolver = null;
|
|
160
|
+
}
|
|
161
|
+
static createDeferredModule(config, fallbackSecrets) {
|
|
162
|
+
return {
|
|
163
|
+
controllers: [this.getControllerClass()],
|
|
164
|
+
exports: [exports.BETTER_AUTH_INSTANCE, better_auth_service_1.BetterAuthService, better_auth_user_mapper_1.BetterAuthUserMapper, better_auth_rate_limiter_service_1.BetterAuthRateLimiter],
|
|
165
|
+
module: BetterAuthModule_1,
|
|
166
|
+
providers: [
|
|
167
|
+
{
|
|
168
|
+
inject: [(0, mongoose_1.getConnectionToken)()],
|
|
169
|
+
provide: exports.BETTER_AUTH_INSTANCE,
|
|
170
|
+
useFactory: async (connection) => {
|
|
171
|
+
const db = connection.db;
|
|
172
|
+
if (!db) {
|
|
173
|
+
await this.waitForMongoConnection();
|
|
174
|
+
const globalDb = mongoose_2.default.connection.db;
|
|
175
|
+
if (!globalDb) {
|
|
176
|
+
throw new Error('MongoDB database not available');
|
|
177
|
+
}
|
|
178
|
+
this.authInstance = (0, better_auth_config_1.createBetterAuthInstance)({ config, db: globalDb, fallbackSecrets });
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
this.authInstance = (0, better_auth_config_1.createBetterAuthInstance)({ config, db, fallbackSecrets });
|
|
182
|
+
}
|
|
183
|
+
if (this.authInstance && !this.initLogged) {
|
|
184
|
+
this.initLogged = true;
|
|
185
|
+
this.logger.log('BetterAuth initialized');
|
|
186
|
+
this.logEnabledFeatures(config);
|
|
187
|
+
}
|
|
188
|
+
return this.authInstance;
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
inject: [exports.BETTER_AUTH_INSTANCE, config_service_1.ConfigService],
|
|
193
|
+
provide: better_auth_service_1.BetterAuthService,
|
|
194
|
+
useFactory: (authInstance, configService) => {
|
|
195
|
+
return new better_auth_service_1.BetterAuthService(authInstance, configService);
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
better_auth_user_mapper_1.BetterAuthUserMapper,
|
|
199
|
+
better_auth_middleware_1.BetterAuthMiddleware,
|
|
200
|
+
better_auth_rate_limiter_service_1.BetterAuthRateLimiter,
|
|
201
|
+
better_auth_rate_limit_middleware_1.BetterAuthRateLimitMiddleware,
|
|
202
|
+
this.getResolverClass(),
|
|
203
|
+
],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
static logEnabledFeatures(config) {
|
|
207
|
+
const features = [];
|
|
208
|
+
if (config.jwt && config.jwt.enabled !== false) {
|
|
209
|
+
features.push('JWT');
|
|
210
|
+
}
|
|
211
|
+
if (config.twoFactor && config.twoFactor.enabled !== false) {
|
|
212
|
+
features.push('2FA/TOTP');
|
|
213
|
+
}
|
|
214
|
+
if (config.passkey && config.passkey.enabled !== false) {
|
|
215
|
+
features.push('Passkey/WebAuthn');
|
|
216
|
+
}
|
|
217
|
+
const socialProviders = [];
|
|
218
|
+
if (config.socialProviders) {
|
|
219
|
+
for (const [name, provider] of Object.entries(config.socialProviders)) {
|
|
220
|
+
if (provider?.clientId && provider?.clientSecret && provider?.enabled !== false) {
|
|
221
|
+
socialProviders.push(name.charAt(0).toUpperCase() + name.slice(1));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (socialProviders.length > 0) {
|
|
226
|
+
features.push(`Social Login (${socialProviders.join(', ')})`);
|
|
227
|
+
}
|
|
228
|
+
if (config.rateLimit?.enabled) {
|
|
229
|
+
features.push(`Rate Limiting (${config.rateLimit.max || 10}/${config.rateLimit.windowSeconds || 60}s)`);
|
|
230
|
+
}
|
|
231
|
+
if (features.length > 0) {
|
|
232
|
+
this.logger.log(`Enabled features: ${features.join(', ')}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
exports.BetterAuthModule = BetterAuthModule;
|
|
237
|
+
BetterAuthModule.logger = new common_1.Logger(BetterAuthModule_1.name);
|
|
238
|
+
BetterAuthModule.authInstance = null;
|
|
239
|
+
BetterAuthModule.initialized = false;
|
|
240
|
+
BetterAuthModule.initLogged = false;
|
|
241
|
+
BetterAuthModule.betterAuthEnabled = false;
|
|
242
|
+
BetterAuthModule.currentConfig = null;
|
|
243
|
+
BetterAuthModule.customController = null;
|
|
244
|
+
BetterAuthModule.customResolver = null;
|
|
245
|
+
exports.BetterAuthModule = BetterAuthModule = BetterAuthModule_1 = __decorate([
|
|
246
|
+
(0, common_1.Global)(),
|
|
247
|
+
(0, common_1.Module)({}),
|
|
248
|
+
__param(0, (0, common_1.Optional)()),
|
|
249
|
+
__param(1, (0, common_1.Optional)()),
|
|
250
|
+
__metadata("design:paramtypes", [better_auth_service_1.BetterAuthService,
|
|
251
|
+
better_auth_rate_limiter_service_1.BetterAuthRateLimiter])
|
|
252
|
+
], BetterAuthModule);
|
|
253
|
+
//# sourceMappingURL=better-auth.module.js.map
|