@codecanva/nest-auth 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +164 -0
  2. package/dist/auth.constants.d.ts +8 -0
  3. package/dist/auth.constants.d.ts.map +1 -0
  4. package/dist/auth.constants.js +11 -0
  5. package/dist/auth.constants.js.map +1 -0
  6. package/dist/auth.module.d.ts +6 -0
  7. package/dist/auth.module.d.ts.map +1 -0
  8. package/dist/auth.module.js +75 -0
  9. package/dist/auth.module.js.map +1 -0
  10. package/dist/auth.service.d.ts +25 -0
  11. package/dist/auth.service.d.ts.map +1 -0
  12. package/dist/auth.service.js +108 -0
  13. package/dist/auth.service.js.map +1 -0
  14. package/dist/decorators/current-user.decorator.d.ts +3 -0
  15. package/dist/decorators/current-user.decorator.d.ts.map +1 -0
  16. package/dist/decorators/current-user.decorator.js +12 -0
  17. package/dist/decorators/current-user.decorator.js.map +1 -0
  18. package/dist/decorators/index.d.ts +3 -0
  19. package/dist/decorators/index.d.ts.map +1 -0
  20. package/dist/decorators/index.js +19 -0
  21. package/dist/decorators/index.js.map +1 -0
  22. package/dist/decorators/public.decorator.d.ts +2 -0
  23. package/dist/decorators/public.decorator.d.ts.map +1 -0
  24. package/dist/decorators/public.decorator.js +8 -0
  25. package/dist/decorators/public.decorator.js.map +1 -0
  26. package/dist/dto/index.d.ts +3 -0
  27. package/dist/dto/index.d.ts.map +1 -0
  28. package/dist/dto/index.js +19 -0
  29. package/dist/dto/index.js.map +1 -0
  30. package/dist/dto/login.dto.d.ts +5 -0
  31. package/dist/dto/login.dto.d.ts.map +1 -0
  32. package/dist/dto/login.dto.js +28 -0
  33. package/dist/dto/login.dto.js.map +1 -0
  34. package/dist/dto/refresh-token.dto.d.ts +4 -0
  35. package/dist/dto/refresh-token.dto.d.ts.map +1 -0
  36. package/dist/dto/refresh-token.dto.js +23 -0
  37. package/dist/dto/refresh-token.dto.js.map +1 -0
  38. package/dist/errors/auth.errors.d.ts +19 -0
  39. package/dist/errors/auth.errors.d.ts.map +1 -0
  40. package/dist/errors/auth.errors.js +41 -0
  41. package/dist/errors/auth.errors.js.map +1 -0
  42. package/dist/guards/index.d.ts +3 -0
  43. package/dist/guards/index.d.ts.map +1 -0
  44. package/dist/guards/index.js +19 -0
  45. package/dist/guards/index.js.map +1 -0
  46. package/dist/guards/jwt-auth.guard.d.ts +10 -0
  47. package/dist/guards/jwt-auth.guard.d.ts.map +1 -0
  48. package/dist/guards/jwt-auth.guard.js +38 -0
  49. package/dist/guards/jwt-auth.guard.js.map +1 -0
  50. package/dist/guards/refresh-auth.guard.d.ts +5 -0
  51. package/dist/guards/refresh-auth.guard.d.ts.map +1 -0
  52. package/dist/guards/refresh-auth.guard.js +19 -0
  53. package/dist/guards/refresh-auth.guard.js.map +1 -0
  54. package/dist/index.d.ts +11 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +34 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/interfaces/auth-module-options.interface.d.ts +38 -0
  59. package/dist/interfaces/auth-module-options.interface.d.ts.map +1 -0
  60. package/dist/interfaces/auth-module-options.interface.js +3 -0
  61. package/dist/interfaces/auth-module-options.interface.js.map +1 -0
  62. package/dist/interfaces/auth-user.interface.d.ts +8 -0
  63. package/dist/interfaces/auth-user.interface.d.ts.map +1 -0
  64. package/dist/interfaces/auth-user.interface.js +3 -0
  65. package/dist/interfaces/auth-user.interface.js.map +1 -0
  66. package/dist/interfaces/index.d.ts +6 -0
  67. package/dist/interfaces/index.d.ts.map +1 -0
  68. package/dist/interfaces/index.js +22 -0
  69. package/dist/interfaces/index.js.map +1 -0
  70. package/dist/interfaces/jwt-payload.interface.d.ts +14 -0
  71. package/dist/interfaces/jwt-payload.interface.d.ts.map +1 -0
  72. package/dist/interfaces/jwt-payload.interface.js +3 -0
  73. package/dist/interfaces/jwt-payload.interface.js.map +1 -0
  74. package/dist/interfaces/refresh-token-store.interface.d.ts +34 -0
  75. package/dist/interfaces/refresh-token-store.interface.d.ts.map +1 -0
  76. package/dist/interfaces/refresh-token-store.interface.js +3 -0
  77. package/dist/interfaces/refresh-token-store.interface.js.map +1 -0
  78. package/dist/interfaces/user-validator.interface.d.ts +11 -0
  79. package/dist/interfaces/user-validator.interface.d.ts.map +1 -0
  80. package/dist/interfaces/user-validator.interface.js +3 -0
  81. package/dist/interfaces/user-validator.interface.js.map +1 -0
  82. package/dist/services/index.d.ts +2 -0
  83. package/dist/services/index.d.ts.map +1 -0
  84. package/dist/services/index.js +18 -0
  85. package/dist/services/index.js.map +1 -0
  86. package/dist/services/token.service.d.ts +23 -0
  87. package/dist/services/token.service.d.ts.map +1 -0
  88. package/dist/services/token.service.js +94 -0
  89. package/dist/services/token.service.js.map +1 -0
  90. package/dist/strategies/index.d.ts +3 -0
  91. package/dist/strategies/index.d.ts.map +1 -0
  92. package/dist/strategies/index.js +19 -0
  93. package/dist/strategies/index.js.map +1 -0
  94. package/dist/strategies/jwt.strategy.d.ts +15 -0
  95. package/dist/strategies/jwt.strategy.d.ts.map +1 -0
  96. package/dist/strategies/jwt.strategy.js +50 -0
  97. package/dist/strategies/jwt.strategy.js.map +1 -0
  98. package/dist/strategies/refresh.strategy.d.ts +18 -0
  99. package/dist/strategies/refresh.strategy.d.ts.map +1 -0
  100. package/dist/strategies/refresh.strategy.js +65 -0
  101. package/dist/strategies/refresh.strategy.js.map +1 -0
  102. package/dist/utils/extract-token.d.ts +2 -0
  103. package/dist/utils/extract-token.d.ts.map +1 -0
  104. package/dist/utils/extract-token.js +12 -0
  105. package/dist/utils/extract-token.js.map +1 -0
  106. package/dist/utils/hash-token.d.ts +3 -0
  107. package/dist/utils/hash-token.d.ts.map +1 -0
  108. package/dist/utils/hash-token.js +16 -0
  109. package/dist/utils/hash-token.js.map +1 -0
  110. package/dist/utils/index.d.ts +3 -0
  111. package/dist/utils/index.d.ts.map +1 -0
  112. package/dist/utils/index.js +19 -0
  113. package/dist/utils/index.js.map +1 -0
  114. package/package.json +107 -0
