@nauth-toolkit/core 0.1.17 → 0.1.21

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.
Files changed (76) hide show
  1. package/dist/adapters/storage.factory.d.ts.map +1 -1
  2. package/dist/adapters/storage.factory.js +250 -18
  3. package/dist/adapters/storage.factory.js.map +1 -1
  4. package/dist/bootstrap.d.ts.map +1 -1
  5. package/dist/bootstrap.js +2 -1
  6. package/dist/bootstrap.js.map +1 -1
  7. package/dist/dto/admin-signup.dto.d.ts +196 -0
  8. package/dist/dto/admin-signup.dto.d.ts.map +1 -0
  9. package/dist/dto/admin-signup.dto.js +317 -0
  10. package/dist/dto/admin-signup.dto.js.map +1 -0
  11. package/dist/dto/index.d.ts +1 -0
  12. package/dist/dto/index.d.ts.map +1 -1
  13. package/dist/dto/index.js +1 -0
  14. package/dist/dto/index.js.map +1 -1
  15. package/dist/handlers/csrf.handler.d.ts.map +1 -1
  16. package/dist/handlers/csrf.handler.js +7 -2
  17. package/dist/handlers/csrf.handler.js.map +1 -1
  18. package/dist/handlers/social-redirect.handler.d.ts +126 -0
  19. package/dist/handlers/social-redirect.handler.d.ts.map +1 -0
  20. package/dist/handlers/social-redirect.handler.js +346 -0
  21. package/dist/handlers/social-redirect.handler.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +4 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/interfaces/config.interface.d.ts +49 -0
  27. package/dist/interfaces/config.interface.d.ts.map +1 -1
  28. package/dist/interfaces/index.d.ts +1 -0
  29. package/dist/interfaces/index.d.ts.map +1 -1
  30. package/dist/interfaces/index.js +1 -0
  31. package/dist/interfaces/index.js.map +1 -1
  32. package/dist/interfaces/social-auth-state-store.interface.d.ts +100 -0
  33. package/dist/interfaces/social-auth-state-store.interface.d.ts.map +1 -0
  34. package/dist/interfaces/social-auth-state-store.interface.js +3 -0
  35. package/dist/interfaces/social-auth-state-store.interface.js.map +1 -0
  36. package/dist/interfaces/storage-adapter.interface.d.ts +2 -2
  37. package/dist/interfaces/storage-adapter.interface.d.ts.map +1 -1
  38. package/dist/internal.d.ts +5 -0
  39. package/dist/internal.d.ts.map +1 -1
  40. package/dist/internal.js +7 -1
  41. package/dist/internal.js.map +1 -1
  42. package/dist/schemas/auth-config.schema.d.ts +121 -28
  43. package/dist/schemas/auth-config.schema.d.ts.map +1 -1
  44. package/dist/schemas/auth-config.schema.js +21 -1
  45. package/dist/schemas/auth-config.schema.js.map +1 -1
  46. package/dist/services/auth.service.d.ts +39 -0
  47. package/dist/services/auth.service.d.ts.map +1 -1
  48. package/dist/services/auth.service.js +221 -9
  49. package/dist/services/auth.service.js.map +1 -1
  50. package/dist/services/email-verification.service.d.ts.map +1 -1
  51. package/dist/services/email-verification.service.js +4 -3
  52. package/dist/services/email-verification.service.js.map +1 -1
  53. package/dist/services/social-auth-base.service.d.ts +5 -10
  54. package/dist/services/social-auth-base.service.d.ts.map +1 -1
  55. package/dist/services/social-auth-base.service.js +11 -59
  56. package/dist/services/social-auth-base.service.js.map +1 -1
  57. package/dist/services/social-auth-state-store.service.d.ts +58 -0
  58. package/dist/services/social-auth-state-store.service.d.ts.map +1 -0
  59. package/dist/services/social-auth-state-store.service.js +261 -0
  60. package/dist/services/social-auth-state-store.service.js.map +1 -0
  61. package/dist/storage/account-lockout-storage.service.d.ts +2 -2
  62. package/dist/storage/account-lockout-storage.service.d.ts.map +1 -1
  63. package/dist/storage/account-lockout-storage.service.js +2 -2
  64. package/dist/storage/account-lockout-storage.service.js.map +1 -1
  65. package/dist/utils/index.d.ts +1 -0
  66. package/dist/utils/index.d.ts.map +1 -1
  67. package/dist/utils/index.js +1 -0
  68. package/dist/utils/index.js.map +1 -1
  69. package/dist/utils/password-generator.d.ts +29 -0
  70. package/dist/utils/password-generator.d.ts.map +1 -0
  71. package/dist/utils/password-generator.js +98 -0
  72. package/dist/utils/password-generator.js.map +1 -0
  73. package/dist/utils/setup/init-social.d.ts +2 -5
  74. package/dist/utils/setup/init-social.d.ts.map +1 -1
  75. package/dist/utils/setup/init-social.js.map +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,317 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AdminSignupResponseDTO = exports.AdminSignupDTO = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ const class_transformer_1 = require("class-transformer");
