@ambushsoftworks/nestjs-auth-graphql 0.1.3
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/LICENSE +21 -0
- package/README.md +711 -0
- package/dist/auth.module.d.ts +61 -0
- package/dist/auth.module.d.ts.map +1 -0
- package/dist/auth.module.js +190 -0
- package/dist/auth.module.js.map +1 -0
- package/dist/decorators/current-user.decorator.d.ts +2 -0
- package/dist/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/decorators/current-user.decorator.js +10 -0
- package/dist/decorators/current-user.decorator.js.map +1 -0
- package/dist/dto/account-lock-status.dto.d.ts +5 -0
- package/dist/dto/account-lock-status.dto.d.ts.map +1 -0
- package/dist/dto/account-lock-status.dto.js +32 -0
- package/dist/dto/account-lock-status.dto.js.map +1 -0
- package/dist/dto/auth-response.dto.d.ts +7 -0
- package/dist/dto/auth-response.dto.d.ts.map +1 -0
- package/dist/dto/auth-response.dto.js +33 -0
- package/dist/dto/auth-response.dto.js.map +1 -0
- package/dist/dto/biometric-challenge.dto.d.ts +6 -0
- package/dist/dto/biometric-challenge.dto.d.ts.map +1 -0
- package/dist/dto/biometric-challenge.dto.js +32 -0
- package/dist/dto/biometric-challenge.dto.js.map +1 -0
- package/dist/dto/biometric-credential.dto.d.ts +10 -0
- package/dist/dto/biometric-credential.dto.d.ts.map +1 -0
- package/dist/dto/biometric-credential.dto.js +48 -0
- package/dist/dto/biometric-credential.dto.js.map +1 -0
- package/dist/dto/biometric-login.input.d.ts +5 -0
- package/dist/dto/biometric-login.input.d.ts.map +1 -0
- package/dist/dto/biometric-login.input.js +33 -0
- package/dist/dto/biometric-login.input.js.map +1 -0
- package/dist/dto/biometric-status.dto.d.ts +5 -0
- package/dist/dto/biometric-status.dto.d.ts.map +1 -0
- package/dist/dto/biometric-status.dto.js +28 -0
- package/dist/dto/biometric-status.dto.js.map +1 -0
- package/dist/dto/complete-facebook-signup.input.d.ts +6 -0
- package/dist/dto/complete-facebook-signup.input.d.ts.map +1 -0
- package/dist/dto/complete-facebook-signup.input.js +45 -0
- package/dist/dto/complete-facebook-signup.input.js.map +1 -0
- package/dist/dto/enable-biometric.input.d.ts +5 -0
- package/dist/dto/enable-biometric.input.d.ts.map +1 -0
- package/dist/dto/enable-biometric.input.js +33 -0
- package/dist/dto/enable-biometric.input.js.map +1 -0
- package/dist/dto/enroll-biometric.input.d.ts +6 -0
- package/dist/dto/enroll-biometric.input.d.ts.map +1 -0
- package/dist/dto/enroll-biometric.input.js +41 -0
- package/dist/dto/enroll-biometric.input.js.map +1 -0
- package/dist/dto/jwt-payload.interface.d.ts +5 -0
- package/dist/dto/jwt-payload.interface.d.ts.map +1 -0
- package/dist/dto/jwt-payload.interface.js +3 -0
- package/dist/dto/jwt-payload.interface.js.map +1 -0
- package/dist/dto/link-google-account.input.d.ts +5 -0
- package/dist/dto/link-google-account.input.d.ts.map +1 -0
- package/dist/dto/link-google-account.input.js +38 -0
- package/dist/dto/link-google-account.input.js.map +1 -0
- package/dist/dto/login.input.d.ts +5 -0
- package/dist/dto/login.input.d.ts.map +1 -0
- package/dist/dto/login.input.js +31 -0
- package/dist/dto/login.input.js.map +1 -0
- package/dist/dto/logout-response.dto.d.ts +9 -0
- package/dist/dto/logout-response.dto.d.ts.map +1 -0
- package/dist/dto/logout-response.dto.js +42 -0
- package/dist/dto/logout-response.dto.js.map +1 -0
- package/dist/dto/logout.input.d.ts +4 -0
- package/dist/dto/logout.input.d.ts.map +1 -0
- package/dist/dto/logout.input.js +27 -0
- package/dist/dto/logout.input.js.map +1 -0
- package/dist/dto/phone-verification-response.dto.d.ts +24 -0
- package/dist/dto/phone-verification-response.dto.d.ts.map +1 -0
- package/dist/dto/phone-verification-response.dto.js +98 -0
- package/dist/dto/phone-verification-response.dto.js.map +1 -0
- package/dist/dto/phone-verification-status.dto.d.ts +9 -0
- package/dist/dto/phone-verification-status.dto.d.ts.map +1 -0
- package/dist/dto/phone-verification-status.dto.js +44 -0
- package/dist/dto/phone-verification-status.dto.js.map +1 -0
- package/dist/dto/refresh-token.input.d.ts +4 -0
- package/dist/dto/refresh-token.input.d.ts.map +1 -0
- package/dist/dto/refresh-token.input.js +27 -0
- package/dist/dto/refresh-token.input.js.map +1 -0
- package/dist/dto/remove-biometric-device-response.dto.d.ts +5 -0
- package/dist/dto/remove-biometric-device-response.dto.d.ts.map +1 -0
- package/dist/dto/remove-biometric-device-response.dto.js +28 -0
- package/dist/dto/remove-biometric-device-response.dto.js.map +1 -0
- package/dist/dto/send-phone-verification.input.d.ts +5 -0
- package/dist/dto/send-phone-verification.input.d.ts.map +1 -0
- package/dist/dto/send-phone-verification.input.js +36 -0
- package/dist/dto/send-phone-verification.input.js.map +1 -0
- package/dist/dto/signup.input.d.ts +5 -0
- package/dist/dto/signup.input.d.ts.map +1 -0
- package/dist/dto/signup.input.js +36 -0
- package/dist/dto/signup.input.js.map +1 -0
- package/dist/dto/unlink-social-account-response.dto.d.ts +8 -0
- package/dist/dto/unlink-social-account-response.dto.d.ts.map +1 -0
- package/dist/dto/unlink-social-account-response.dto.js +37 -0
- package/dist/dto/unlink-social-account-response.dto.js.map +1 -0
- package/dist/dto/unlink-social-account.input.d.ts +4 -0
- package/dist/dto/unlink-social-account.input.d.ts.map +1 -0
- package/dist/dto/unlink-social-account.input.js +28 -0
- package/dist/dto/unlink-social-account.input.js.map +1 -0
- package/dist/dto/verify-biometric-signature.input.d.ts +6 -0
- package/dist/dto/verify-biometric-signature.input.d.ts.map +1 -0
- package/dist/dto/verify-biometric-signature.input.js +39 -0
- package/dist/dto/verify-biometric-signature.input.js.map +1 -0
- package/dist/dto/verify-email-response.dto.d.ts +5 -0
- package/dist/dto/verify-email-response.dto.d.ts.map +1 -0
- package/dist/dto/verify-email-response.dto.js +28 -0
- package/dist/dto/verify-email-response.dto.js.map +1 -0
- package/dist/dto/verify-email.input.d.ts +5 -0
- package/dist/dto/verify-email.input.d.ts.map +1 -0
- package/dist/dto/verify-email.input.js +33 -0
- package/dist/dto/verify-email.input.js.map +1 -0
- package/dist/dto/verify-phone.input.d.ts +5 -0
- package/dist/dto/verify-phone.input.d.ts.map +1 -0
- package/dist/dto/verify-phone.input.js +36 -0
- package/dist/dto/verify-phone.input.js.map +1 -0
- package/dist/entities/auth-user.entity.d.ts +23 -0
- package/dist/entities/auth-user.entity.d.ts.map +1 -0
- package/dist/entities/auth-user.entity.js +87 -0
- package/dist/entities/auth-user.entity.js.map +1 -0
- package/dist/exceptions/account-locked.exception.d.ts +5 -0
- package/dist/exceptions/account-locked.exception.d.ts.map +1 -0
- package/dist/exceptions/account-locked.exception.js +18 -0
- package/dist/exceptions/account-locked.exception.js.map +1 -0
- package/dist/exceptions/oauth.exceptions.d.ts +23 -0
- package/dist/exceptions/oauth.exceptions.d.ts.map +1 -0
- package/dist/exceptions/oauth.exceptions.js +84 -0
- package/dist/exceptions/oauth.exceptions.js.map +1 -0
- package/dist/exceptions/verification.exceptions.d.ts +14 -0
- package/dist/exceptions/verification.exceptions.d.ts.map +1 -0
- package/dist/exceptions/verification.exceptions.js +43 -0
- package/dist/exceptions/verification.exceptions.js.map +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +7 -0
- package/dist/guards/jwt-auth.guard.d.ts.map +1 -0
- package/dist/guards/jwt-auth.guard.js +23 -0
- package/dist/guards/jwt-auth.guard.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.d.ts +11 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.js +3 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.js.map +1 -0
- package/dist/interfaces/auth-logger.interface.d.ts +45 -0
- package/dist/interfaces/auth-logger.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-logger.interface.js +42 -0
- package/dist/interfaces/auth-logger.interface.js.map +1 -0
- package/dist/interfaces/auth-user.interface.d.ts +32 -0
- package/dist/interfaces/auth-user.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-user.interface.js +17 -0
- package/dist/interfaces/auth-user.interface.js.map +1 -0
- package/dist/interfaces/biometric-repository.interface.d.ts +22 -0
- package/dist/interfaces/biometric-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/biometric-repository.interface.js +3 -0
- package/dist/interfaces/biometric-repository.interface.js.map +1 -0
- package/dist/interfaces/brute-force-repository.interface.d.ts +11 -0
- package/dist/interfaces/brute-force-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/brute-force-repository.interface.js +3 -0
- package/dist/interfaces/brute-force-repository.interface.js.map +1 -0
- package/dist/interfaces/email-service.interface.d.ts +10 -0
- package/dist/interfaces/email-service.interface.d.ts.map +1 -0
- package/dist/interfaces/email-service.interface.js +3 -0
- package/dist/interfaces/email-service.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +12 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +28 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/refresh-token-repository.interface.d.ts +18 -0
- package/dist/interfaces/refresh-token-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/refresh-token-repository.interface.js +3 -0
- package/dist/interfaces/refresh-token-repository.interface.js.map +1 -0
- package/dist/interfaces/sms-service.interface.d.ts +8 -0
- package/dist/interfaces/sms-service.interface.d.ts.map +1 -0
- package/dist/interfaces/sms-service.interface.js +3 -0
- package/dist/interfaces/sms-service.interface.js.map +1 -0
- package/dist/interfaces/storage-service.interface.d.ts +5 -0
- package/dist/interfaces/storage-service.interface.d.ts.map +1 -0
- package/dist/interfaces/storage-service.interface.js +3 -0
- package/dist/interfaces/storage-service.interface.js.map +1 -0
- package/dist/interfaces/user-repository.interface.d.ts +42 -0
- package/dist/interfaces/user-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/user-repository.interface.js +3 -0
- package/dist/interfaces/user-repository.interface.js.map +1 -0
- package/dist/interfaces/verification-repository.interface.d.ts +11 -0
- package/dist/interfaces/verification-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/verification-repository.interface.js +3 -0
- package/dist/interfaces/verification-repository.interface.js.map +1 -0
- package/dist/repositories/noop-biometric.repository.d.ts +23 -0
- package/dist/repositories/noop-biometric.repository.d.ts.map +1 -0
- package/dist/repositories/noop-biometric.repository.js +42 -0
- package/dist/repositories/noop-biometric.repository.js.map +1 -0
- package/dist/repositories/noop-brute-force.repository.d.ts +12 -0
- package/dist/repositories/noop-brute-force.repository.d.ts.map +1 -0
- package/dist/repositories/noop-brute-force.repository.js +34 -0
- package/dist/repositories/noop-brute-force.repository.js.map +1 -0
- package/dist/repositories/noop-verification.repository.d.ts +12 -0
- package/dist/repositories/noop-verification.repository.d.ts.map +1 -0
- package/dist/repositories/noop-verification.repository.js +30 -0
- package/dist/repositories/noop-verification.repository.js.map +1 -0
- package/dist/resolvers/auth.resolver.d.ts +66 -0
- package/dist/resolvers/auth.resolver.d.ts.map +1 -0
- package/dist/resolvers/auth.resolver.js +455 -0
- package/dist/resolvers/auth.resolver.js.map +1 -0
- package/dist/resolvers/oauth.controller.d.ts +32 -0
- package/dist/resolvers/oauth.controller.d.ts.map +1 -0
- package/dist/resolvers/oauth.controller.js +216 -0
- package/dist/resolvers/oauth.controller.js.map +1 -0
- package/dist/services/auth.service.d.ts +104 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +720 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/biometric-auth.service.d.ts +26 -0
- package/dist/services/biometric-auth.service.d.ts.map +1 -0
- package/dist/services/biometric-auth.service.js +108 -0
- package/dist/services/biometric-auth.service.js.map +1 -0
- package/dist/services/biometric-verification.service.d.ts +9 -0
- package/dist/services/biometric-verification.service.d.ts.map +1 -0
- package/dist/services/biometric-verification.service.js +78 -0
- package/dist/services/biometric-verification.service.js.map +1 -0
- package/dist/services/brute-force-protection.service.d.ts +23 -0
- package/dist/services/brute-force-protection.service.d.ts.map +1 -0
- package/dist/services/brute-force-protection.service.js +105 -0
- package/dist/services/brute-force-protection.service.js.map +1 -0
- package/dist/services/console-logger.service.d.ts +9 -0
- package/dist/services/console-logger.service.d.ts.map +1 -0
- package/dist/services/console-logger.service.js +46 -0
- package/dist/services/console-logger.service.js.map +1 -0
- package/dist/services/encryption.service.d.ts +14 -0
- package/dist/services/encryption.service.d.ts.map +1 -0
- package/dist/services/encryption.service.js +98 -0
- package/dist/services/encryption.service.js.map +1 -0
- package/dist/services/noop-email.service.d.ts +12 -0
- package/dist/services/noop-email.service.d.ts.map +1 -0
- package/dist/services/noop-email.service.js +42 -0
- package/dist/services/noop-email.service.js.map +1 -0
- package/dist/services/noop-sms.service.d.ts +8 -0
- package/dist/services/noop-sms.service.d.ts.map +1 -0
- package/dist/services/noop-sms.service.js +38 -0
- package/dist/services/noop-sms.service.js.map +1 -0
- package/dist/services/oauth-linking-token.service.d.ts +24 -0
- package/dist/services/oauth-linking-token.service.d.ts.map +1 -0
- package/dist/services/oauth-linking-token.service.js +79 -0
- package/dist/services/oauth-linking-token.service.js.map +1 -0
- package/dist/services/oauth-state.service.d.ts +19 -0
- package/dist/services/oauth-state.service.d.ts.map +1 -0
- package/dist/services/oauth-state.service.js +91 -0
- package/dist/services/oauth-state.service.js.map +1 -0
- package/dist/services/refresh-token.service.d.ts +29 -0
- package/dist/services/refresh-token.service.d.ts.map +1 -0
- package/dist/services/refresh-token.service.js +106 -0
- package/dist/services/refresh-token.service.js.map +1 -0
- package/dist/services/sendgrid-email.service.d.ts +33 -0
- package/dist/services/sendgrid-email.service.d.ts.map +1 -0
- package/dist/services/sendgrid-email.service.js +1002 -0
- package/dist/services/sendgrid-email.service.js.map +1 -0
- package/dist/services/twilio-sms.service.d.ts +13 -0
- package/dist/services/twilio-sms.service.d.ts.map +1 -0
- package/dist/services/twilio-sms.service.js +84 -0
- package/dist/services/twilio-sms.service.js.map +1 -0
- package/dist/services/verification.service.d.ts +27 -0
- package/dist/services/verification.service.d.ts.map +1 -0
- package/dist/services/verification.service.js +179 -0
- package/dist/services/verification.service.js.map +1 -0
- package/dist/strategies/facebook.strategy.d.ts +18 -0
- package/dist/strategies/facebook.strategy.d.ts.map +1 -0
- package/dist/strategies/facebook.strategy.js +96 -0
- package/dist/strategies/facebook.strategy.js.map +1 -0
- package/dist/strategies/google.strategy.d.ts +17 -0
- package/dist/strategies/google.strategy.d.ts.map +1 -0
- package/dist/strategies/google.strategy.js +73 -0
- package/dist/strategies/google.strategy.js.map +1 -0
- package/dist/strategies/jwt.strategy.d.ts +14 -0
- package/dist/strategies/jwt.strategy.d.ts.map +1 -0
- package/dist/strategies/jwt.strategy.js +45 -0
- package/dist/strategies/jwt.strategy.js.map +1 -0
- package/dist/utils/provider-helpers.d.ts +12 -0
- package/dist/utils/provider-helpers.d.ts.map +1 -0
- package/dist/utils/provider-helpers.js +33 -0
- package/dist/utils/provider-helpers.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { JwtService } from '@nestjs/jwt';
|
|
2
|
+
import { RefreshTokenService } from './refresh-token.service';
|
|
3
|
+
import { IUserRepository } from '../interfaces/user-repository.interface';
|
|
4
|
+
import { IRefreshTokenRepository } from '../interfaces/refresh-token-repository.interface';
|
|
5
|
+
import { IAuthUser } from '../interfaces/auth-user.interface';
|
|
6
|
+
import { IBiometricRepository } from '../interfaces/biometric-repository.interface';
|
|
7
|
+
export declare class BiometricAuthService {
|
|
8
|
+
private readonly userRepository;
|
|
9
|
+
private readonly refreshTokenRepository;
|
|
10
|
+
private readonly biometricRepository;
|
|
11
|
+
private readonly jwtService;
|
|
12
|
+
private readonly refreshTokenService;
|
|
13
|
+
constructor(userRepository: IUserRepository<IAuthUser>, refreshTokenRepository: IRefreshTokenRepository, biometricRepository: IBiometricRepository, jwtService: JwtService, refreshTokenService: RefreshTokenService);
|
|
14
|
+
enableBiometric(userId: string, deviceId: string, publicKey: string): Promise<boolean>;
|
|
15
|
+
disableBiometric(userId: string): Promise<boolean>;
|
|
16
|
+
authenticateWithBiometric(userId: string, deviceId: string): Promise<{
|
|
17
|
+
accessToken: string;
|
|
18
|
+
refreshToken: string;
|
|
19
|
+
}>;
|
|
20
|
+
private validateDeviceId;
|
|
21
|
+
getBiometricStatus(userId: string): Promise<{
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
deviceId: string | null;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=biometric-auth.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biometric-auth.service.d.ts","sourceRoot":"","sources":["../../src/services/biometric-auth.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AAuBpF,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;gBANnB,cAAc,EAAE,eAAe,CAAC,SAAS,CAAC,EAE1C,sBAAsB,EAAE,uBAAuB,EAE/C,mBAAmB,EAAE,oBAAoB,EACzC,UAAU,EAAE,UAAU,EACtB,mBAAmB,EAAE,mBAAmB;IAUrD,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCtF,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BlD,yBAAyB,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAiEzD,OAAO,CAAC,gBAAgB;IAsBlB,kBAAkB,CACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAgB1D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.BiometricAuthService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const jwt_1 = require("@nestjs/jwt");
|
|
18
|
+
const refresh_token_service_1 = require("./refresh-token.service");
|
|
19
|
+
let BiometricAuthService = class BiometricAuthService {
|
|
20
|
+
constructor(userRepository, refreshTokenRepository, biometricRepository, jwtService, refreshTokenService) {
|
|
21
|
+
this.userRepository = userRepository;
|
|
22
|
+
this.refreshTokenRepository = refreshTokenRepository;
|
|
23
|
+
this.biometricRepository = biometricRepository;
|
|
24
|
+
this.jwtService = jwtService;
|
|
25
|
+
this.refreshTokenService = refreshTokenService;
|
|
26
|
+
}
|
|
27
|
+
async enableBiometric(userId, deviceId, publicKey) {
|
|
28
|
+
if (!deviceId || deviceId.trim().length === 0) {
|
|
29
|
+
throw new common_1.BadRequestException('Device ID is required');
|
|
30
|
+
}
|
|
31
|
+
const user = await this.userRepository.findById(userId);
|
|
32
|
+
if (!user) {
|
|
33
|
+
throw new common_1.UnauthorizedException('User not found');
|
|
34
|
+
}
|
|
35
|
+
await this.userRepository.enableBiometric(userId, deviceId, publicKey);
|
|
36
|
+
console.log(`[BIOMETRIC_AUTH] Biometric enabled for user ${userId} on device ${deviceId}`);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
async disableBiometric(userId) {
|
|
40
|
+
const user = await this.userRepository.findById(userId);
|
|
41
|
+
if (!user) {
|
|
42
|
+
throw new common_1.UnauthorizedException('User not found');
|
|
43
|
+
}
|
|
44
|
+
await this.userRepository.disableBiometric(userId);
|
|
45
|
+
console.log(`[BIOMETRIC_AUTH] Biometric disabled for user ${userId}`);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
async authenticateWithBiometric(userId, deviceId) {
|
|
49
|
+
if (!deviceId || deviceId.trim().length === 0) {
|
|
50
|
+
throw new common_1.UnauthorizedException('Device ID is required');
|
|
51
|
+
}
|
|
52
|
+
const user = await this.userRepository.findById(userId);
|
|
53
|
+
if (!user) {
|
|
54
|
+
throw new common_1.UnauthorizedException('Invalid biometric credentials');
|
|
55
|
+
}
|
|
56
|
+
const credentials = await this.biometricRepository.listBiometricCredentials(userId);
|
|
57
|
+
if (credentials.length === 0) {
|
|
58
|
+
throw new common_1.UnauthorizedException('Biometric authentication not enabled');
|
|
59
|
+
}
|
|
60
|
+
const isValidDevice = credentials.some((cred) => cred.credentialId === deviceId);
|
|
61
|
+
if (!isValidDevice) {
|
|
62
|
+
throw new common_1.UnauthorizedException('Biometric authentication not enabled on this device');
|
|
63
|
+
}
|
|
64
|
+
const accessToken = this.jwtService.sign({
|
|
65
|
+
userId: user.id,
|
|
66
|
+
email: user.email,
|
|
67
|
+
});
|
|
68
|
+
const { token: refreshToken, hash: refreshTokenHash } = this.refreshTokenService.generateToken();
|
|
69
|
+
await this.refreshTokenRepository.create({
|
|
70
|
+
userId: user.id,
|
|
71
|
+
token: refreshToken,
|
|
72
|
+
hashedToken: refreshTokenHash,
|
|
73
|
+
expiresAt: this.refreshTokenService.getExpiryDate(),
|
|
74
|
+
});
|
|
75
|
+
await this.userRepository.updateLastBiometricLogin(userId);
|
|
76
|
+
console.log(`[BIOMETRIC_AUTH] Biometric login successful for user ${userId}`);
|
|
77
|
+
return { accessToken, refreshToken };
|
|
78
|
+
}
|
|
79
|
+
validateDeviceId(storedDeviceId, providedDeviceId) {
|
|
80
|
+
if (!storedDeviceId) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return storedDeviceId === providedDeviceId;
|
|
84
|
+
}
|
|
85
|
+
async getBiometricStatus(userId) {
|
|
86
|
+
const user = await this.userRepository.findById(userId);
|
|
87
|
+
if (!user) {
|
|
88
|
+
throw new common_1.UnauthorizedException('User not found');
|
|
89
|
+
}
|
|
90
|
+
const credentials = await this.biometricRepository.listBiometricCredentials(userId);
|
|
91
|
+
const enabled = credentials.length > 0;
|
|
92
|
+
const deviceId = credentials.length > 0 ? credentials[0].credentialId : null;
|
|
93
|
+
return {
|
|
94
|
+
enabled,
|
|
95
|
+
deviceId,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
exports.BiometricAuthService = BiometricAuthService;
|
|
100
|
+
exports.BiometricAuthService = BiometricAuthService = __decorate([
|
|
101
|
+
(0, common_1.Injectable)(),
|
|
102
|
+
__param(0, (0, common_1.Inject)('USER_REPOSITORY')),
|
|
103
|
+
__param(1, (0, common_1.Inject)('REFRESH_TOKEN_REPOSITORY')),
|
|
104
|
+
__param(2, (0, common_1.Inject)('BIOMETRIC_REPOSITORY')),
|
|
105
|
+
__metadata("design:paramtypes", [Object, Object, Object, jwt_1.JwtService,
|
|
106
|
+
refresh_token_service_1.RefreshTokenService])
|
|
107
|
+
], BiometricAuthService);
|
|
108
|
+
//# sourceMappingURL=biometric-auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biometric-auth.service.js","sourceRoot":"","sources":["../../src/services/biometric-auth.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class BiometricVerificationService {
|
|
2
|
+
private readonly logger;
|
|
3
|
+
private readonly supportedAlgorithms;
|
|
4
|
+
verifySignature(publicKeyPEM: string, challenge: string, signature: string): Promise<boolean>;
|
|
5
|
+
validatePublicKey(publicKeyPEM: string): Promise<boolean>;
|
|
6
|
+
private parsePublicKey;
|
|
7
|
+
getSupportedAlgorithms(): string[];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=biometric-verification.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biometric-verification.service.d.ts","sourceRoot":"","sources":["../../src/services/biometric-verification.service.ts"],"names":[],"mappings":"AA6BA,qBACa,4BAA4B;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IACxE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAa;IAiB3C,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IA2Cb,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwC/D,OAAO,CAAC,cAAc;IAiDtB,sBAAsB,IAAI,MAAM,EAAE;CAGnC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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 BiometricVerificationService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BiometricVerificationService = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
let BiometricVerificationService = BiometricVerificationService_1 = class BiometricVerificationService {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.logger = new common_1.Logger(BiometricVerificationService_1.name);
|
|
16
|
+
this.supportedAlgorithms = ['ES256'];
|
|
17
|
+
}
|
|
18
|
+
async verifySignature(publicKeyPEM, challenge, signature) {
|
|
19
|
+
try {
|
|
20
|
+
const publicKey = this.parsePublicKey(publicKeyPEM);
|
|
21
|
+
const challengeBuffer = Buffer.from(challenge, 'base64');
|
|
22
|
+
const signatureBuffer = Buffer.from(signature, 'base64');
|
|
23
|
+
const verify = (0, crypto_1.createVerify)('SHA256');
|
|
24
|
+
verify.update(challengeBuffer);
|
|
25
|
+
verify.end();
|
|
26
|
+
const isValid = verify.verify(publicKey, signatureBuffer);
|
|
27
|
+
this.logger.log(`[VERIFICATION] Signature verification: ${isValid ? 'VALID' : 'INVALID'}`);
|
|
28
|
+
return isValid;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
this.logger.error(`[VERIFICATION] Signature verification error: ${error.message}`);
|
|
32
|
+
throw new common_1.BadRequestException(`Invalid signature format: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async validatePublicKey(publicKeyPEM) {
|
|
36
|
+
try {
|
|
37
|
+
const publicKey = this.parsePublicKey(publicKeyPEM);
|
|
38
|
+
const keyDetails = publicKey.export({ type: 'spki', format: 'der' });
|
|
39
|
+
this.logger.log(`[VALIDATION] Public key validated successfully`);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.logger.error(`[VALIDATION] Public key validation failed: ${error.message}`);
|
|
44
|
+
throw new common_1.BadRequestException(`Invalid public key format: ${error.message}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
parsePublicKey(publicKeyPEM) {
|
|
48
|
+
try {
|
|
49
|
+
if (!publicKeyPEM.includes('BEGIN PUBLIC KEY')) {
|
|
50
|
+
throw new Error('Invalid PEM format: missing BEGIN PUBLIC KEY marker');
|
|
51
|
+
}
|
|
52
|
+
if (!publicKeyPEM.includes('END PUBLIC KEY')) {
|
|
53
|
+
throw new Error('Invalid PEM format: missing END PUBLIC KEY marker');
|
|
54
|
+
}
|
|
55
|
+
const publicKey = (0, crypto_1.createPublicKey)({
|
|
56
|
+
key: publicKeyPEM,
|
|
57
|
+
format: 'pem',
|
|
58
|
+
type: 'spki',
|
|
59
|
+
});
|
|
60
|
+
if (publicKey.asymmetricKeyType !== 'ec') {
|
|
61
|
+
throw new Error(`Invalid key type: expected 'ec', got '${publicKey.asymmetricKeyType}'`);
|
|
62
|
+
}
|
|
63
|
+
return publicKey;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
this.logger.error(`[PARSE] Failed to parse public key: ${error.message}`);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
getSupportedAlgorithms() {
|
|
71
|
+
return this.supportedAlgorithms;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.BiometricVerificationService = BiometricVerificationService;
|
|
75
|
+
exports.BiometricVerificationService = BiometricVerificationService = BiometricVerificationService_1 = __decorate([
|
|
76
|
+
(0, common_1.Injectable)()
|
|
77
|
+
], BiometricVerificationService);
|
|
78
|
+
//# sourceMappingURL=biometric-verification.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biometric-verification.service.js","sourceRoot":"","sources":["../../src/services/biometric-verification.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IUserRepository } from '../interfaces/user-repository.interface';
|
|
2
|
+
import { IAuthUser } from '../interfaces/auth-user.interface';
|
|
3
|
+
import { IAuthLogger } from '../interfaces/auth-logger.interface';
|
|
4
|
+
import { IBruteForceRepository } from '../interfaces/brute-force-repository.interface';
|
|
5
|
+
export declare class BruteForceProtectionService {
|
|
6
|
+
private readonly userRepository;
|
|
7
|
+
private readonly bruteForceRepository;
|
|
8
|
+
private readonly securityLogger;
|
|
9
|
+
private readonly logger;
|
|
10
|
+
private readonly MAX_FAILED_ATTEMPTS;
|
|
11
|
+
private readonly LOCKOUT_WINDOW_MINUTES;
|
|
12
|
+
private readonly LOCKOUT_DURATION_MINUTES;
|
|
13
|
+
private readonly IP_RATE_LIMIT_MAX;
|
|
14
|
+
private readonly IP_RATE_LIMIT_WINDOW_MINUTES;
|
|
15
|
+
constructor(userRepository: IUserRepository<IAuthUser>, bruteForceRepository: IBruteForceRepository, securityLogger: IAuthLogger);
|
|
16
|
+
recordFailedAttempt(email: string, ipAddress: string, userId?: string): Promise<void>;
|
|
17
|
+
isAccountLocked(email: string): Promise<boolean>;
|
|
18
|
+
getRemainingLockoutTime(email: string): Promise<number>;
|
|
19
|
+
resetFailedAttempts(email: string): Promise<void>;
|
|
20
|
+
checkIpRateLimit(ipAddress: string): Promise<boolean>;
|
|
21
|
+
cleanupOldAttempts(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=brute-force-protection.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brute-force-protection.service.d.ts","sourceRoot":"","sources":["../../src/services/brute-force-protection.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAiB,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AAWvF,qBACa,2BAA2B;IAYpC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAErC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAfjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgD;IAGvE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAM;IAC7C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IACxC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAK;gBAI/B,cAAc,EAAE,eAAe,CAAC,SAAS,CAAC,EAE1C,oBAAoB,EAAE,qBAAqB,EAE3C,cAAc,EAAE,WAAW;IASxC,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAiDV,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBhD,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBvD,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAarD,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;CAI1C"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var BruteForceProtectionService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.BruteForceProtectionService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const auth_logger_interface_1 = require("../interfaces/auth-logger.interface");
|
|
19
|
+
let BruteForceProtectionService = BruteForceProtectionService_1 = class BruteForceProtectionService {
|
|
20
|
+
constructor(userRepository, bruteForceRepository, securityLogger) {
|
|
21
|
+
this.userRepository = userRepository;
|
|
22
|
+
this.bruteForceRepository = bruteForceRepository;
|
|
23
|
+
this.securityLogger = securityLogger;
|
|
24
|
+
this.logger = new common_1.Logger(BruteForceProtectionService_1.name);
|
|
25
|
+
this.MAX_FAILED_ATTEMPTS = 5;
|
|
26
|
+
this.LOCKOUT_WINDOW_MINUTES = 15;
|
|
27
|
+
this.LOCKOUT_DURATION_MINUTES = 15;
|
|
28
|
+
this.IP_RATE_LIMIT_MAX = 10;
|
|
29
|
+
this.IP_RATE_LIMIT_WINDOW_MINUTES = 1;
|
|
30
|
+
}
|
|
31
|
+
async recordFailedAttempt(email, ipAddress, userId) {
|
|
32
|
+
try {
|
|
33
|
+
let resolvedUserId = userId;
|
|
34
|
+
if (!resolvedUserId) {
|
|
35
|
+
const user = await this.userRepository.findByEmail(email.toLowerCase());
|
|
36
|
+
if (!user) {
|
|
37
|
+
this.logger.warn(`Failed login attempt for non-existent email: ${email}, IP: ${ipAddress}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
resolvedUserId = user.id;
|
|
41
|
+
}
|
|
42
|
+
await this.bruteForceRepository.recordFailedAttempt(resolvedUserId, ipAddress);
|
|
43
|
+
this.logger.warn(`Failed login attempt recorded for email: ${email}, IP: ${ipAddress}`);
|
|
44
|
+
const lockStatus = await this.bruteForceRepository.checkAccountLock(resolvedUserId);
|
|
45
|
+
if (lockStatus.isLocked) {
|
|
46
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.ACCOUNT_LOCKED, {
|
|
47
|
+
email,
|
|
48
|
+
ipAddress,
|
|
49
|
+
userId: resolvedUserId,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
this.logger.error('Failed to record login attempt', error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async isAccountLocked(email) {
|
|
58
|
+
const user = await this.userRepository.findByEmail(email.toLowerCase());
|
|
59
|
+
if (!user) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const lockStatus = await this.bruteForceRepository.checkAccountLock(user.id);
|
|
63
|
+
return lockStatus.isLocked;
|
|
64
|
+
}
|
|
65
|
+
async getRemainingLockoutTime(email) {
|
|
66
|
+
const user = await this.userRepository.findByEmail(email.toLowerCase());
|
|
67
|
+
if (!user) {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
const lockStatus = await this.bruteForceRepository.checkAccountLock(user.id);
|
|
71
|
+
return lockStatus.remainingLockoutTime || 0;
|
|
72
|
+
}
|
|
73
|
+
async resetFailedAttempts(email) {
|
|
74
|
+
try {
|
|
75
|
+
const user = await this.userRepository.findByEmail(email.toLowerCase());
|
|
76
|
+
if (!user) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
await this.bruteForceRepository.clearFailedAttempts(user.id);
|
|
80
|
+
this.logger.log(`Reset failed login attempts for email: ${email}`);
|
|
81
|
+
this.securityLogger.log(auth_logger_interface_1.SecurityEvent.ACCOUNT_UNLOCKED, {
|
|
82
|
+
email,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.logger.error('Failed to reset login attempts', error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async checkIpRateLimit(ipAddress) {
|
|
90
|
+
this.logger.warn(`IP rate limiting not implemented - skipping check for ${ipAddress}`);
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
async cleanupOldAttempts() {
|
|
94
|
+
this.logger.log('Cleanup of old failed login attempts not implemented');
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
exports.BruteForceProtectionService = BruteForceProtectionService;
|
|
98
|
+
exports.BruteForceProtectionService = BruteForceProtectionService = BruteForceProtectionService_1 = __decorate([
|
|
99
|
+
(0, common_1.Injectable)(),
|
|
100
|
+
__param(0, (0, common_1.Inject)('USER_REPOSITORY')),
|
|
101
|
+
__param(1, (0, common_1.Inject)('BRUTE_FORCE_REPOSITORY')),
|
|
102
|
+
__param(2, (0, common_1.Inject)('AUTH_LOGGER')),
|
|
103
|
+
__metadata("design:paramtypes", [Object, Object, Object])
|
|
104
|
+
], BruteForceProtectionService);
|
|
105
|
+
//# sourceMappingURL=brute-force-protection.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brute-force-protection.service.js","sourceRoot":"","sources":["../../src/services/brute-force-protection.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IAuthLogger, SecurityEvent } from '../interfaces/auth-logger.interface';
|
|
2
|
+
export declare class ConsoleAuthLogger implements IAuthLogger {
|
|
3
|
+
log(messageOrEvent: string | SecurityEvent, contextOrMetadata?: string | Record<string, any>): void;
|
|
4
|
+
error(message: string, trace?: string, context?: string): void;
|
|
5
|
+
warn(message: string, context?: string): void;
|
|
6
|
+
debug(message: string, context?: string): void;
|
|
7
|
+
verbose(message: string, context?: string): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=console-logger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-logger.service.d.ts","sourceRoot":"","sources":["../../src/services/console-logger.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAOjF,qBACa,iBAAkB,YAAW,WAAW;IACnD,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAYnG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAK7C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAK9C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;CAIjD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ConsoleAuthLogger = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let ConsoleAuthLogger = class ConsoleAuthLogger {
|
|
12
|
+
log(messageOrEvent, contextOrMetadata) {
|
|
13
|
+
if (typeof messageOrEvent === 'string') {
|
|
14
|
+
const contextStr = typeof contextOrMetadata === 'string' && contextOrMetadata ? `[${contextOrMetadata}] ` : '';
|
|
15
|
+
console.log(`${contextStr}${messageOrEvent}`);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const metadata = typeof contextOrMetadata === 'object' ? contextOrMetadata : {};
|
|
19
|
+
console.log(`[SECURITY_EVENT: ${messageOrEvent}]`, JSON.stringify(metadata));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
error(message, trace, context) {
|
|
23
|
+
const contextStr = context ? `[${context}] ` : '';
|
|
24
|
+
console.error(`${contextStr}${message}`);
|
|
25
|
+
if (trace) {
|
|
26
|
+
console.error(trace);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
warn(message, context) {
|
|
30
|
+
const contextStr = context ? `[${context}] ` : '';
|
|
31
|
+
console.warn(`${contextStr}${message}`);
|
|
32
|
+
}
|
|
33
|
+
debug(message, context) {
|
|
34
|
+
const contextStr = context ? `[${context}] ` : '';
|
|
35
|
+
console.debug(`${contextStr}${message}`);
|
|
36
|
+
}
|
|
37
|
+
verbose(message, context) {
|
|
38
|
+
const contextStr = context ? `[${context}] ` : '';
|
|
39
|
+
console.log(`[VERBOSE] ${contextStr}${message}`);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.ConsoleAuthLogger = ConsoleAuthLogger;
|
|
43
|
+
exports.ConsoleAuthLogger = ConsoleAuthLogger = __decorate([
|
|
44
|
+
(0, common_1.Injectable)()
|
|
45
|
+
], ConsoleAuthLogger);
|
|
46
|
+
//# sourceMappingURL=console-logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-logger.service.js","sourceRoot":"","sources":["../../src/services/console-logger.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,GAAG,CAAC,cAAsC,EAAE,iBAAgD;QAC1F,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YAEvC,MAAM,UAAU,GAAG,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/G,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,cAAc,EAAE,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YAEN,MAAM,QAAQ,GAAG,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,oBAAoB,cAAc,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAc,EAAE,OAAgB;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAgB;QACpC,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAgB;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,OAAgB;QACvC,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AAnCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CAmC7B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AuthModuleOptions } from '../auth.module';
|
|
2
|
+
export declare class EncryptionService {
|
|
3
|
+
private readonly algorithm;
|
|
4
|
+
private readonly ivLength;
|
|
5
|
+
private readonly authTagLength;
|
|
6
|
+
private readonly saltLength;
|
|
7
|
+
private readonly keyLength;
|
|
8
|
+
private readonly encryptionSecret;
|
|
9
|
+
constructor(options: AuthModuleOptions);
|
|
10
|
+
encrypt(plaintext: string): Promise<string>;
|
|
11
|
+
decrypt(encryptedData: string): Promise<string>;
|
|
12
|
+
isEncrypted(value: string): boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=encryption.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.service.d.ts","sourceRoot":"","sources":["../../src/services/encryption.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA0BxE,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAM;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;gBAEb,OAAO,EAAE,iBAAiB;IAS7D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4C3C,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4DrD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CASpC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.EncryptionService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const crypto_1 = require("crypto");
|
|
18
|
+
const util_1 = require("util");
|
|
19
|
+
const auth_module_1 = require("../auth.module");
|
|
20
|
+
let EncryptionService = class EncryptionService {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.algorithm = 'aes-256-gcm';
|
|
23
|
+
this.ivLength = 16;
|
|
24
|
+
this.authTagLength = 16;
|
|
25
|
+
this.saltLength = 32;
|
|
26
|
+
this.keyLength = 32;
|
|
27
|
+
this.encryptionSecret = options.encryptionKey;
|
|
28
|
+
}
|
|
29
|
+
async encrypt(plaintext) {
|
|
30
|
+
if (!this.encryptionSecret) {
|
|
31
|
+
throw new Error('Encryption not configured - missing encryptionKey in AuthModuleOptions');
|
|
32
|
+
}
|
|
33
|
+
const secret = this.encryptionSecret;
|
|
34
|
+
const iv = (0, crypto_1.randomBytes)(this.ivLength);
|
|
35
|
+
const salt = (0, crypto_1.randomBytes)(this.saltLength);
|
|
36
|
+
const scryptAsync = (0, util_1.promisify)(crypto_1.scrypt);
|
|
37
|
+
const key = (await scryptAsync(secret, salt, this.keyLength));
|
|
38
|
+
const cipher = (0, crypto_1.createCipheriv)(this.algorithm, key, iv);
|
|
39
|
+
let ciphertext = cipher.update(plaintext, 'utf8', 'base64url');
|
|
40
|
+
ciphertext += cipher.final('base64url');
|
|
41
|
+
const authTag = cipher.getAuthTag();
|
|
42
|
+
return [
|
|
43
|
+
salt.toString('base64url'),
|
|
44
|
+
iv.toString('base64url'),
|
|
45
|
+
authTag.toString('base64url'),
|
|
46
|
+
ciphertext,
|
|
47
|
+
].join(':');
|
|
48
|
+
}
|
|
49
|
+
async decrypt(encryptedData) {
|
|
50
|
+
try {
|
|
51
|
+
if (!this.encryptionSecret) {
|
|
52
|
+
throw new Error('Encryption not configured - missing encryptionKey in AuthModuleOptions');
|
|
53
|
+
}
|
|
54
|
+
const secret = this.encryptionSecret;
|
|
55
|
+
const parts = encryptedData.split(':');
|
|
56
|
+
if (parts.length !== 4) {
|
|
57
|
+
throw new Error('Invalid encrypted data format');
|
|
58
|
+
}
|
|
59
|
+
const [saltB64, ivB64, authTagB64, ciphertext] = parts;
|
|
60
|
+
const salt = Buffer.from(saltB64, 'base64url');
|
|
61
|
+
const iv = Buffer.from(ivB64, 'base64url');
|
|
62
|
+
const authTag = Buffer.from(authTagB64, 'base64url');
|
|
63
|
+
if (salt.length !== this.saltLength) {
|
|
64
|
+
throw new Error('Invalid salt length');
|
|
65
|
+
}
|
|
66
|
+
if (iv.length !== this.ivLength) {
|
|
67
|
+
throw new Error('Invalid IV length');
|
|
68
|
+
}
|
|
69
|
+
if (authTag.length !== this.authTagLength) {
|
|
70
|
+
throw new Error('Invalid auth tag length');
|
|
71
|
+
}
|
|
72
|
+
const scryptAsync = (0, util_1.promisify)(crypto_1.scrypt);
|
|
73
|
+
const key = (await scryptAsync(secret, salt, this.keyLength));
|
|
74
|
+
const decipher = (0, crypto_1.createDecipheriv)(this.algorithm, key, iv);
|
|
75
|
+
decipher.setAuthTag(authTag);
|
|
76
|
+
let plaintext = decipher.update(ciphertext, 'base64url', 'utf8');
|
|
77
|
+
plaintext += decipher.final('utf8');
|
|
78
|
+
return plaintext;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new Error('Decryption failed - data may be corrupted or tampered');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
isEncrypted(value) {
|
|
85
|
+
if (!value || typeof value !== 'string') {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
const parts = value.split(':');
|
|
89
|
+
return parts.length === 4;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
exports.EncryptionService = EncryptionService;
|
|
93
|
+
exports.EncryptionService = EncryptionService = __decorate([
|
|
94
|
+
(0, common_1.Injectable)(),
|
|
95
|
+
__param(0, (0, common_1.Inject)(auth_module_1.AUTH_MODULE_OPTIONS)),
|
|
96
|
+
__metadata("design:paramtypes", [Object])
|
|
97
|
+
], EncryptionService);
|
|
98
|
+
//# sourceMappingURL=encryption.service.js.map
|