@ackplus/nest-auth 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +226 -0
- package/package.json +51 -0
- package/src/index.d.ts +11 -0
- package/src/index.js +15 -0
- package/src/index.js.map +1 -0
- package/src/lib/auth.constants.d.ts +17 -0
- package/src/lib/auth.constants.js +21 -0
- package/src/lib/auth.constants.js.map +1 -0
- package/src/lib/controllers/auth.controller.d.ts +26 -0
- package/src/lib/controllers/auth.controller.js +214 -0
- package/src/lib/controllers/auth.controller.js.map +1 -0
- package/src/lib/controllers/mfa.controller.d.ts +23 -0
- package/src/lib/controllers/mfa.controller.js +132 -0
- package/src/lib/controllers/mfa.controller.js.map +1 -0
- package/src/lib/decorators/skip-mfa.decorator.d.ts +2 -0
- package/src/lib/decorators/skip-mfa.decorator.js +8 -0
- package/src/lib/decorators/skip-mfa.decorator.js.map +1 -0
- package/src/lib/dto/index.d.ts +12 -0
- package/src/lib/dto/index.js +16 -0
- package/src/lib/dto/index.js.map +1 -0
- package/src/lib/dto/requests/forgot-password.request.dto.d.ts +5 -0
- package/src/lib/dto/requests/forgot-password.request.dto.js +30 -0
- package/src/lib/dto/requests/forgot-password.request.dto.js.map +1 -0
- package/src/lib/dto/requests/login.request.dto.d.ts +6 -0
- package/src/lib/dto/requests/login.request.dto.js +34 -0
- package/src/lib/dto/requests/login.request.dto.js.map +1 -0
- package/src/lib/dto/requests/refresh-token.request.dto.d.ts +3 -0
- package/src/lib/dto/requests/refresh-token.request.dto.js +15 -0
- package/src/lib/dto/requests/refresh-token.request.dto.js.map +1 -0
- package/src/lib/dto/requests/reset-password.request.dto.d.ts +7 -0
- package/src/lib/dto/requests/reset-password.request.dto.js +42 -0
- package/src/lib/dto/requests/reset-password.request.dto.js.map +1 -0
- package/src/lib/dto/requests/send-mfa-code.request.dto.d.ts +4 -0
- package/src/lib/dto/requests/send-mfa-code.request.dto.js +16 -0
- package/src/lib/dto/requests/send-mfa-code.request.dto.js.map +1 -0
- package/src/lib/dto/requests/signup.request.dto.d.ts +6 -0
- package/src/lib/dto/requests/signup.request.dto.js +37 -0
- package/src/lib/dto/requests/signup.request.dto.js.map +1 -0
- package/src/lib/dto/requests/social-login.request.dto.d.ts +3 -0
- package/src/lib/dto/requests/social-login.request.dto.js +16 -0
- package/src/lib/dto/requests/social-login.request.dto.js.map +1 -0
- package/src/lib/dto/requests/update-user.dto.d.ts +5 -0
- package/src/lib/dto/requests/update-user.dto.js +24 -0
- package/src/lib/dto/requests/update-user.dto.js.map +1 -0
- package/src/lib/dto/requests/verify-2fa.request.dto.d.ts +5 -0
- package/src/lib/dto/requests/verify-2fa.request.dto.js +21 -0
- package/src/lib/dto/requests/verify-2fa.request.dto.js.map +1 -0
- package/src/lib/dto/requests/verify-totp-setup.request.dto.d.ts +4 -0
- package/src/lib/dto/requests/verify-totp-setup.request.dto.js +20 -0
- package/src/lib/dto/requests/verify-totp-setup.request.dto.js.map +1 -0
- package/src/lib/dto/responses/auth.response.dto.d.ts +16 -0
- package/src/lib/dto/responses/auth.response.dto.js +55 -0
- package/src/lib/dto/responses/auth.response.dto.js.map +1 -0
- package/src/lib/dto/responses/device-info.response.dto.d.ts +6 -0
- package/src/lib/dto/responses/device-info.response.dto.js +25 -0
- package/src/lib/dto/responses/device-info.response.dto.js.map +1 -0
- package/src/lib/dto/responses/message.response.dto.d.ts +3 -0
- package/src/lib/dto/responses/message.response.dto.js +13 -0
- package/src/lib/dto/responses/message.response.dto.js.map +1 -0
- package/src/lib/entities/auth-identity.entity.d.ts +11 -0
- package/src/lib/entities/auth-identity.entity.js +47 -0
- package/src/lib/entities/auth-identity.entity.js.map +1 -0
- package/src/lib/entities/index.d.ts +10 -0
- package/src/lib/entities/index.js +26 -0
- package/src/lib/entities/index.js.map +1 -0
- package/src/lib/entities/mfa-secret.entity.d.ts +12 -0
- package/src/lib/entities/mfa-secret.entity.js +51 -0
- package/src/lib/entities/mfa-secret.entity.js.map +1 -0
- package/src/lib/entities/otp.entity.d.ts +16 -0
- package/src/lib/entities/otp.entity.js +52 -0
- package/src/lib/entities/otp.entity.js.map +1 -0
- package/src/lib/entities/permission.entity.d.ts +9 -0
- package/src/lib/entities/permission.entity.js +37 -0
- package/src/lib/entities/permission.entity.js.map +1 -0
- package/src/lib/entities/role-permission.entity.d.ts +8 -0
- package/src/lib/entities/role-permission.entity.js +30 -0
- package/src/lib/entities/role-permission.entity.js.map +1 -0
- package/src/lib/entities/role.entity.d.ts +11 -0
- package/src/lib/entities/role.entity.js +42 -0
- package/src/lib/entities/role.entity.js.map +1 -0
- package/src/lib/entities/session.entity.d.ts +16 -0
- package/src/lib/entities/session.entity.js +63 -0
- package/src/lib/entities/session.entity.js.map +1 -0
- package/src/lib/entities/tenant.entity.d.ts +10 -0
- package/src/lib/entities/tenant.entity.js +41 -0
- package/src/lib/entities/tenant.entity.js.map +1 -0
- package/src/lib/entities/user-role.entity.d.ts +13 -0
- package/src/lib/entities/user-role.entity.js +47 -0
- package/src/lib/entities/user-role.entity.js.map +1 -0
- package/src/lib/entities/user.entity.d.ts +38 -0
- package/src/lib/entities/user.entity.js +155 -0
- package/src/lib/entities/user.entity.js.map +1 -0
- package/src/lib/guards/auth.guard.d.ts +18 -0
- package/src/lib/guards/auth.guard.js +106 -0
- package/src/lib/guards/auth.guard.js.map +1 -0
- package/src/lib/interceptors/token.interceptor.d.ts +10 -0
- package/src/lib/interceptors/token.interceptor.js +41 -0
- package/src/lib/interceptors/token.interceptor.js.map +1 -0
- package/src/lib/interfaces/auth-module-options.interface.d.ts +51 -0
- package/src/lib/interfaces/auth-module-options.interface.js +3 -0
- package/src/lib/interfaces/auth-module-options.interface.js.map +1 -0
- package/src/lib/interfaces/mfa-options.interface.d.ts +25 -0
- package/src/lib/interfaces/mfa-options.interface.js +10 -0
- package/src/lib/interfaces/mfa-options.interface.js.map +1 -0
- package/src/lib/interfaces/session-options.interface.d.ts +12 -0
- package/src/lib/interfaces/session-options.interface.js +9 -0
- package/src/lib/interfaces/session-options.interface.js.map +1 -0
- package/src/lib/interfaces/token-payload.interface.d.ts +39 -0
- package/src/lib/interfaces/token-payload.interface.js +3 -0
- package/src/lib/interfaces/token-payload.interface.js.map +1 -0
- package/src/lib/migrations/1746242659133-migration.d.ts +6 -0
- package/src/lib/migrations/1746242659133-migration.js +66 -0
- package/src/lib/migrations/1746242659133-migration.js.map +1 -0
- package/src/lib/migrations/1746244352713-migration.d.ts +6 -0
- package/src/lib/migrations/1746244352713-migration.js +16 -0
- package/src/lib/migrations/1746244352713-migration.js.map +1 -0
- package/src/lib/nest-auth.module.d.ts +13 -0
- package/src/lib/nest-auth.module.js +247 -0
- package/src/lib/nest-auth.module.js.map +1 -0
- package/src/lib/providers/apple-auth.provider.d.ts +23 -0
- package/src/lib/providers/apple-auth.provider.js +61 -0
- package/src/lib/providers/apple-auth.provider.js.map +1 -0
- package/src/lib/providers/base-auth.provider.d.ts +24 -0
- package/src/lib/providers/base-auth.provider.js +54 -0
- package/src/lib/providers/base-auth.provider.js.map +1 -0
- package/src/lib/providers/email-auth.provider.d.ts +21 -0
- package/src/lib/providers/email-auth.provider.js +45 -0
- package/src/lib/providers/email-auth.provider.js.map +1 -0
- package/src/lib/providers/facebook-auth.provider.d.ts +23 -0
- package/src/lib/providers/facebook-auth.provider.js +61 -0
- package/src/lib/providers/facebook-auth.provider.js.map +1 -0
- package/src/lib/providers/google-auth.provider.d.ts +26 -0
- package/src/lib/providers/google-auth.provider.js +63 -0
- package/src/lib/providers/google-auth.provider.js.map +1 -0
- package/src/lib/providers/index.d.ts +7 -0
- package/src/lib/providers/index.js +16 -0
- package/src/lib/providers/index.js.map +1 -0
- package/src/lib/providers/jwt-auth.provider.d.ts +38 -0
- package/src/lib/providers/jwt-auth.provider.js +54 -0
- package/src/lib/providers/jwt-auth.provider.js.map +1 -0
- package/src/lib/providers/phone-auth.provider.d.ts +22 -0
- package/src/lib/providers/phone-auth.provider.js +48 -0
- package/src/lib/providers/phone-auth.provider.js.map +1 -0
- package/src/lib/request-context/request-context.d.ts +22 -0
- package/src/lib/request-context/request-context.js +108 -0
- package/src/lib/request-context/request-context.js.map +1 -0
- package/src/lib/request-context/request-context.middleware.d.ts +4 -0
- package/src/lib/request-context/request-context.middleware.js +16 -0
- package/src/lib/request-context/request-context.middleware.js.map +1 -0
- package/src/lib/services/auth-migration-service.d.ts +22 -0
- package/src/lib/services/auth-migration-service.js +125 -0
- package/src/lib/services/auth-migration-service.js.map +1 -0
- package/src/lib/services/auth-provider-registry.service.d.ts +25 -0
- package/src/lib/services/auth-provider-registry.service.js +72 -0
- package/src/lib/services/auth-provider-registry.service.js.map +1 -0
- package/src/lib/services/auth.service.d.ts +45 -0
- package/src/lib/services/auth.service.js +344 -0
- package/src/lib/services/auth.service.js.map +1 -0
- package/src/lib/services/cookie.service.d.ts +10 -0
- package/src/lib/services/cookie.service.js +43 -0
- package/src/lib/services/cookie.service.js.map +1 -0
- package/src/lib/services/jwt.service.d.ts +15 -0
- package/src/lib/services/jwt.service.js +93 -0
- package/src/lib/services/jwt.service.js.map +1 -0
- package/src/lib/services/mfa.service.d.ts +40 -0
- package/src/lib/services/mfa.service.js +254 -0
- package/src/lib/services/mfa.service.js.map +1 -0
- package/src/lib/services/session/base-session.service.d.ts +23 -0
- package/src/lib/services/session/base-session.service.js +64 -0
- package/src/lib/services/session/base-session.service.js.map +1 -0
- package/src/lib/services/session/database-session.service.d.ts +19 -0
- package/src/lib/services/session/database-session.service.js +55 -0
- package/src/lib/services/session/database-session.service.js.map +1 -0
- package/src/lib/services/session/redis-session.service.d.ts +22 -0
- package/src/lib/services/session/redis-session.service.js +120 -0
- package/src/lib/services/session/redis-session.service.js.map +1 -0
- package/src/lib/utils/database.utils.d.ts +2 -0
- package/src/lib/utils/database.utils.js +8 -0
- package/src/lib/utils/database.utils.js.map +1 -0
- package/src/lib/utils/otp.d.ts +1 -0
- package/src/lib/utils/otp.js +7 -0
- package/src/lib/utils/otp.js.map +1 -0
- package/src/typeorm.config.d.ts +2 -0
- package/src/typeorm.config.js +18 -0
- package/src/typeorm.config.js.map +1 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Tenant = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const user_entity_1 = require("./user.entity");
|
|
7
|
+
let Tenant = class Tenant {
|
|
8
|
+
};
|
|
9
|
+
exports.Tenant = Tenant;
|
|
10
|
+
tslib_1.__decorate([
|
|
11
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
12
|
+
tslib_1.__metadata("design:type", String)
|
|
13
|
+
], Tenant.prototype, "id", void 0);
|
|
14
|
+
tslib_1.__decorate([
|
|
15
|
+
(0, typeorm_1.Column)(),
|
|
16
|
+
tslib_1.__metadata("design:type", String)
|
|
17
|
+
], Tenant.prototype, "name", void 0);
|
|
18
|
+
tslib_1.__decorate([
|
|
19
|
+
(0, typeorm_1.Column)({ unique: true, nullable: true }),
|
|
20
|
+
tslib_1.__metadata("design:type", String)
|
|
21
|
+
], Tenant.prototype, "domain", void 0);
|
|
22
|
+
tslib_1.__decorate([
|
|
23
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
24
|
+
tslib_1.__metadata("design:type", String)
|
|
25
|
+
], Tenant.prototype, "createdByUserId", void 0);
|
|
26
|
+
tslib_1.__decorate([
|
|
27
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
28
|
+
tslib_1.__metadata("design:type", Date)
|
|
29
|
+
], Tenant.prototype, "createdAt", void 0);
|
|
30
|
+
tslib_1.__decorate([
|
|
31
|
+
(0, typeorm_1.UpdateDateColumn)(),
|
|
32
|
+
tslib_1.__metadata("design:type", Date)
|
|
33
|
+
], Tenant.prototype, "updatedAt", void 0);
|
|
34
|
+
tslib_1.__decorate([
|
|
35
|
+
(0, typeorm_1.OneToMany)(() => user_entity_1.User, user => user.tenant),
|
|
36
|
+
tslib_1.__metadata("design:type", Array)
|
|
37
|
+
], Tenant.prototype, "users", void 0);
|
|
38
|
+
exports.Tenant = Tenant = tslib_1.__decorate([
|
|
39
|
+
(0, typeorm_1.Entity)('nest_auth_tenants')
|
|
40
|
+
], Tenant);
|
|
41
|
+
//# sourceMappingURL=tenant.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.entity.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/entities/tenant.entity.ts"],"names":[],"mappings":";;;;AAAA,qCAAgH;AAChH,+CAAqC;AAG9B,IAAM,MAAM,GAAZ,MAAM,MAAM;CAqBlB,CAAA;AArBY,wBAAM;AAEf;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;kCACpB;AAGX;IADC,IAAA,gBAAM,GAAE;;oCACI;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAC1B;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACH;AAGxB;IADC,IAAA,0BAAgB,GAAE;sCACR,IAAI;yCAAC;AAGhB;IADC,IAAA,0BAAgB,GAAE;sCACR,IAAI;yCAAC;AAGhB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;;qCAC7B;iBApBL,MAAM;IADlB,IAAA,gBAAM,EAAC,mBAAmB,CAAC;GACf,MAAM,CAqBlB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { User } from "./user.entity";
|
|
2
|
+
import { Role } from "./role.entity";
|
|
3
|
+
import { Tenant } from "./tenant.entity";
|
|
4
|
+
export declare class UserRole {
|
|
5
|
+
userId: string;
|
|
6
|
+
roleId: string;
|
|
7
|
+
tenantId: string;
|
|
8
|
+
user: User;
|
|
9
|
+
role: Role;
|
|
10
|
+
tenant: Tenant;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
updatedAt: Date;
|
|
13
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserRole = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const user_entity_1 = require("./user.entity");
|
|
7
|
+
const role_entity_1 = require("./role.entity");
|
|
8
|
+
const tenant_entity_1 = require("./tenant.entity");
|
|
9
|
+
let UserRole = class UserRole {
|
|
10
|
+
};
|
|
11
|
+
exports.UserRole = UserRole;
|
|
12
|
+
tslib_1.__decorate([
|
|
13
|
+
(0, typeorm_1.PrimaryColumn)('uuid'),
|
|
14
|
+
tslib_1.__metadata("design:type", String)
|
|
15
|
+
], UserRole.prototype, "userId", void 0);
|
|
16
|
+
tslib_1.__decorate([
|
|
17
|
+
(0, typeorm_1.PrimaryColumn)('uuid'),
|
|
18
|
+
tslib_1.__metadata("design:type", String)
|
|
19
|
+
], UserRole.prototype, "roleId", void 0);
|
|
20
|
+
tslib_1.__decorate([
|
|
21
|
+
(0, typeorm_1.PrimaryColumn)('uuid'),
|
|
22
|
+
tslib_1.__metadata("design:type", String)
|
|
23
|
+
], UserRole.prototype, "tenantId", void 0);
|
|
24
|
+
tslib_1.__decorate([
|
|
25
|
+
(0, typeorm_1.ManyToOne)(() => user_entity_1.User, user => user.userRoles, { onDelete: 'CASCADE' }),
|
|
26
|
+
tslib_1.__metadata("design:type", user_entity_1.User)
|
|
27
|
+
], UserRole.prototype, "user", void 0);
|
|
28
|
+
tslib_1.__decorate([
|
|
29
|
+
(0, typeorm_1.ManyToOne)(() => role_entity_1.Role, role => role.userRoles, { onDelete: 'CASCADE' }),
|
|
30
|
+
tslib_1.__metadata("design:type", role_entity_1.Role)
|
|
31
|
+
], UserRole.prototype, "role", void 0);
|
|
32
|
+
tslib_1.__decorate([
|
|
33
|
+
(0, typeorm_1.ManyToOne)(() => tenant_entity_1.Tenant),
|
|
34
|
+
tslib_1.__metadata("design:type", tenant_entity_1.Tenant)
|
|
35
|
+
], UserRole.prototype, "tenant", void 0);
|
|
36
|
+
tslib_1.__decorate([
|
|
37
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
38
|
+
tslib_1.__metadata("design:type", Date)
|
|
39
|
+
], UserRole.prototype, "createdAt", void 0);
|
|
40
|
+
tslib_1.__decorate([
|
|
41
|
+
(0, typeorm_1.UpdateDateColumn)(),
|
|
42
|
+
tslib_1.__metadata("design:type", Date)
|
|
43
|
+
], UserRole.prototype, "updatedAt", void 0);
|
|
44
|
+
exports.UserRole = UserRole = tslib_1.__decorate([
|
|
45
|
+
(0, typeorm_1.Entity)('nest_auth_user_roles')
|
|
46
|
+
], UserRole);
|
|
47
|
+
//# sourceMappingURL=user-role.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role.entity.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/entities/user-role.entity.ts"],"names":[],"mappings":";;;;AAAA,qCAAuG;AACvG,+CAAqC;AACrC,+CAAqC;AACrC,mDAAyC;AAGlC,IAAM,QAAQ,GAAd,MAAM,QAAQ;CAwBpB,CAAA;AAxBY,4BAAQ;AAEjB;IADC,IAAA,uBAAa,EAAC,MAAM,CAAC;;wCACP;AAGf;IADC,IAAA,uBAAa,EAAC,MAAM,CAAC;;wCACP;AAGf;IADC,IAAA,uBAAa,EAAC,MAAM,CAAC;;0CACL;AAGjB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;sCACjE,kBAAI;sCAAC;AAGX;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;sCACjE,kBAAI;sCAAC;AAGX;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sBAAM,CAAC;sCAChB,sBAAM;wCAAC;AAGf;IADC,IAAA,0BAAgB,GAAE;sCACR,IAAI;2CAAC;AAGhB;IADC,IAAA,0BAAgB,GAAE;sCACR,IAAI;2CAAC;mBAvBP,QAAQ;IADpB,IAAA,gBAAM,EAAC,sBAAsB,CAAC;GAClB,QAAQ,CAwBpB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BaseEntity } from "typeorm";
|
|
2
|
+
import { Tenant } from "./tenant.entity";
|
|
3
|
+
import { UserRole } from "./user-role.entity";
|
|
4
|
+
import { AuthIdentity } from "./auth-identity.entity";
|
|
5
|
+
import { MFASecret } from "./mfa-secret.entity";
|
|
6
|
+
import { Session } from "./session.entity";
|
|
7
|
+
import { OTP } from "./otp.entity";
|
|
8
|
+
export declare class User extends BaseEntity {
|
|
9
|
+
id: string;
|
|
10
|
+
firstName?: string;
|
|
11
|
+
lastName?: string;
|
|
12
|
+
email: string;
|
|
13
|
+
emailVerifiedAt: Date;
|
|
14
|
+
phone: string;
|
|
15
|
+
phoneVerifiedAt: Date;
|
|
16
|
+
passwordHash: string;
|
|
17
|
+
isVerified: boolean;
|
|
18
|
+
isActive: boolean;
|
|
19
|
+
metadata?: Record<string, any>;
|
|
20
|
+
tenantId?: string;
|
|
21
|
+
isMfaEnabled: boolean;
|
|
22
|
+
mfaRecoveryCode?: string;
|
|
23
|
+
tenant: Tenant;
|
|
24
|
+
createdAt: Date;
|
|
25
|
+
updatedAt: Date;
|
|
26
|
+
identities: AuthIdentity[];
|
|
27
|
+
mfaSecrets: MFASecret[];
|
|
28
|
+
sessions: Session[];
|
|
29
|
+
otps: OTP[];
|
|
30
|
+
userRoles: UserRole[];
|
|
31
|
+
emailTenant: string;
|
|
32
|
+
phoneTenant: string;
|
|
33
|
+
updateTenantFields(): void;
|
|
34
|
+
getPermissions(): string[];
|
|
35
|
+
getRoles(): string[];
|
|
36
|
+
validatePassword(password: string): Promise<boolean>;
|
|
37
|
+
setPassword(password: string): Promise<void>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.User = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const tenant_entity_1 = require("./tenant.entity");
|
|
7
|
+
const user_role_entity_1 = require("./user-role.entity");
|
|
8
|
+
const auth_identity_entity_1 = require("./auth-identity.entity");
|
|
9
|
+
const mfa_secret_entity_1 = require("./mfa-secret.entity");
|
|
10
|
+
const session_entity_1 = require("./session.entity");
|
|
11
|
+
const otp_entity_1 = require("./otp.entity");
|
|
12
|
+
const bcrypt_1 = tslib_1.__importDefault(require("bcrypt"));
|
|
13
|
+
const lodash_1 = require("lodash");
|
|
14
|
+
let User = class User extends typeorm_1.BaseEntity {
|
|
15
|
+
updateTenantFields() {
|
|
16
|
+
this.emailTenant = this.email ? `${this.email}:${this.tenantId || 'global'}` : null;
|
|
17
|
+
this.phoneTenant = this.phone ? `${this.phone}:${this.tenantId || 'global'}` : null;
|
|
18
|
+
}
|
|
19
|
+
getPermissions() {
|
|
20
|
+
return (0, lodash_1.chain)(this.userRoles)
|
|
21
|
+
.map(role => (0, lodash_1.map)(role.role.rolePermissions, 'permission.name'))
|
|
22
|
+
.flatten()
|
|
23
|
+
.uniq()
|
|
24
|
+
.value();
|
|
25
|
+
}
|
|
26
|
+
getRoles() {
|
|
27
|
+
return (0, lodash_1.chain)(this.userRoles)
|
|
28
|
+
.map(role => role.role.name)
|
|
29
|
+
.uniq()
|
|
30
|
+
.value();
|
|
31
|
+
}
|
|
32
|
+
async validatePassword(password) {
|
|
33
|
+
if (!this.passwordHash)
|
|
34
|
+
return false;
|
|
35
|
+
return bcrypt_1.default.compare(password, this.passwordHash);
|
|
36
|
+
}
|
|
37
|
+
async setPassword(password) {
|
|
38
|
+
const salt = await bcrypt_1.default.genSalt();
|
|
39
|
+
this.passwordHash = await bcrypt_1.default.hash(password, salt);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.User = User;
|
|
43
|
+
tslib_1.__decorate([
|
|
44
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
45
|
+
tslib_1.__metadata("design:type", String)
|
|
46
|
+
], User.prototype, "id", void 0);
|
|
47
|
+
tslib_1.__decorate([
|
|
48
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
49
|
+
tslib_1.__metadata("design:type", String)
|
|
50
|
+
], User.prototype, "firstName", void 0);
|
|
51
|
+
tslib_1.__decorate([
|
|
52
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
53
|
+
tslib_1.__metadata("design:type", String)
|
|
54
|
+
], User.prototype, "lastName", void 0);
|
|
55
|
+
tslib_1.__decorate([
|
|
56
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
57
|
+
(0, typeorm_1.Index)(),
|
|
58
|
+
tslib_1.__metadata("design:type", String)
|
|
59
|
+
], User.prototype, "email", void 0);
|
|
60
|
+
tslib_1.__decorate([
|
|
61
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
62
|
+
(0, typeorm_1.Index)(),
|
|
63
|
+
tslib_1.__metadata("design:type", Date)
|
|
64
|
+
], User.prototype, "emailVerifiedAt", void 0);
|
|
65
|
+
tslib_1.__decorate([
|
|
66
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
67
|
+
(0, typeorm_1.Index)(),
|
|
68
|
+
tslib_1.__metadata("design:type", String)
|
|
69
|
+
], User.prototype, "phone", void 0);
|
|
70
|
+
tslib_1.__decorate([
|
|
71
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
72
|
+
(0, typeorm_1.Index)(),
|
|
73
|
+
tslib_1.__metadata("design:type", Date)
|
|
74
|
+
], User.prototype, "phoneVerifiedAt", void 0);
|
|
75
|
+
tslib_1.__decorate([
|
|
76
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
77
|
+
tslib_1.__metadata("design:type", String)
|
|
78
|
+
], User.prototype, "passwordHash", void 0);
|
|
79
|
+
tslib_1.__decorate([
|
|
80
|
+
(0, typeorm_1.Column)({ default: false }),
|
|
81
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
82
|
+
], User.prototype, "isVerified", void 0);
|
|
83
|
+
tslib_1.__decorate([
|
|
84
|
+
(0, typeorm_1.Column)({ default: true }),
|
|
85
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
86
|
+
], User.prototype, "isActive", void 0);
|
|
87
|
+
tslib_1.__decorate([
|
|
88
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true, default: '{}' }),
|
|
89
|
+
tslib_1.__metadata("design:type", Object)
|
|
90
|
+
], User.prototype, "metadata", void 0);
|
|
91
|
+
tslib_1.__decorate([
|
|
92
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
93
|
+
tslib_1.__metadata("design:type", String)
|
|
94
|
+
], User.prototype, "tenantId", void 0);
|
|
95
|
+
tslib_1.__decorate([
|
|
96
|
+
(0, typeorm_1.Column)({ default: false }),
|
|
97
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
98
|
+
], User.prototype, "isMfaEnabled", void 0);
|
|
99
|
+
tslib_1.__decorate([
|
|
100
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
101
|
+
tslib_1.__metadata("design:type", String)
|
|
102
|
+
], User.prototype, "mfaRecoveryCode", void 0);
|
|
103
|
+
tslib_1.__decorate([
|
|
104
|
+
(0, typeorm_1.ManyToOne)(() => tenant_entity_1.Tenant, tenant => tenant.users),
|
|
105
|
+
tslib_1.__metadata("design:type", tenant_entity_1.Tenant)
|
|
106
|
+
], User.prototype, "tenant", void 0);
|
|
107
|
+
tslib_1.__decorate([
|
|
108
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
109
|
+
tslib_1.__metadata("design:type", Date)
|
|
110
|
+
], User.prototype, "createdAt", void 0);
|
|
111
|
+
tslib_1.__decorate([
|
|
112
|
+
(0, typeorm_1.UpdateDateColumn)(),
|
|
113
|
+
tslib_1.__metadata("design:type", Date)
|
|
114
|
+
], User.prototype, "updatedAt", void 0);
|
|
115
|
+
tslib_1.__decorate([
|
|
116
|
+
(0, typeorm_1.OneToMany)(() => auth_identity_entity_1.AuthIdentity, identity => identity.user),
|
|
117
|
+
tslib_1.__metadata("design:type", Array)
|
|
118
|
+
], User.prototype, "identities", void 0);
|
|
119
|
+
tslib_1.__decorate([
|
|
120
|
+
(0, typeorm_1.OneToMany)(() => mfa_secret_entity_1.MFASecret, mfaSecret => mfaSecret.user),
|
|
121
|
+
tslib_1.__metadata("design:type", Array)
|
|
122
|
+
], User.prototype, "mfaSecrets", void 0);
|
|
123
|
+
tslib_1.__decorate([
|
|
124
|
+
(0, typeorm_1.OneToMany)(() => session_entity_1.Session, session => session.user),
|
|
125
|
+
tslib_1.__metadata("design:type", Array)
|
|
126
|
+
], User.prototype, "sessions", void 0);
|
|
127
|
+
tslib_1.__decorate([
|
|
128
|
+
(0, typeorm_1.OneToMany)(() => otp_entity_1.OTP, otp => otp.user),
|
|
129
|
+
tslib_1.__metadata("design:type", Array)
|
|
130
|
+
], User.prototype, "otps", void 0);
|
|
131
|
+
tslib_1.__decorate([
|
|
132
|
+
(0, typeorm_1.OneToMany)(() => user_role_entity_1.UserRole, userRole => userRole.user),
|
|
133
|
+
tslib_1.__metadata("design:type", Array)
|
|
134
|
+
], User.prototype, "userRoles", void 0);
|
|
135
|
+
tslib_1.__decorate([
|
|
136
|
+
(0, typeorm_1.Index)('IDX_USER_EMAIL_TENANT', { unique: true }),
|
|
137
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
138
|
+
tslib_1.__metadata("design:type", String)
|
|
139
|
+
], User.prototype, "emailTenant", void 0);
|
|
140
|
+
tslib_1.__decorate([
|
|
141
|
+
(0, typeorm_1.Index)('IDX_USER_PHONE_TENANT', { unique: true }),
|
|
142
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
143
|
+
tslib_1.__metadata("design:type", String)
|
|
144
|
+
], User.prototype, "phoneTenant", void 0);
|
|
145
|
+
tslib_1.__decorate([
|
|
146
|
+
(0, typeorm_1.BeforeInsert)(),
|
|
147
|
+
(0, typeorm_1.BeforeUpdate)(),
|
|
148
|
+
tslib_1.__metadata("design:type", Function),
|
|
149
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
150
|
+
tslib_1.__metadata("design:returntype", void 0)
|
|
151
|
+
], User.prototype, "updateTenantFields", null);
|
|
152
|
+
exports.User = User = tslib_1.__decorate([
|
|
153
|
+
(0, typeorm_1.Entity)('nest_auth_users')
|
|
154
|
+
], User);
|
|
155
|
+
//# sourceMappingURL=user.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/entities/user.entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { JwtService } from '../services/jwt.service';
|
|
4
|
+
import { AuthService } from '../services/auth.service';
|
|
5
|
+
import { BaseSessionService } from '../services/session/base-session.service';
|
|
6
|
+
import { CookieService } from '../services/cookie.service';
|
|
7
|
+
export declare class AuthGuard {
|
|
8
|
+
private jwtService;
|
|
9
|
+
private authService;
|
|
10
|
+
private sessionService;
|
|
11
|
+
private cookieService;
|
|
12
|
+
private reflector;
|
|
13
|
+
constructor(jwtService: JwtService, authService: AuthService, sessionService: BaseSessionService, cookieService: CookieService, reflector: Reflector);
|
|
14
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
15
|
+
private extractTokenFromRequest;
|
|
16
|
+
private extractRefreshToken;
|
|
17
|
+
private checkMfa;
|
|
18
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthGuard = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const auth_constants_1 = require("../auth.constants");
|
|
7
|
+
const skip_mfa_decorator_1 = require("../decorators/skip-mfa.decorator");
|
|
8
|
+
const core_1 = require("@nestjs/core");
|
|
9
|
+
const jwt_service_1 = require("../services/jwt.service");
|
|
10
|
+
const auth_service_1 = require("../services/auth.service");
|
|
11
|
+
const base_session_service_1 = require("../services/session/base-session.service");
|
|
12
|
+
const cookie_service_1 = require("../services/cookie.service");
|
|
13
|
+
let AuthGuard = class AuthGuard {
|
|
14
|
+
constructor(jwtService, authService, sessionService, cookieService, reflector) {
|
|
15
|
+
this.jwtService = jwtService;
|
|
16
|
+
this.authService = authService;
|
|
17
|
+
this.sessionService = sessionService;
|
|
18
|
+
this.cookieService = cookieService;
|
|
19
|
+
this.reflector = reflector;
|
|
20
|
+
}
|
|
21
|
+
async canActivate(context) {
|
|
22
|
+
const request = context.switchToHttp().getRequest();
|
|
23
|
+
const response = context.switchToHttp().getResponse();
|
|
24
|
+
const accessToken = this.extractTokenFromRequest(request);
|
|
25
|
+
if (!accessToken) {
|
|
26
|
+
throw new common_1.UnauthorizedException({
|
|
27
|
+
message: 'No token provided',
|
|
28
|
+
code: auth_constants_1.UNAUTHORIZED_EXCEPTION_CODE
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const payload = await this.jwtService.verifyToken(accessToken);
|
|
33
|
+
if (payload.type === 'access') {
|
|
34
|
+
const session = await this.sessionService.getSession(payload.sessionId);
|
|
35
|
+
if (!session) {
|
|
36
|
+
throw new common_1.UnauthorizedException({
|
|
37
|
+
message: 'Session not found',
|
|
38
|
+
code: auth_constants_1.UNAUTHORIZED_EXCEPTION_CODE
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
request.user = payload;
|
|
42
|
+
request.session = session;
|
|
43
|
+
await this.checkMfa(context, payload);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
throw new common_1.UnauthorizedException({
|
|
48
|
+
message: 'Invalid token',
|
|
49
|
+
code: auth_constants_1.UNAUTHORIZED_EXCEPTION_CODE
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const refreshToken = this.extractRefreshToken(request);
|
|
55
|
+
const newSession = await this.authService.refreshToken(refreshToken);
|
|
56
|
+
this.cookieService.setTokens(response, newSession.accessToken, newSession.refreshToken);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
extractTokenFromRequest(request) {
|
|
61
|
+
const tokenFromCookie = request.cookies?.[auth_constants_1.ACCESS_TOKEN_COOKIE_NAME];
|
|
62
|
+
if (tokenFromCookie) {
|
|
63
|
+
return tokenFromCookie;
|
|
64
|
+
}
|
|
65
|
+
const authHeader = request.headers.authorization;
|
|
66
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
67
|
+
return authHeader.substring(7);
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
extractRefreshToken(request) {
|
|
72
|
+
const tokenFromCookie = request.cookies?.[auth_constants_1.REFRESH_TOKEN_COOKIE_NAME];
|
|
73
|
+
if (tokenFromCookie) {
|
|
74
|
+
return tokenFromCookie;
|
|
75
|
+
}
|
|
76
|
+
const authHeader = request.headers['x-refresh-token'];
|
|
77
|
+
if (authHeader) {
|
|
78
|
+
return authHeader;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
async checkMfa(context, payload) {
|
|
83
|
+
const skipMfa = this.reflector.getAllAndOverride(skip_mfa_decorator_1.SKIP_MFA_KEY, [
|
|
84
|
+
context.getHandler(),
|
|
85
|
+
context.getClass(),
|
|
86
|
+
]);
|
|
87
|
+
const isMfaEnabled = payload.isMfaEnabled;
|
|
88
|
+
const isMfaVerified = payload.isMfaVerified;
|
|
89
|
+
if (isMfaEnabled && !isMfaVerified && !skipMfa) {
|
|
90
|
+
throw new common_1.UnauthorizedException({
|
|
91
|
+
message: 'Multi-factor authentication is required',
|
|
92
|
+
code: auth_constants_1.UNAUTHORIZED_EXCEPTION_CODE
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
exports.AuthGuard = AuthGuard;
|
|
98
|
+
exports.AuthGuard = AuthGuard = tslib_1.__decorate([
|
|
99
|
+
(0, common_1.Injectable)(),
|
|
100
|
+
tslib_1.__metadata("design:paramtypes", [jwt_service_1.JwtService,
|
|
101
|
+
auth_service_1.AuthService,
|
|
102
|
+
base_session_service_1.BaseSessionService,
|
|
103
|
+
cookie_service_1.CookieService,
|
|
104
|
+
core_1.Reflector])
|
|
105
|
+
], AuthGuard);
|
|
106
|
+
//# sourceMappingURL=auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/guards/auth.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { CookieService } from '../services/cookie.service';
|
|
4
|
+
import { BaseSessionService } from '../services/session/base-session.service';
|
|
5
|
+
export declare class TokenInterceptor implements NestInterceptor {
|
|
6
|
+
private readonly sessionService;
|
|
7
|
+
private readonly cookieService;
|
|
8
|
+
constructor(sessionService: BaseSessionService, cookieService: CookieService);
|
|
9
|
+
intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenInterceptor = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const operators_1 = require("rxjs/operators");
|
|
7
|
+
const cookie_service_1 = require("../services/cookie.service");
|
|
8
|
+
const base_session_service_1 = require("../services/session/base-session.service");
|
|
9
|
+
let TokenInterceptor = class TokenInterceptor {
|
|
10
|
+
constructor(sessionService, cookieService) {
|
|
11
|
+
this.sessionService = sessionService;
|
|
12
|
+
this.cookieService = cookieService;
|
|
13
|
+
}
|
|
14
|
+
async intercept(context, next) {
|
|
15
|
+
const request = context.switchToHttp().getRequest();
|
|
16
|
+
const response = context.switchToHttp().getResponse();
|
|
17
|
+
return next.handle().pipe((0, operators_1.tap)(async () => {
|
|
18
|
+
if (request.newTokens) {
|
|
19
|
+
const { accessToken, refreshToken } = request.newTokens;
|
|
20
|
+
this.cookieService.setTokens(response, accessToken, refreshToken);
|
|
21
|
+
if (request.user) {
|
|
22
|
+
const session = await this.sessionService.getSession(request.user.id);
|
|
23
|
+
if (session) {
|
|
24
|
+
await this.sessionService.updateSession(request.user.id, {
|
|
25
|
+
...session,
|
|
26
|
+
refreshToken,
|
|
27
|
+
lastActive: new Date(),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
exports.TokenInterceptor = TokenInterceptor;
|
|
36
|
+
exports.TokenInterceptor = TokenInterceptor = tslib_1.__decorate([
|
|
37
|
+
(0, common_1.Injectable)(),
|
|
38
|
+
tslib_1.__metadata("design:paramtypes", [base_session_service_1.BaseSessionService,
|
|
39
|
+
cookie_service_1.CookieService])
|
|
40
|
+
], TokenInterceptor);
|
|
41
|
+
//# sourceMappingURL=token.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.interceptor.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/interceptors/token.interceptor.ts"],"names":[],"mappings":";;;;AAAA,2CAA4F;AAE5F,8CAAqC;AAGrC,+DAA2D;AAC3D,mFAA8E;AAGvE,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACzB,YACqB,cAAkC,EAClC,aAA4B;QAD5B,mBAAc,GAAd,cAAc,CAAoB;QAClC,kBAAa,GAAb,aAAa,CAAe;IAC7C,CAAC;IAEL,KAAK,CAAC,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAEhE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACrB,IAAA,eAAG,EAAC,KAAK,IAAI,EAAE;YAEX,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;gBAGxD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;gBAGlE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtE,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;4BACrD,GAAG,OAAO;4BACV,YAAY;4BACZ,UAAU,EAAE,IAAI,IAAI,EAAE;yBACzB,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CACL,CAAC;IACN,CAAC;CACJ,CAAA;AAlCY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;6CAG4B,yCAAkB;QACnB,8BAAa;GAHxC,gBAAgB,CAkC5B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { BaseAuthProvider } from '../providers/base-auth.provider';
|
|
3
|
+
import { MFAOptions } from './mfa-options.interface';
|
|
4
|
+
import { CookieOptions, SessionOptions } from './session-options.interface';
|
|
5
|
+
export interface AuthModuleOptions {
|
|
6
|
+
accessTokenType?: 'header' | 'cookie';
|
|
7
|
+
cookieOptions?: CookieOptions;
|
|
8
|
+
jwt: {
|
|
9
|
+
secret: string;
|
|
10
|
+
accessTokenExpiresIn?: number | string;
|
|
11
|
+
refreshTokenExpiresIn?: number | string;
|
|
12
|
+
};
|
|
13
|
+
google?: {
|
|
14
|
+
clientId: string;
|
|
15
|
+
clientSecret: string;
|
|
16
|
+
redirectUri: string;
|
|
17
|
+
};
|
|
18
|
+
facebook?: {
|
|
19
|
+
appId: string;
|
|
20
|
+
appSecret: string;
|
|
21
|
+
redirectUri: string;
|
|
22
|
+
};
|
|
23
|
+
apple?: {
|
|
24
|
+
clientId: string;
|
|
25
|
+
teamId: string;
|
|
26
|
+
keyId: string;
|
|
27
|
+
privateKey: string;
|
|
28
|
+
privateKeyMethod?: string;
|
|
29
|
+
redirectUri: string;
|
|
30
|
+
};
|
|
31
|
+
phoneAuth?: {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
};
|
|
34
|
+
emailAuth?: {
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
};
|
|
37
|
+
mfa?: MFAOptions;
|
|
38
|
+
session?: SessionOptions;
|
|
39
|
+
customAuthProviders?: BaseAuthProvider[];
|
|
40
|
+
passwordResetOtpExpiresIn?: number | string;
|
|
41
|
+
}
|
|
42
|
+
export interface AuthModuleAsyncOptions {
|
|
43
|
+
imports?: any[];
|
|
44
|
+
useFactory: (...args: any[]) => Promise<AuthModuleOptions> | AuthModuleOptions;
|
|
45
|
+
inject?: any[];
|
|
46
|
+
useClass?: Type<AuthModuleOptionsFactory>;
|
|
47
|
+
useExisting?: Type<AuthModuleOptionsFactory>;
|
|
48
|
+
}
|
|
49
|
+
export interface AuthModuleOptionsFactory {
|
|
50
|
+
createAuthModuleOptions(): Promise<AuthModuleOptions> | AuthModuleOptions;
|
|
51
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-module-options.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/interfaces/auth-module-options.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface MFAOptions {
|
|
2
|
+
enabled?: boolean;
|
|
3
|
+
required?: boolean;
|
|
4
|
+
methods?: MFAMethodEnum[];
|
|
5
|
+
otpLength?: number;
|
|
6
|
+
totp?: {
|
|
7
|
+
issuer: string;
|
|
8
|
+
period: number;
|
|
9
|
+
};
|
|
10
|
+
sms?: {
|
|
11
|
+
provider: string;
|
|
12
|
+
template: string;
|
|
13
|
+
};
|
|
14
|
+
email?: {
|
|
15
|
+
template: string;
|
|
16
|
+
};
|
|
17
|
+
allowUserToggle?: boolean;
|
|
18
|
+
allowMethodSelection?: boolean;
|
|
19
|
+
otpExpiresIn?: string | number;
|
|
20
|
+
}
|
|
21
|
+
export declare enum MFAMethodEnum {
|
|
22
|
+
TOTP = "totp",
|
|
23
|
+
SMS = "sms",
|
|
24
|
+
EMAIL = "email"
|
|
25
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MFAMethodEnum = void 0;
|
|
4
|
+
var MFAMethodEnum;
|
|
5
|
+
(function (MFAMethodEnum) {
|
|
6
|
+
MFAMethodEnum["TOTP"] = "totp";
|
|
7
|
+
MFAMethodEnum["SMS"] = "sms";
|
|
8
|
+
MFAMethodEnum["EMAIL"] = "email";
|
|
9
|
+
})(MFAMethodEnum || (exports.MFAMethodEnum = MFAMethodEnum = {}));
|
|
10
|
+
//# sourceMappingURL=mfa-options.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mfa-options.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/interfaces/mfa-options.interface.ts"],"names":[],"mappings":";;;AAyCA,IAAY,aAIX;AAJD,WAAY,aAAa;IACrB,8BAAa,CAAA;IACb,4BAAW,CAAA;IACX,gCAAe,CAAA;AACnB,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CookieOptions as ExpressCookieOptions } from 'express';
|
|
2
|
+
export declare enum SessionStorageType {
|
|
3
|
+
REDIS = "redis",
|
|
4
|
+
DATABASE = "database"
|
|
5
|
+
}
|
|
6
|
+
export interface SessionOptions {
|
|
7
|
+
storageType: SessionStorageType;
|
|
8
|
+
redisUrl?: string;
|
|
9
|
+
sessionExpiry?: number | string;
|
|
10
|
+
refreshTokenExpiry?: number | string;
|
|
11
|
+
}
|
|
12
|
+
export type CookieOptions = Omit<ExpressCookieOptions, 'maxAge'>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionStorageType = void 0;
|
|
4
|
+
var SessionStorageType;
|
|
5
|
+
(function (SessionStorageType) {
|
|
6
|
+
SessionStorageType["REDIS"] = "redis";
|
|
7
|
+
SessionStorageType["DATABASE"] = "database";
|
|
8
|
+
})(SessionStorageType || (exports.SessionStorageType = SessionStorageType = {}));
|
|
9
|
+
//# sourceMappingURL=session-options.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-options.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/interfaces/session-options.interface.ts"],"names":[],"mappings":";;;AAEA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC1B,qCAAe,CAAA;IACf,2CAAqB,CAAA;AACzB,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B"}
|