15
+ /**
16
+ * DTO for administrative user creation with override capabilities
17
+ *
18
+ * Allows administrators to create user accounts with:
19
+ * - Bypass email/phone verification requirements
20
+ * - Force password change on first login
21
+ * - Auto-generate secure passwords
22
+ *
23
+ * Security:
24
+ * - All fields validated against DB constraints
25
+ * - Input sanitization applied automatically
26
+ * - Password strength enforced (8-128 chars) unless auto-generated
27
+ * - Email/username uniqueness checked in service layer
28
+ * - Audit trail records admin-created accounts
29
+ *
30
+ * Warning: This endpoint should be protected by admin authentication.
31
+ * The service does not enforce authorization - it is the responsibility
32
+ * of the framework adapter (NestJS/Express/Fastify) to protect the endpoint.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * // Create user with pre-verified email
37
+ * const dto: AdminSignupDTO = {
38
+ * email: 'user@example.com',
39
+ * password: 'SecurePass123!',
40
+ * isEmailVerified: true,
41
+ * mustChangePassword: false,
42
+ * };
43
+ *
44
+ * // Create user with auto-generated password
45
+ * const dto: AdminSignupDTO = {
46
+ * email: 'user@example.com',
47
+ * generatePassword: true,
48
+ * isEmailVerified: true,
49
+ * mustChangePassword: true, // User must change generated password
50
+ * };
51
+ * ```
52
+ */
53
+ class AdminSignupDTO {
54
+ /**
55
+ * User email address
56
+ *
57
+ * Validation:
58
+ * - Valid email format (RFC 5322)
59
+ * - Max 255 characters (matches DB limit)
60
+ *
61
+ * Sanitization:
62
+ * - Trimmed and lowercased
63
+ */
64
+ email;
65
+ /**
66
+ * User password
67
+ *
68
+ * Required unless `generatePassword` is true.
69
+ *
70
+ * Validation:
71
+ * - Min 8 characters
72
+ * - Max 128 characters (prevents DoS via bcrypt)
73
+ * - Additional policy checks in service layer
74
+ *
75
+ * Note: NOT trimmed (passwords can have leading/trailing spaces)
76
+ */
77
+ password;
78
+ /**
79
+ * Optional username
80
+ *
81
+ * Validation:
82
+ * - 3-50 characters
83
+ * - Alphanumeric, underscores, and hyphens only
84
+ * - Max 255 characters (DB limit)
85
+ *
86
+ * Sanitization:
87
+ * - Trimmed
88
+ * - Case preserved (username can be case-sensitive per config)
89
+ */
90
+ username;
91
+ /**
92
+ * Optional first name
93
+ *
94
+ * Validation:
95
+ * - 1-100 characters
96
+ * - Letters, spaces, hyphens, and apostrophes only
97
+ * - Max 100 characters (DB limit)
98
+ *
99
+ * Sanitization:
100
+ * - Trimmed
101
+ * - Title case preserved
102
+ */
103
+ firstName;
104
+ /**
105
+ * Optional last name
106
+ *
107
+ * Validation:
108
+ * - 1-100 characters
109
+ * - Letters, spaces, hyphens, and apostrophes only
110
+ * - Max 100 characters (DB limit)
111
+ *
112
+ * Sanitization:
113
+ * - Trimmed
114
+ * - Title case preserved
115
+ */
116
+ lastName;
117
+ /**
118
+ * Optional phone number
119
+ *
120
+ * Validation:
121
+ * - E.164 format (international standard)
122
+ * - MUST start with + (required for security)
123
+ * - Max 20 characters (DB limit)
124
+ * - Example: +14155552671, +61444567890
125
+ *
126
+ * Sanitization:
127
+ * - Whitespace removed
128
+ * - Only digits and leading + preserved
129
+ *
130
+ * Security:
131
+ * - Strict E.164 validation prevents SQL injection
132
+ * - Max length prevents oversized inputs
133
+ */
134
+ phone;
135
+ /**
136
+ * Optional metadata (custom fields)
137
+ *
138
+ * Security:
139
+ * - Validated in service layer if used
140
+ * - Max depth/size limits should be enforced
141
+ */
142
+ metadata;
143
+ /**
144
+ * Bypass email verification requirement
145
+ *
146
+ * If true, user's email is marked as verified without sending verification email.
147
+ * If false (default), user must verify email through normal flow.
148
+ *
149
+ * Default: false
150
+ */
151
+ isEmailVerified;
152
+ /**
153
+ * Bypass phone verification requirement
154
+ *
155
+ * If true, user's phone is marked as verified without sending verification SMS.
156
+ * If false (default), user must verify phone through normal flow.
157
+ *
158
+ * Default: false
159
+ */
160
+ isPhoneVerified;
161
+ /**
162
+ * Force password change on first login
163
+ *
164
+ * If true, user will be required to change password on next login.
165
+ * Useful when auto-generating passwords or when admin sets temporary passwords.
166
+ *
167
+ * Default: false
168
+ */
169
+ mustChangePassword;
170
+ /**
171
+ * Auto-generate secure password
172
+ *
173
+ * If true, a cryptographically secure random password will be generated.
174
+ * The generated password will be returned in the response (returned once only).
175
+ * Password field is not required when this is true.
176
+ *
177
+ * Default: false
178
+ *
179
+ * Security: Generated passwords are 16 characters, mixed case, numbers, and special characters.
180
+ * They are returned once in the response and never stored in plain text.
181
+ */
182
+ generatePassword;
183
+ }
184
+ exports.AdminSignupDTO = AdminSignupDTO;
185
+ __decorate([
186
+ (0, class_validator_1.IsEmail)({}, { message: 'Invalid email format' }),
187
+ (0, class_validator_1.MaxLength)(255, { message: 'Email must not exceed 255 characters' }),
188
+ (0, class_transformer_1.Transform)(({ value }) => {
189
+ if (typeof value === 'string') {
190
+ return value.trim().toLowerCase();
191
+ }
192
+ return value;
193
+ }),
194
+ __metadata("design:type", String)
195
+ ], AdminSignupDTO.prototype, "email", void 0);
196
+ __decorate([
197
+ (0, class_validator_1.ValidateIf)((o) => !o.generatePassword),
198
+ (0, class_validator_1.IsString)({ message: 'Password must be a string' }),
199
+ (0, class_validator_1.MinLength)(8, { message: 'Password must be at least 8 characters' }),
200
+ (0, class_validator_1.MaxLength)(128, { message: 'Password must not exceed 128 characters' }),
201
+ __metadata("design:type", String)
202
+ ], AdminSignupDTO.prototype, "password", void 0);
203
+ __decorate([
204
+ (0, class_validator_1.IsOptional)(),
205
+ (0, class_validator_1.IsString)({ message: 'Username must be a string' }),
206
+ (0, class_validator_1.MinLength)(3, { message: 'Username must be at least 3 characters' }),
207
+ (0, class_validator_1.MaxLength)(255, { message: 'Username must not exceed 255 characters' }),
208
+ (0, class_validator_1.Matches)(/^[a-zA-Z0-9_-]+$/, {
209
+ message: 'Username can only contain letters, numbers, underscores, and hyphens',
210
+ }),
211
+ (0, class_transformer_1.Transform)(({ value }) => {
212
+ if (typeof value === 'string') {
213
+ return value.trim().toLowerCase();
214
+ }
215
+ return value;
216
+ }),
217
+ __metadata("design:type", String)
218
+ ], AdminSignupDTO.prototype, "username", void 0);
219
+ __decorate([
220
+ (0, class_validator_1.IsOptional)(),
221
+ (0, class_validator_1.IsString)({ message: 'First name must be a string' }),
222
+ (0, class_validator_1.MinLength)(1, { message: 'First name must be at least 1 character' }),
223
+ (0, class_validator_1.MaxLength)(100, { message: 'First name must not exceed 100 characters' }),
224
+ (0, class_validator_1.Matches)(/^[a-zA-Z\s\-']+$/, {
225
+ message: 'First name can only contain letters, spaces, hyphens, and apostrophes',
226
+ }),
227
+ (0, class_transformer_1.Transform)(({ value }) => {
228
+ if (typeof value === 'string') {
229
+ return value.trim();
230
+ }
231
+ return value;
232
+ }),
233
+ __metadata("design:type", String)
234
+ ], AdminSignupDTO.prototype, "firstName", void 0);
235
+ __decorate([
236
+ (0, class_validator_1.IsOptional)(),
237
+ (0, class_validator_1.IsString)({ message: 'Last name must be a string' }),
238
+ (0, class_validator_1.MinLength)(1, { message: 'Last name must be at least 1 character' }),
239
+ (0, class_validator_1.MaxLength)(100, { message: 'Last name must not exceed 100 characters' }),
240
+ (0, class_validator_1.Matches)(/^[a-zA-Z\s\-']+$/, {
241
+ message: 'Last name can only contain letters, spaces, hyphens, and apostrophes',
242
+ }),
243
+ (0, class_transformer_1.Transform)(({ value }) => {
244
+ if (typeof value === 'string') {
245
+ return value.trim();
246
+ }
247
+ return value;
248
+ }),
249
+ __metadata("design:type", String)
250
+ ], AdminSignupDTO.prototype, "lastName", void 0);
251
+ __decorate([
252
+ (0, class_validator_1.IsOptional)(),
253
+ (0, class_validator_1.IsString)({ message: 'Phone must be a string' }),
254
+ (0, class_validator_1.MaxLength)(20, { message: 'Phone must not exceed 20 characters' }),
255
+ (0, class_validator_1.Matches)(/^\+[1-9]\d{1,14}$/, {
256
+ message: 'Phone must be in E.164 format with + prefix (e.g., +14155552671)',
257
+ }),
258
+ (0, class_transformer_1.Transform)(({ value }) => {
259
+ if (typeof value === 'string') {
260
+ // Remove all whitespace and keep only digits and +
261
+ return value.replace(/\s/g, '');
262
+ }
263
+ return value;
264
+ }),
265
+ __metadata("design:type", String)
266
+ ], AdminSignupDTO.prototype, "phone", void 0);
267
+ __decorate([
268
+ (0, class_validator_1.IsOptional)(),
269
+ __metadata("design:type", Object)
270
+ ], AdminSignupDTO.prototype, "metadata", void 0);
271
+ __decorate([
272
+ (0, class_validator_1.IsOptional)(),
273
+ (0, class_validator_1.IsBoolean)({ message: 'isEmailVerified must be a boolean' }),
274
+ __metadata("design:type", Boolean)
275
+ ], AdminSignupDTO.prototype, "isEmailVerified", void 0);
276
+ __decorate([
277
+ (0, class_validator_1.IsOptional)(),
278
+ (0, class_validator_1.IsBoolean)({ message: 'isPhoneVerified must be a boolean' }),
279
+ __metadata("design:type", Boolean)
280
+ ], AdminSignupDTO.prototype, "isPhoneVerified", void 0);
281
+ __decorate([
282
+ (0, class_validator_1.IsOptional)(),
283
+ (0, class_validator_1.IsBoolean)({ message: 'mustChangePassword must be a boolean' }),
284
+ __metadata("design:type", Boolean)
285
+ ], AdminSignupDTO.prototype, "mustChangePassword", void 0);
286
+ __decorate([
287
+ (0, class_validator_1.IsOptional)(),
288
+ (0, class_validator_1.IsBoolean)({ message: 'generatePassword must be a boolean' }),
289
+ __metadata("design:type", Boolean)
290
+ ], AdminSignupDTO.prototype, "generatePassword", void 0);
291
+ /**
292
+ * Response DTO for admin signup
293
+ *
294
+ * Returns the created user object (sanitized, excludes sensitive fields like passwordHash)
295
+ * and optionally the generated password (only if generatePassword was true in the request).
296
+ */
297
+ class AdminSignupResponseDTO {
298
+ /**
299
+ * Created user object (sanitized)
300
+ *
301
+ * Uses UserResponseDto which excludes sensitive fields:
302
+ * - No passwordHash
303
+ * - No internal database ID (uses 'sub' UUID instead)
304
+ * - No MFA secrets
305
+ * - No internal tracking fields
306
+ */
307
+ user;
308
+ /**
309
+ * Generated password (only present if generatePassword was true)
310
+ *
311
+ * Security: This is returned once and never stored in plain text.
312
+ * The admin should securely deliver this to the user.
313
+ */
314
+ generatedPassword;
315
+ }
316
+ exports.AdminSignupResponseDTO = AdminSignupResponseDTO;
317
+ //# sourceMappingURL=admin-signup.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-signup.dto.js","sourceRoot":"","sources":["../../src/dto/admin-signup.dto.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from './signup.dto';
2
+ export * from './admin-signup.dto';
2
3
  export * from './login.dto';
