@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.
- package/dist/adapters/storage.factory.d.ts.map +1 -1
- package/dist/adapters/storage.factory.js +250 -18
- package/dist/adapters/storage.factory.js.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +2 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/dto/admin-signup.dto.d.ts +196 -0
- package/dist/dto/admin-signup.dto.d.ts.map +1 -0
- package/dist/dto/admin-signup.dto.js +317 -0
- package/dist/dto/admin-signup.dto.js.map +1 -0
- package/dist/dto/index.d.ts +1 -0
- package/dist/dto/index.d.ts.map +1 -1
- package/dist/dto/index.js +1 -0
- package/dist/dto/index.js.map +1 -1
- package/dist/handlers/csrf.handler.d.ts.map +1 -1
- package/dist/handlers/csrf.handler.js +7 -2
- package/dist/handlers/csrf.handler.js.map +1 -1
- package/dist/handlers/social-redirect.handler.d.ts +126 -0
- package/dist/handlers/social-redirect.handler.d.ts.map +1 -0
- package/dist/handlers/social-redirect.handler.js +346 -0
- package/dist/handlers/social-redirect.handler.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/config.interface.d.ts +49 -0
- package/dist/interfaces/config.interface.d.ts.map +1 -1
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/index.js.map +1 -1
- package/dist/interfaces/social-auth-state-store.interface.d.ts +100 -0
- package/dist/interfaces/social-auth-state-store.interface.d.ts.map +1 -0
- package/dist/interfaces/social-auth-state-store.interface.js +3 -0
- package/dist/interfaces/social-auth-state-store.interface.js.map +1 -0
- package/dist/interfaces/storage-adapter.interface.d.ts +2 -2
- package/dist/interfaces/storage-adapter.interface.d.ts.map +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +7 -1
- package/dist/internal.js.map +1 -1
- package/dist/schemas/auth-config.schema.d.ts +121 -28
- package/dist/schemas/auth-config.schema.d.ts.map +1 -1
- package/dist/schemas/auth-config.schema.js +21 -1
- package/dist/schemas/auth-config.schema.js.map +1 -1
- package/dist/services/auth.service.d.ts +39 -0
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +221 -9
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/email-verification.service.d.ts.map +1 -1
- package/dist/services/email-verification.service.js +4 -3
- package/dist/services/email-verification.service.js.map +1 -1
- package/dist/services/social-auth-base.service.d.ts +5 -10
- package/dist/services/social-auth-base.service.d.ts.map +1 -1
- package/dist/services/social-auth-base.service.js +11 -59
- package/dist/services/social-auth-base.service.js.map +1 -1
- package/dist/services/social-auth-state-store.service.d.ts +58 -0
- package/dist/services/social-auth-state-store.service.d.ts.map +1 -0
- package/dist/services/social-auth-state-store.service.js +261 -0
- package/dist/services/social-auth-state-store.service.js.map +1 -0
- package/dist/storage/account-lockout-storage.service.d.ts +2 -2
- package/dist/storage/account-lockout-storage.service.d.ts.map +1 -1
- package/dist/storage/account-lockout-storage.service.js +2 -2
- package/dist/storage/account-lockout-storage.service.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/password-generator.d.ts +29 -0
- package/dist/utils/password-generator.d.ts.map +1 -0
- package/dist/utils/password-generator.js +98 -0
- package/dist/utils/password-generator.js.map +1 -0
- package/dist/utils/setup/init-social.d.ts +2 -5
- package/dist/utils/setup/init-social.d.ts.map +1 -1
- package/dist/utils/setup/init-social.js.map +1 -1
- 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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"}
|
package/dist/dto/index.d.ts
CHANGED
package/dist/dto/index.d.ts.map
CHANGED
|
@@ -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);
|
package/dist/dto/index.js.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
...
|
|
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":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,oCAAmF;AAInF,sDAAsD;AACtD,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAEhD;;;;GAIG;AACH,MAAa,WAAW;IAEH;IACA;IACA;IAHnB,YACmB,WAAwB,EACxB,MAAmB,EACnB,MAAoB;QAFpB,gBAAW,GAAX,WAAW,CAAa;QACxB,WAAM,GAAN,MAAM,CAAa;QACnB,WAAM,GAAN,MAAM,CAAc;IACpC,CAAC;IAEJ;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAAC,GAAiB,EAAE,GAAkB,EAAE,IAAgC;QACzF,kDAAkD;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,IAAI,MAAM,CAAC;QAC3D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;QACtE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,GAAiB,EAAE,GAAkB;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9C,IAAI,aAAa,EAAE,CAAC;YAClB,+CAA+C;YAC/C,OAAO,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;YACrC,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;QAE/C,uBAAuB;QACvB,MAAM,aAAa,GAAG;YACpB,QAAQ,EAAE,IAAI,
|
|
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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"}
|