package/README.md ADDED
@@ -0,0 +1,164 @@
1
+ # @codecanva/nest-auth
2
+
3
+ Reusable NestJS authentication module. JWT access + refresh-token rotation, multi-device sessions, replay detection, and pluggable persistence (no DB lock-in).
4
+
5
+ ## Features
6
+
7
+ - Short-lived access JWT + long-lived refresh JWT
8
+ - Refresh-token rotation on every refresh (with replay detection → `revokeAllForUser`)
9
+ - Multi-device sessions (one row per session, hashed at rest)
10
+ - Pluggable `RefreshTokenStore` and `UserValidator` — bring your own DB
11
+ - `@CurrentUser()`, `@Public()` decorators
12
+ - `JwtAuthGuard` (honours `@Public()`) and `RefreshAuthGuard`
13
+ - Configurable issuer, audience, clock tolerance, optional hash pepper
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ npm install @codecanva/nest-auth \
19
+ @nestjs/jwt @nestjs/passport passport passport-jwt \
20
+ class-validator class-transformer
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ### 1. Implement the two interfaces against your data layer
26
+
27
+ ```ts
28
+ // users/user.validator.ts
29
+ import { Injectable } from '@nestjs/common';
30
+ import { AuthUser, UserValidator } from '@codecanva/nest-auth';
31
+
32
+ @Injectable()
33
+ export class MyUserValidator implements UserValidator {
34
+ async validateCredentials(email: string, password: string): Promise<AuthUser | null> {
35
+ // load user, bcrypt.compare, return { id, email, roles } or null
36
+ }
37
+ async findById(userId: string | number): Promise<AuthUser | null> {
38
+ // load by id, return AuthUser or null
39
+ }
40
+ }
41
+ ```
42
+
43
+ ```ts
44
+ // auth/refresh-token.store.ts — example with TypeORM
45
+ import { Injectable } from '@nestjs/common';
46
+ import {
47
+ CreateRefreshTokenInput,
48
+ RefreshTokenStore,
49
+ StoredRefreshToken,
50
+ } from '@codecanva/nest-auth';
51
+
52
+ @Injectable()
53
+ export class MyRefreshTokenStore implements RefreshTokenStore {
54
+ // create / findById / consume / revokeById / revokeAllForUser
55
+ // IMPORTANT: `consume` must be atomic (single UPDATE ... WHERE revoked_at IS NULL
56
+ // AND token_hash = $hash RETURNING *). Non-atomic impls split sessions under load.
57
+ }
58
+ ```
59
+
60
+ ### 2. Register the module
61
+
62
+ ```ts
63
+ import { AuthModule } from '@codecanva/nest-auth';
64
+
65
+ @Module({
66
+ imports: [
67
+ AuthModule.forRootAsync({
68
+ imports: [ConfigModule],
69
+ useFactory: (cfg: ConfigService) => ({
70
+ accessSecret: cfg.getOrThrow('JWT_ACCESS_SECRET'),
71
+ refreshSecret: cfg.getOrThrow('JWT_REFRESH_SECRET'),
72
+ accessTtl: '15m',
73
+ refreshTtl: '30d',
74
+ tokenHashPepper: cfg.get('TOKEN_HASH_PEPPER'),
75
+ issuer: 'my-app',
76
+ }),
77
+ inject: [ConfigService],
78
+ store: { useClass: MyRefreshTokenStore },
79
+ validator: { useClass: MyUserValidator },
80
+ }),
81
+ ],
82
+ })
83
+ export class AppModule {}
84
+ ```
85
+
86
+ ### 3. Apply the guard globally (optional)
87
+
88
+ ```ts
89
+ import { APP_GUARD } from '@nestjs/core';
90
+ import { JwtAuthGuard } from '@codecanva/nest-auth';
91
+
92
+ providers: [{ provide: APP_GUARD, useClass: JwtAuthGuard }],
93
+ ```
94
+
95
+ ### 4. Use in controllers
96
+
97
+ ```ts
98
+ import {
99
+ AuthService, CurrentUser, LoginDto, Public, RefreshTokenDto,
100
+ } from '@codecanva/nest-auth';
101
+
102
+ @Controller('auth')
103
+ export class AuthController {
104
+ constructor(private readonly auth: AuthService) {}
105
+
106
+ @Public() @Post('login')
107
+ login(@Body() dto: LoginDto) { return this.auth.login(dto.email, dto.password); }
108
+
109
+ @Public() @Post('refresh')
110
+ refresh(@Body() dto: RefreshTokenDto) { return this.auth.refresh(dto.refreshToken); }
111
+
112
+ @Post('logout')
113
+ logout(@Body() dto: RefreshTokenDto) { return this.auth.logout(dto.refreshToken); }
114
+ }
115
+
116
+ @Controller('me')
117
+ export class MeController {
118
+ @Get() me(@CurrentUser() user: AuthUser) { return user; }
119
+ }
120
+ ```
121
+
122
+ ## API surface
123
+
124
+ - `AuthModule.forRootAsync(opts)` — only entry point
125
+ - `AuthService` — `login` / `refresh` / `logout` / `logoutAll`
126
+ - Guards — `JwtAuthGuard`, `RefreshAuthGuard`
127
+ - Decorators — `@Public()`, `@CurrentUser()`
128
+ - DTOs — `LoginDto`, `RefreshTokenDto`
129
+ - Errors — `AuthError`, `InvalidCredentialsError`, `InvalidRefreshTokenError`, `RefreshTokenExpiredError`, `RefreshTokenReuseDetectedError`, `UserNotFoundError`
130
+ - Interfaces — `AuthModuleOptions`, `AuthModuleAsyncOptions`, `AuthUser`, `JwtPayload`, `RefreshTokenStore`, `StoredRefreshToken`, `CreateRefreshTokenInput`, `SessionMetadata`, `UserValidator`
131
+
132
+ ## Local development / publishing
133
+
134
+ ```bash
135
+ npm install # install deps
136
+ npm run start:dev # run the demo app at :3000 (uses in-memory store + validator)
137
+ npm run build:lib # compile lib → dist/
138
+ npm publish # publish (runs build:lib via prepublishOnly)
139
+ ```
140
+
141
+ To consume from a sibling project before publishing:
142
+
143
+ ```bash
144
+ # in this repo
145
+ npm run build:lib && npm pack
146
+ # in the consumer
147
+ npm install /path/to/codecanva-nest-auth-0.1.0.tgz
148
+ ```
149
+
150
+ ## Demo endpoints (when running `start:dev`)
151
+
152
+ ```
153
+ POST /auth/login { "email": "demo@example.com", "password": "password123" }
154
+ POST /auth/refresh { "refreshToken": "..." }
155
+ POST /auth/logout { "refreshToken": "..." } # 204
156
+ GET /me # bearer access token required
157
+ ```
158
+
159
+ ## Security notes
160
+
161
+ - Refresh tokens are JWTs; the **hash** of the JWT (sha256 + optional pepper) is stored, never the raw token.
162
+ - `consume` must be atomic — non-atomic impls split sessions under concurrent refresh.
163
+ - On replay (token hash mismatch or already-revoked row), every active session for that user is revoked.
164
+ - Always serve auth over HTTPS. Store the refresh token in an httpOnly cookie when possible.
@@ -0,0 +1,8 @@
1
+ export declare const AUTH_MODULE_OPTIONS: unique symbol;
2
+ export declare const REFRESH_TOKEN_STORE: unique symbol;
3
+ export declare const USER_VALIDATOR: unique symbol;
4
+ export declare const JWT_STRATEGY_NAME = "nest-auth-jwt";
5
+ export declare const REFRESH_STRATEGY_NAME = "nest-auth-refresh";
6
+ export declare const IS_PUBLIC_KEY = "nest-auth:isPublic";
7
+ export declare const REFRESH_TOKEN_TYPE: "refresh";
8
+ //# sourceMappingURL=auth.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.constants.d.ts","sourceRoot":"","sources":["../src/lib/auth.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AACjE,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AACjE,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAElD,eAAO,MAAM,kBAAkB,EAAG,SAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REFRESH_TOKEN_TYPE = exports.IS_PUBLIC_KEY = exports.REFRESH_STRATEGY_NAME = exports.JWT_STRATEGY_NAME = exports.USER_VALIDATOR = exports.REFRESH_TOKEN_STORE = exports.AUTH_MODULE_OPTIONS = void 0;
4
+ exports.AUTH_MODULE_OPTIONS = Symbol('AUTH_MODULE_OPTIONS');
5
+ exports.REFRESH_TOKEN_STORE = Symbol('REFRESH_TOKEN_STORE');
6
+ exports.USER_VALIDATOR = Symbol('USER_VALIDATOR');
7
+ exports.JWT_STRATEGY_NAME = 'nest-auth-jwt';
8
+ exports.REFRESH_STRATEGY_NAME = 'nest-auth-refresh';
9
+ exports.IS_PUBLIC_KEY = 'nest-auth:isPublic';
10
+ exports.REFRESH_TOKEN_TYPE = 'refresh';
11
+ //# sourceMappingURL=auth.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.constants.js","sourceRoot":"","sources":["../src/lib/auth.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACpD,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACpD,QAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE1C,QAAA,iBAAiB,GAAG,eAAe,CAAC;AACpC,QAAA,qBAAqB,GAAG,mBAAmB,CAAC;AAE5C,QAAA,aAAa,GAAG,oBAAoB,CAAC;AAErC,QAAA,kBAAkB,GAAG,SAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import type { AuthModuleAsyncOptions } from './interfaces/auth-module-options.interface';
3
+ export declare class AuthModule {
4
+ static forRootAsync(options: AuthModuleAsyncOptions): DynamicModule;
5
+ }
6
+ //# sourceMappingURL=auth.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.module.d.ts","sourceRoot":"","sources":["../src/lib/auth.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoB,MAAM,gBAAgB,CAAC;AASjE,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,4CAA4C,CAAC;AAKpD,qBACa,UAAU;IACrB,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa;CAoCpE"}
@@ -0,0 +1,75 @@
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 AuthModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.AuthModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const jwt_1 = require("@nestjs/jwt");
13
+ const passport_1 = require("@nestjs/passport");
14
+ const auth_constants_1 = require("./auth.constants");
15
+ const auth_service_1 = require("./auth.service");
16
+ const token_service_1 = require("./services/token.service");
17
+ const jwt_strategy_1 = require("./strategies/jwt.strategy");
18
+ const refresh_strategy_1 = require("./strategies/refresh.strategy");
19
+ let AuthModule = AuthModule_1 = class AuthModule {
20
+ static forRootAsync(options) {
21
+ const optionsProvider = {
22
+ provide: auth_constants_1.AUTH_MODULE_OPTIONS,
23
+ useFactory: options.useFactory,
24
+ inject: options.inject ?? [],
25
+ };
26
+ const storeProvider = buildProvider(auth_constants_1.REFRESH_TOKEN_STORE, options.store);
27
+ const validatorProvider = buildProvider(auth_constants_1.USER_VALIDATOR, options.validator);
28
+ return {
29
+ module: AuthModule_1,
30
+ imports: [
31
+ ...(options.imports ?? []),
32
+ passport_1.PassportModule,
33
+ jwt_1.JwtModule.register({}),
34
+ ],
35
+ providers: [
36
+ optionsProvider,
37
+ storeProvider,
38
+ validatorProvider,
39
+ token_service_1.TokenService,
40
+ jwt_strategy_1.JwtStrategy,
41
+ refresh_strategy_1.RefreshStrategy,
42
+ auth_service_1.AuthService,
43
+ ],
44
+ exports: [
45
+ auth_service_1.AuthService,
46
+ auth_constants_1.AUTH_MODULE_OPTIONS,
47
+ auth_constants_1.REFRESH_TOKEN_STORE,
48
+ auth_constants_1.USER_VALIDATOR,
49
+ jwt_1.JwtModule,
50
+ passport_1.PassportModule,
51
+ ],
52
+ };
53
+ }
54
+ };
55
+ exports.AuthModule = AuthModule;
56
+ exports.AuthModule = AuthModule = AuthModule_1 = __decorate([
57
+ (0, common_1.Module)({})
58
+ ], AuthModule);
59
+ function buildProvider(token, cfg) {
60
+ if (cfg.useFactory) {
61
+ return {
62
+ provide: token,
63
+ useFactory: cfg.useFactory,
64
+ inject: cfg.inject ?? [],
65
+ };
66
+ }
67
+ if (cfg.useExisting) {
68
+ return { provide: token, useExisting: cfg.useExisting };
69
+ }
70
+ if (cfg.useClass) {
71
+ return { provide: token, useClass: cfg.useClass };
72
+ }
73
+ throw new Error(`AuthModule: provider for ${token.toString()} requires useFactory, useExisting, or useClass`);
74
+ }
75
+ //# sourceMappingURL=auth.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../src/lib/auth.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAiE;AACjE,qCAAwC;AACxC,+CAAkD;AAClD,qDAI0B;AAC1B,iDAA6C;AAM7C,4DAAwD;AACxD,4DAAwD;AACxD,oEAAgE;AAGzD,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACrB,MAAM,CAAC,YAAY,CAAC,OAA+B;QACjD,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,oCAAmB;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC;QAEF,MAAM,aAAa,GAAG,aAAa,CAAC,oCAAmB,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,iBAAiB,GAAG,aAAa,CAAC,+BAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAE3E,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE;gBACP,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1B,yBAAc;gBACd,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;aACvB;YACD,SAAS,EAAE;gBACT,eAAe;gBACf,aAAa;gBACb,iBAAiB;gBACjB,4BAAY;gBACZ,0BAAW;gBACX,kCAAe;gBACf,0BAAW;aACZ;YACD,OAAO,EAAE;gBACP,0BAAW;gBACX,oCAAmB;gBACnB,oCAAmB;gBACnB,+BAAc;gBACd,eAAS;gBACT,yBAAc;aACf;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AArCY,gCAAU;qBAAV,UAAU;IADtB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,UAAU,CAqCtB;AAED,SAAS,aAAa,CACpB,KAAa,EACb,GAAsD;IAEtD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,QAAQ,EAAE,gDAAgD,CAC7F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { AuthModuleOptions } from './interfaces/auth-module-options.interface';
2
+ import type { AuthUser } from './interfaces/auth-user.interface';
3
+ import type { RefreshTokenStore, SessionMetadata } from './interfaces/refresh-token-store.interface';
4
+ import type { UserValidator } from './interfaces/user-validator.interface';
5
+ import { TokenService } from './services/token.service';
6
+ export interface AuthTokens {
7
+ accessToken: string;
8
+ refreshToken: string;
9
+ }
10
+ export interface LoginResult extends AuthTokens {
11
+ user: AuthUser;
12
+ }
13
+ export declare class AuthService {
14
+ private readonly tokenService;
15
+ private readonly validator;
16
+ private readonly store;
17
+ private readonly options;
18
+ constructor(tokenService: TokenService, validator: UserValidator, store: RefreshTokenStore, options: AuthModuleOptions);
19
+ login(email: string, password: string, metadata?: SessionMetadata): Promise<LoginResult>;
20
+ refresh(refreshToken: string, metadata?: SessionMetadata): Promise<AuthTokens>;
21
+ logout(refreshToken: string): Promise<void>;
22
+ logoutAll(userId: string | number): Promise<void>;
23
+ private issueTokenPair;
24
+ }
25
+ //# sourceMappingURL=auth.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../src/lib/auth.service.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAChB,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,qBACa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IACL,OAAO,CAAC,QAAQ,CAAC,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEnD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,YAAY,EAAE,YAAY,EACF,SAAS,EAAE,aAAa,EACnB,KAAK,EAAE,iBAAiB,EAErD,OAAO,EAAE,iBAAiB;IAGvC,KAAK,CACT,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,WAAW,CAAC;IAOjB,OAAO,CACX,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,UAAU,CAAC;IA+BhB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIzC,cAAc;CAuB7B"}
@@ -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.AuthService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const auth_constants_1 = require("./auth.constants");
18
+ const auth_errors_1 = require("./errors/auth.errors");
19
+ const token_service_1 = require("./services/token.service");
20
+ const hash_token_1 = require("./utils/hash-token");
21
+ let AuthService = class AuthService {
22
+ tokenService;
23
+ validator;
24
+ store;
25
+ options;
26
+ constructor(tokenService, validator, store, options) {
27
+ this.tokenService = tokenService;
28
+ this.validator = validator;
29
+ this.store = store;
30
+ this.options = options;
31
+ }
32
+ async login(email, password, metadata) {
33
+ const user = await this.validator.validateCredentials(email, password);
34
+ if (!user)
35
+ throw new auth_errors_1.InvalidCredentialsError();
36
+ const tokens = await this.issueTokenPair(user, metadata);
37
+ return { ...tokens, user };
38
+ }
39
+ async refresh(refreshToken, metadata) {
40
+ let payload;
41
+ try {
42
+ payload = await this.tokenService.verifyRefreshToken(refreshToken);
43
+ }
44
+ catch {
45
+ throw new auth_errors_1.InvalidRefreshTokenError();
46
+ }
47
+ const incomingHash = (0, hash_token_1.hashToken)(refreshToken, this.options.tokenHashPepper);
48
+ const consumed = await this.store.consume(payload.jti, incomingHash);
49
+ if (!consumed) {
50
+ // Either already revoked (replay) or hash mismatch — both indicate compromise.
51
+ // Defensive: revoke every active session for this user.
52
+ const existing = await this.store.findById(payload.jti);
53
+ if (existing) {
54
+ await this.store.revokeAllForUser(existing.userId);
55
+ }
56
+ throw new auth_errors_1.RefreshTokenReuseDetectedError();
57
+ }
58
+ if (consumed.expiresAt.getTime() < Date.now()) {
59
+ throw new auth_errors_1.RefreshTokenExpiredError();
60
+ }
61
+ const user = await this.validator.findById(consumed.userId);
62
+ if (!user)
63
+ throw new auth_errors_1.UserNotFoundError();
64
+ return this.issueTokenPair(user, metadata);
65
+ }
66
+ async logout(refreshToken) {
67
+ let payload;
68
+ try {
69
+ payload = await this.tokenService.verifyRefreshToken(refreshToken);
70
+ }
71
+ catch {
72
+ throw new auth_errors_1.InvalidRefreshTokenError();
73
+ }
74
+ await this.store.revokeById(payload.jti);
75
+ }
76
+ async logoutAll(userId) {
77
+ await this.store.revokeAllForUser(userId);
78
+ }
79
+ async issueTokenPair(user, metadata) {
80
+ const jti = (0, hash_token_1.generateTokenId)();
81
+ const accessToken = await this.tokenService.signAccessToken({
82
+ sub: user.id,
83
+ email: user.email,
84
+ roles: user.roles,
85
+ });
86
+ const refreshToken = await this.tokenService.signRefreshToken({
87
+ sub: user.id,
88
+ jti,
89
+ });
90
+ await this.store.create({
91
+ id: jti,
92
+ userId: user.id,
93
+ tokenHash: (0, hash_token_1.hashToken)(refreshToken, this.options.tokenHashPepper),
94
+ expiresAt: this.tokenService.refreshExpiresAt(),
95
+ metadata,
96
+ });
97
+ return { accessToken, refreshToken };
98
+ }
99
+ };
100
+ exports.AuthService = AuthService;
101
+ exports.AuthService = AuthService = __decorate([
102
+ (0, common_1.Injectable)(),
103
+ __param(1, (0, common_1.Inject)(auth_constants_1.USER_VALIDATOR)),
104
+ __param(2, (0, common_1.Inject)(auth_constants_1.REFRESH_TOKEN_STORE)),
105
+ __param(3, (0, common_1.Inject)(auth_constants_1.AUTH_MODULE_OPTIONS)),
106
+ __metadata("design:paramtypes", [token_service_1.TokenService, Object, Object, Object])
107
+ ], AuthService);
108
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../src/lib/auth.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { AuthUser } from '../interfaces/auth-user.interface';
2
+ export declare const CurrentUser: (...dataOrPipes: (keyof AuthUser | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>> | undefined)[]) => ParameterDecorator;
3
+ //# sourceMappingURL=current-user.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-user.decorator.d.ts","sourceRoot":"","sources":["../../src/lib/decorators/current-user.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAE7D,eAAO,MAAM,WAAW,6MAOvB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurrentUser = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.CurrentUser = (0, common_1.createParamDecorator)((data, ctx) => {
6
+ const req = ctx.switchToHttp().getRequest();
7
+ const user = req.user;
8
+ if (!user)
9
+ return undefined;
10
+ return data ? user[data] : user;
11
+ });
12
+ //# sourceMappingURL=current-user.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-user.decorator.js","sourceRoot":"","sources":["../../src/lib/decorators/current-user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAG3D,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,IAAgC,EAAE,GAAqB,EAAE,EAAE;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAuB,CAAC;IACjE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './public.decorator';
2
+ export * from './current-user.decorator';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./public.decorator"), exports);
18
+ __exportStar(require("./current-user.decorator"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,2DAAyC"}
@@ -0,0 +1,2 @@
1
+ export declare const Public: () => MethodDecorator & ClassDecorator;
2
+ //# sourceMappingURL=public.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.decorator.d.ts","sourceRoot":"","sources":["../../src/lib/decorators/public.decorator.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,QAAO,eAAe,GAAG,cACV,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Public = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const auth_constants_1 = require("../auth.constants");
6
+ const Public = () => (0, common_1.SetMetadata)(auth_constants_1.IS_PUBLIC_KEY, true);
7
+ exports.Public = Public;
8
+ //# sourceMappingURL=public.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.decorator.js","sourceRoot":"","sources":["../../src/lib/decorators/public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAC7C,sDAAkD;AAE3C,MAAM,MAAM,GAAG,GAAqC,EAAE,CAC3D,IAAA,oBAAW,EAAC,8BAAa,EAAE,IAAI,CAAC,CAAC;AADtB,QAAA,MAAM,UACgB"}
@@ -0,0 +1,3 @@
1
+ export * from './login.dto';
2
+ export * from './refresh-token.dto';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/dto/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./login.dto"), exports);
18
+ __exportStar(require("./refresh-token.dto"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/dto/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,sDAAoC"}
@@ -0,0 +1,5 @@
1
+ export declare class LoginDto {
2
+ email: string;
3
+ password: string;
4
+ }
5
+ //# sourceMappingURL=login.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.dto.d.ts","sourceRoot":"","sources":["../../src/lib/dto/login.dto.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAQ;IAEnB,KAAK,EAAG,MAAM,CAAC;IAIf,QAAQ,EAAG,MAAM,CAAC;CACnB"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LoginDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ class LoginDto {
15
+ email;
16
+ password;
17
+ }
18
+ exports.LoginDto = LoginDto;
19
+ __decorate([
20
+ (0, class_validator_1.IsEmail)(),
21
+ __metadata("design:type", String)
22
+ ], LoginDto.prototype, "email", void 0);
23
+ __decorate([
24
+ (0, class_validator_1.IsString)(),
25
+ (0, class_validator_1.MinLength)(1),
26
+ __metadata("design:type", String)
27
+ ], LoginDto.prototype, "password", void 0);
28
+ //# sourceMappingURL=login.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.dto.js","sourceRoot":"","sources":["../../src/lib/dto/login.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAA+D;AAE/D,MAAa,QAAQ;IAEnB,KAAK,CAAU;IAIf,QAAQ,CAAU;CACnB;AAPD,4BAOC;AALC;IADC,IAAA,yBAAO,GAAE;;uCACK;AAIf;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;;0CACK"}
@@ -0,0 +1,4 @@
1
+ export declare class RefreshTokenDto {
2
+ refreshToken: string;
3
+ }
4
+ //# sourceMappingURL=refresh-token.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.dto.d.ts","sourceRoot":"","sources":["../../src/lib/dto/refresh-token.dto.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAe;IAG1B,YAAY,EAAG,MAAM,CAAC;CACvB"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RefreshTokenDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ class RefreshTokenDto {
15
+ refreshToken;
16
+ }
17
+ exports.RefreshTokenDto = RefreshTokenDto;
18
+ __decorate([
19
+ (0, class_validator_1.IsString)(),
20
+ (0, class_validator_1.IsNotEmpty)(),
21
+ __metadata("design:type", String)
22
+ ], RefreshTokenDto.prototype, "refreshToken", void 0);
23
+ //# sourceMappingURL=refresh-token.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.dto.js","sourceRoot":"","sources":["../../src/lib/dto/refresh-token.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAuD;AAEvD,MAAa,eAAe;IAG1B,YAAY,CAAU;CACvB;AAJD,0CAIC;AADC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACS"}