3
4
  export * from './change-password.dto';
4
5
  export * from './change-password-request.dto';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sCAAsC,CAAC;AACrD,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sCAAsC,CAAC;AACrD,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mBAAmB,CAAC"}
package/dist/dto/index.js CHANGED
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  // Core Auth DTOs
18
18
  __exportStar(require("./signup.dto"), exports);
19
+ __exportStar(require("./admin-signup.dto"), exports);
19
20
  __exportStar(require("./login.dto"), exports);
20
21
  __exportStar(require("./change-password.dto"), exports);
21
22
  __exportStar(require("./change-password-request.dto"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iBAAiB;AACjB,+CAA6B;AAC7B,8CAA4B;AAC5B,wDAAsC;AACtC,gEAA8C;AAC9C,iEAA+C;AAC/C,sDAAoC;AACpC,oDAAkC;AAClC,uEAAqD;AACrD,qDAAmC;AACnC,qDAAmC;AACnC,4DAA0C;AAC1C,uDAAqC;AACrC,wDAAsC;AACtC,gEAA8C;AAC9C,sDAAoC;AACpC,sDAAoC;AACpC,uDAAqC;AACrC,2DAAyC;AACzC,0DAAwC;AACxC,uDAAqC;AACrC,gEAA8C;AAC9C,2DAAyC;AACzC,oEAAkD;AAClD,8DAA4C;AAC5C,uDAAqC;AACrC,yDAAuC;AACvC,qDAAmC;AACnC,gEAA8C;AAC9C,uDAAqC;AACrC,0DAAwC;AACxC,6DAA2C;AAC3C,kDAAgC;AAChC,wDAAsC;AACtC,wDAAsC;AACtC,gEAA8C;AAC9C,gEAA8C;AAC9C,kEAAgD;AAChD,gEAA8C;AAC9C,oDAAkC;AAClC,6DAA2C;AAC3C,0DAAwC;AACxC,uDAAqC;AACrC,0DAAwC;AACxC,+CAA6B;AAC7B,wDAAsC;AACtC,mDAAiC;AACjC,4DAA0C;AAC1C,iEAA+C;AAC/C,0EAAwD;AACxD,2DAAyC;AACzC,+EAA+E;AAC/E,8DAA4C;AAC5C,mEAAiD;AAEjD,oDAAkC;AAElC,+DAA+D;AAC/D,+CAA+C;AAC/C,mCAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iBAAiB;AACjB,+CAA6B;AAC7B,qDAAmC;AACnC,8CAA4B;AAC5B,wDAAsC;AACtC,gEAA8C;AAC9C,iEAA+C;AAC/C,sDAAoC;AACpC,oDAAkC;AAClC,uEAAqD;AACrD,qDAAmC;AACnC,qDAAmC;AACnC,4DAA0C;AAC1C,uDAAqC;AACrC,wDAAsC;AACtC,gEAA8C;AAC9C,sDAAoC;AACpC,sDAAoC;AACpC,uDAAqC;AACrC,2DAAyC;AACzC,0DAAwC;AACxC,uDAAqC;AACrC,gEAA8C;AAC9C,2DAAyC;AACzC,oEAAkD;AAClD,8DAA4C;AAC5C,uDAAqC;AACrC,yDAAuC;AACvC,qDAAmC;AACnC,gEAA8C;AAC9C,uDAAqC;AACrC,0DAAwC;AACxC,6DAA2C;AAC3C,kDAAgC;AAChC,wDAAsC;AACtC,wDAAsC;AACtC,gEAA8C;AAC9C,gEAA8C;AAC9C,kEAAgD;AAChD,gEAA8C;AAC9C,oDAAkC;AAClC,6DAA2C;AAC3C,0DAAwC;AACxC,uDAAqC;AACrC,0DAAwC;AACxC,+CAA6B;AAC7B,wDAAsC;AACtC,mDAAiC;AACjC,4DAA0C;AAC1C,iEAA+C;AAC/C,0EAAwD;AACxD,2DAAyC;AACzC,+EAA+E;AAC/E,8DAA4C;AAC5C,mEAAiD;AAEjD,oDAAkC;AAElC,+DAA+D;AAC/D,+CAA+C;AAC/C,mCAAmC"}
@@ -1 +1 @@
1
- {"version":3,"file":"csrf.handler.d.ts","sourceRoot":"","sources":["../../src/handlers/csrf.handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAiC,WAAW,EAAE,MAAM,UAAU,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKrE;;;;GAIG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAFP,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,WAAW,YAAA;IAGvC;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC3G;;OAEG;YACW,sBAAsB;IAgCpC;;;;;OAKG;YACW,aAAa;CA0C5B"}
1
+ {"version":3,"file":"csrf.handler.d.ts","sourceRoot":"","sources":["../../src/handlers/csrf.handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAiC,WAAW,EAAE,MAAM,UAAU,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKrE;;;;GAIG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAFP,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,WAAW,YAAA;IAGvC;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC3G;;OAEG;YACW,sBAAsB;IAsCpC;;;;;OAKG;YACW,aAAa;CA0C5B"}
@@ -77,14 +77,19 @@ class CsrfHandler {
77
77
  }
78
78
  // Generate new token
79
79
  const token = this.csrfService.generateToken();
80
+ // Allow per-app override, but default to readable cookie (NOT httpOnly)
81
+ // so browser clients can send the value back in the CSRF header.
82
+ const csrfCookieOptions = this.csrfService.getCookieOptions();
80
83
  // Build cookie options
81
84
  const cookieOptions = {
82
- httpOnly: true, // Prevents XSS access to token
85
+ // CSRF token is not a secret; it must be readable by JS to be sent as a header.
86
+ // If an app wants httpOnly CSRF (header-based acquisition), they can override via config.
87
+ httpOnly: csrfCookieOptions.httpOnly ?? false,
83
88
  secure: this.config.tokenDelivery?.cookieOptions?.secure ?? true,
84
89
  sameSite: (this.config.tokenDelivery?.cookieOptions?.sameSite || 'strict'),
85
90
  domain: this.config.tokenDelivery?.cookieOptions?.domain,
86
91
  path: '/',
87
- ...this.csrfService.getCookieOptions(),
92
+ ...csrfCookieOptions,
88
93
  };
89
94
  // Set cookie
90
95
  res.setCookie(cookieName, token, cookieOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"csrf.handler.js","sourceRoot":"","sources":["../../src/handlers/csrf.handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csrf.handler.js","sourceRoot":"","sources":["../../src/handlers/csrf.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { AuthResponseDTO } from '../dto/auth-response.dto';
2
+ import { NAuthConfig } from '../interfaces/config.interface';
3
+ import { ISocialAuthStateStore } from '../interfaces/social-auth-state-store.interface';
4
+ import { StorageAdapter } from '../interfaces/storage-adapter.interface';
5
+ import { NAuthCookieOptions } from '../platform/interfaces';
6
+ import { SocialAuthService } from '../services/social-auth.service';
7
+ import { NAuthLogger } from '../utils/nauth-logger';
8
+ /**
9
+ * Social Redirect Handler (framework-neutral)
10
+ *
11
+ * Consumer backends should implement their own HTTP controllers/routes and delegate to this handler.
12
+ * The handler returns a small "response recipe" that the consumer applies to their framework response.
13
+ *
14
+ * Key properties:
15
+ * - Backend-first redirect (provider -> backend callback -> frontend)
16
+ * - Cluster-safe CSRF `state` storage via `ISocialAuthStateStore` (StorageAdapter-backed)
17
+ * - Optional `appState` round-trip (opaque string, URL-encoded)
18
+ * - Supports `cookies`, `json`, and `hybrid` (origin-based) delivery modes
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // NestJS controller pseudocode
23
+ * const start = await socialRedirect.start({ provider: 'google', returnTo: '/auth/callback', appState: '12345', req });
24
+ * return res.redirect(start.redirectUrl);
25
+ *
26
+ * const cb = await socialRedirect.callback({ provider: 'google', code, state, req });
27
+ * cb.cookies?.forEach((c) => res.setCookie(c.name, c.value, c.options));
28
+ * return res.redirect(cb.redirectUrl);
29
+ *
30
+ * const auth = await socialRedirect.exchange(exchangeToken);
31
+ * return auth;
32
+ * ```
33
+ */
34
+ export declare class SocialRedirectHandler {
35
+ private readonly config;
36
+ private readonly socialAuthService;
37
+ private readonly socialStateStore;
38
+ private readonly storage;
39
+ private readonly logger?;
40
+ private readonly csrfService;
41
+ private readonly exchangeTtlSeconds;
42
+ constructor(config: NAuthConfig, socialAuthService: SocialAuthService, socialStateStore: ISocialAuthStateStore, storage: StorageAdapter, logger?: NAuthLogger | undefined, exchangeTtlSeconds?: number);
43
+ /**
44
+ * Start redirect-first social login.
45
+ *
46
+ * @param input - Start parameters
47
+ * @returns Redirect recipe to send user to the provider authorization URL
48
+ * @throws {NAuthException} When provider/returnTo are invalid or config is missing
49
+ */
50
+ start(input: SocialRedirectStartInput): Promise<SocialRedirectStartResult>;
51
+ /**
52
+ * Handle provider callback and produce a frontend redirect recipe.
53
+ *
54
+ * @param input - Callback parameters from provider (GET query or POST form_post)
55
+ * @returns Redirect recipe to send user back to frontend with `appState` (and optional `exchangeToken`)
56
+ * @throws {NAuthException} When required params are missing/invalid
57
+ */
58
+ callback(input: SocialRedirectCallbackInput): Promise<SocialRedirectCallbackResult>;
59
+ /**
60
+ * Exchange a short-lived exchange token for an AuthResponse.
61
+ *
62
+ * @param exchangeToken - One-time token from callback redirect URL
63
+ * @returns AuthResponse payload (tokens or challenge)
64
+ * @throws {NAuthException} When exchangeToken is invalid/expired
65
+ */
66
+ exchange(exchangeToken: string): Promise<AuthResponseDTO>;
67
+ private buildAuthCookies;
68
+ private buildCsrfCookie;
69
+ private getFrontendBaseUrl;
70
+ private buildFrontendRedirectUrl;
71
+ private appendQuery;
72
+ private resolveEffectiveDelivery;
73
+ private normalizeProvider;
74
+ private getExchangeKey;
75
+ private safeParseExchangePayload;
76
+ }
77
+ /**
78
+ * Start input for redirect-first social login.
79
+ */
80
+ export interface SocialRedirectStartInput {
81
+ /** OAuth provider (google|apple|facebook) */
82
+ provider: string;
83
+ /** Frontend path or URL to return to (default: `/auth/callback`) */
84
+ returnTo?: string;
85
+ /** Optional application state to round-trip back to frontend */
86
+ appState?: string;
87
+ /** Optional action (default: `login`) */
88
+ action?: 'login' | 'link';
89
+ /** Optional delivery preference */
90
+ delivery?: 'cookies' | 'json';
91
+ /** Request object for hybrid origin-based delivery */
92
+ req?: unknown;
93
+ }
94
+ /**
95
+ * Callback input for redirect-first social login.
96
+ */
97
+ export interface SocialRedirectCallbackInput {
98
+ provider: string;
99
+ code?: string;
100
+ state?: string;
101
+ error?: string;
102
+ errorDescription?: string;
103
+ req?: unknown;
104
+ }
105
+ /**
106
+ * Cookie instruction returned by SocialRedirectHandler.
107
+ */
108
+ export interface SocialRedirectCookie {
109
+ name: string;
110
+ value: string;
111
+ options?: NAuthCookieOptions;
112
+ }
113
+ /**
114
+ * Start redirect result.
115
+ */
116
+ export interface SocialRedirectStartResult {
117
+ redirectUrl: string;
118
+ }
119
+ /**
120
+ * Callback redirect result.
121
+ */
122
+ export interface SocialRedirectCallbackResult {
123
+ redirectUrl: string;
124
+ cookies?: SocialRedirectCookie[];
125
+ }
126
+ //# sourceMappingURL=social-redirect.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-redirect.handler.d.ts","sourceRoot":"","sources":["../../src/handlers/social-redirect.handler.ts"],"names":[],"mappings":"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"}