clhq-auth-module 1.1.0-alpha.90

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 (31) hide show
  1. package/dist/auth/auth.module.d.ts +2 -0
  2. package/dist/auth/auth.module.js +54 -0
  3. package/dist/auth/decorators/roles.decorator.d.ts +1 -0
  4. package/dist/auth/decorators/roles.decorator.js +6 -0
  5. package/dist/auth/dto/refresh-token.dto.d.ts +3 -0
  6. package/dist/auth/dto/refresh-token.dto.js +22 -0
  7. package/dist/auth/exceptions/auth.exceptions.d.ts +25 -0
  8. package/dist/auth/exceptions/auth.exceptions.js +52 -0
  9. package/dist/auth/guard/auth.guard.d.ts +11 -0
  10. package/dist/auth/guard/auth.guard.js +71 -0
  11. package/dist/auth/guard/index.d.ts +3 -0
  12. package/dist/auth/guard/index.js +19 -0
  13. package/dist/auth/guard/refresh-token.guard.d.ts +4 -0
  14. package/dist/auth/guard/refresh-token.guard.js +17 -0
  15. package/dist/auth/guard/roles.guard.d.ts +7 -0
  16. package/dist/auth/guard/roles.guard.js +46 -0
  17. package/dist/auth/index.d.ts +8 -0
  18. package/dist/auth/index.js +24 -0
  19. package/dist/auth/interfaces/auth.interface.d.ts +26 -0
  20. package/dist/auth/interfaces/auth.interface.js +2 -0
  21. package/dist/auth/services/auth0.service.d.ts +8 -0
  22. package/dist/auth/services/auth0.service.js +92 -0
  23. package/dist/auth/strategies/jwt.strategy.d.ts +15 -0
  24. package/dist/auth/strategies/jwt.strategy.js +57 -0
  25. package/dist/auth/strategies/refresh-token.strategy.d.ts +15 -0
  26. package/dist/auth/strategies/refresh-token.strategy.js +57 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +18 -0
  29. package/dist/middlewares/AuthMiddleware.d.ts +9 -0
  30. package/dist/middlewares/AuthMiddleware.js +62 -0
  31. package/package.json +50 -0
@@ -0,0 +1,2 @@
1
+ export declare class AuthModule {
2
+ }
@@ -0,0 +1,54 @@
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.AuthModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const jwt_1 = require("@nestjs/jwt");
12
+ const config_1 = require("@nestjs/config");
13
+ const auth_guard_1 = require("./guard/auth.guard");
14
+ const roles_guard_1 = require("./guard/roles.guard");
15
+ const jwt_strategy_1 = require("./strategies/jwt.strategy");
16
+ const refresh_token_strategy_1 = require("./strategies/refresh-token.strategy");
17
+ const refresh_token_guard_1 = require("./guard/refresh-token.guard");
18
+ const auth0_service_1 = require("./services/auth0.service");
19
+ let AuthModule = class AuthModule {
20
+ };
21
+ exports.AuthModule = AuthModule;
22
+ exports.AuthModule = AuthModule = __decorate([
23
+ (0, common_1.Module)({
24
+ imports: [
25
+ config_1.ConfigModule,
26
+ jwt_1.JwtModule.registerAsync({
27
+ imports: [config_1.ConfigModule],
28
+ useFactory: (configService) => ({
29
+ secret: configService.get('AUTH0_CLIENT_SECRET'),
30
+ audience: configService.get('AUTH0_AUDIENCE'),
31
+ issuer: `https://${configService.get('AUTH0_DOMAIN')}/`,
32
+ signOptions: { expiresIn: '1h' },
33
+ }),
34
+ inject: [config_1.ConfigService],
35
+ }),
36
+ ],
37
+ providers: [
38
+ auth0_service_1.Auth0Service,
39
+ auth_guard_1.JwtAuthGuard,
40
+ roles_guard_1.RolesGuard,
41
+ jwt_strategy_1.JwtStrategy,
42
+ refresh_token_strategy_1.RefreshTokenStrategy,
43
+ refresh_token_guard_1.RefreshTokenGuard,
44
+ ],
45
+ exports: [
46
+ auth0_service_1.Auth0Service,
47
+ auth_guard_1.JwtAuthGuard,
48
+ roles_guard_1.RolesGuard,
49
+ jwt_strategy_1.JwtStrategy,
50
+ refresh_token_strategy_1.RefreshTokenStrategy,
51
+ refresh_token_guard_1.RefreshTokenGuard,
52
+ ],
53
+ })
54
+ ], AuthModule);
@@ -0,0 +1 @@
1
+ export declare const Roles: (...roles: string[]) => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Roles = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const Roles = (...roles) => (0, common_1.SetMetadata)('roles', roles);
6
+ exports.Roles = Roles;
@@ -0,0 +1,3 @@
1
+ export declare class RefreshTokenDto {
2
+ refreshToken: string;
3
+ }
@@ -0,0 +1,22 @@
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);
@@ -0,0 +1,25 @@
1
+ import { HttpException } from '@nestjs/common';
2
+ export declare class InvalidCredentialsException extends HttpException {
3
+ constructor();
4
+ }
5
+ export declare class UserAlreadyExistsException extends HttpException {
6
+ constructor(email: string);
7
+ }
8
+ export declare class InvalidTokenException extends HttpException {
9
+ constructor();
10
+ }
11
+ export declare class TokenExpiredException extends HttpException {
12
+ constructor();
13
+ }
14
+ export declare class InvalidRefreshTokenException extends HttpException {
15
+ constructor();
16
+ }
17
+ export declare class UserNotFoundException extends HttpException {
18
+ constructor(email: string);
19
+ }
20
+ export declare class InvalidInviteCodeException extends HttpException {
21
+ constructor();
22
+ }
23
+ export declare class AccountNotVerifiedException extends HttpException {
24
+ constructor();
25
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountNotVerifiedException = exports.InvalidInviteCodeException = exports.UserNotFoundException = exports.InvalidRefreshTokenException = exports.TokenExpiredException = exports.InvalidTokenException = exports.UserAlreadyExistsException = exports.InvalidCredentialsException = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class InvalidCredentialsException extends common_1.HttpException {
6
+ constructor() {
7
+ super('Invalid email or password', common_1.HttpStatus.UNAUTHORIZED);
8
+ }
9
+ }
10
+ exports.InvalidCredentialsException = InvalidCredentialsException;
11
+ class UserAlreadyExistsException extends common_1.HttpException {
12
+ constructor(email) {
13
+ super(`User with email ${email} already exists`, common_1.HttpStatus.CONFLICT);
14
+ }
15
+ }
16
+ exports.UserAlreadyExistsException = UserAlreadyExistsException;
17
+ class InvalidTokenException extends common_1.HttpException {
18
+ constructor() {
19
+ super('Invalid or expired token', common_1.HttpStatus.UNAUTHORIZED);
20
+ }
21
+ }
22
+ exports.InvalidTokenException = InvalidTokenException;
23
+ class TokenExpiredException extends common_1.HttpException {
24
+ constructor() {
25
+ super('Token has expired', common_1.HttpStatus.UNAUTHORIZED);
26
+ }
27
+ }
28
+ exports.TokenExpiredException = TokenExpiredException;
29
+ class InvalidRefreshTokenException extends common_1.HttpException {
30
+ constructor() {
31
+ super('Invalid or expired refresh token', common_1.HttpStatus.UNAUTHORIZED);
32
+ }
33
+ }
34
+ exports.InvalidRefreshTokenException = InvalidRefreshTokenException;
35
+ class UserNotFoundException extends common_1.HttpException {
36
+ constructor(email) {
37
+ super(`User with email ${email} not found`, common_1.HttpStatus.NOT_FOUND);
38
+ }
39
+ }
40
+ exports.UserNotFoundException = UserNotFoundException;
41
+ class InvalidInviteCodeException extends common_1.HttpException {
42
+ constructor() {
43
+ super('Invalid or expired invite code', common_1.HttpStatus.BAD_REQUEST);
44
+ }
45
+ }
46
+ exports.InvalidInviteCodeException = InvalidInviteCodeException;
47
+ class AccountNotVerifiedException extends common_1.HttpException {
48
+ constructor() {
49
+ super('Account not verified. Please check your email for verification link', common_1.HttpStatus.FORBIDDEN);
50
+ }
51
+ }
52
+ exports.AccountNotVerifiedException = AccountNotVerifiedException;
@@ -0,0 +1,11 @@
1
+ import { ExecutionContext } from '@nestjs/common';
2
+ import { Auth0Service } from '../services/auth0.service';
3
+ declare const JwtAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
4
+ export declare class JwtAuthGuard extends JwtAuthGuard_base {
5
+ private readonly auth0Service;
6
+ private readonly logger;
7
+ constructor(auth0Service: Auth0Service);
8
+ canActivate(context: ExecutionContext): Promise<boolean>;
9
+ private extractTokenFromHeader;
10
+ }
11
+ export {};
@@ -0,0 +1,71 @@
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 JwtAuthGuard_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.JwtAuthGuard = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const passport_1 = require("@nestjs/passport");
16
+ const auth0_service_1 = require("../services/auth0.service");
17
+ const common_2 = require("@nestjs/common");
18
+ let JwtAuthGuard = JwtAuthGuard_1 = class JwtAuthGuard extends (0, passport_1.AuthGuard)('jwt') {
19
+ auth0Service;
20
+ logger = new common_2.Logger(JwtAuthGuard_1.name);
21
+ constructor(auth0Service) {
22
+ super();
23
+ this.auth0Service = auth0Service;
24
+ }
25
+ async canActivate(context) {
26
+ const request = context.switchToHttp().getRequest();
27
+ const publicRoutes = ['/health', '/healthcheck', 'health', 'healthcheck'];
28
+ const internalServiceRoutes = [
29
+ '/media/transcode-video-to-hls',
30
+ 'transcode-video-to-hls',
31
+ ];
32
+ const path = request.path || request.url?.split('?')[0] || '';
33
+ const isPublicRoute = publicRoutes.some((route) => path === route || path === `/${route}` || path.endsWith(route));
34
+ const isInternalRoute = internalServiceRoutes.some((route) => path === route || path === `/${route}` || path.endsWith(route));
35
+ if (isPublicRoute || isInternalRoute) {
36
+ return true;
37
+ }
38
+ const token = this.extractTokenFromHeader(request);
39
+ if (!token) {
40
+ throw new common_1.UnauthorizedException('No token provided');
41
+ }
42
+ try {
43
+ this.logger.debug('JwtAuthGuard-> requesting jwt verify token process');
44
+ const payload = (await this.auth0Service.validateToken(token));
45
+ this.logger.debug('JwtAuthGuard-> jwt token verification success');
46
+ request['user'] = payload;
47
+ return true;
48
+ }
49
+ catch (error) {
50
+ this.logger.error('JwtAuthGuard-> jwt token verification failed');
51
+ this.logger.error(error);
52
+ if (error instanceof common_1.UnauthorizedException) {
53
+ throw error;
54
+ }
55
+ throw new common_1.UnauthorizedException('Invalid token');
56
+ }
57
+ }
58
+ extractTokenFromHeader(request) {
59
+ const authHeader = request.headers?.authorization;
60
+ if (typeof authHeader !== 'string') {
61
+ return undefined;
62
+ }
63
+ const [type, token] = authHeader.split(' ');
64
+ return type === 'Bearer' ? token : undefined;
65
+ }
66
+ };
67
+ exports.JwtAuthGuard = JwtAuthGuard;
68
+ exports.JwtAuthGuard = JwtAuthGuard = JwtAuthGuard_1 = __decorate([
69
+ (0, common_1.Injectable)(),
70
+ __metadata("design:paramtypes", [auth0_service_1.Auth0Service])
71
+ ], JwtAuthGuard);
@@ -0,0 +1,3 @@
1
+ export * from './auth.guard';
2
+ export * from './roles.guard';
3
+ export * from './refresh-token.guard';
@@ -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("./auth.guard"), exports);
18
+ __exportStar(require("./roles.guard"), exports);
19
+ __exportStar(require("./refresh-token.guard"), exports);
@@ -0,0 +1,4 @@
1
+ declare const RefreshTokenGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
2
+ export declare class RefreshTokenGuard extends RefreshTokenGuard_base {
3
+ }
4
+ export {};
@@ -0,0 +1,17 @@
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.RefreshTokenGuard = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const passport_1 = require("@nestjs/passport");
12
+ let RefreshTokenGuard = class RefreshTokenGuard extends (0, passport_1.AuthGuard)('refresh-token') {
13
+ };
14
+ exports.RefreshTokenGuard = RefreshTokenGuard;
15
+ exports.RefreshTokenGuard = RefreshTokenGuard = __decorate([
16
+ (0, common_1.Injectable)()
17
+ ], RefreshTokenGuard);
@@ -0,0 +1,7 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ export declare class RolesGuard implements CanActivate {
4
+ private reflector;
5
+ constructor(reflector: Reflector);
6
+ canActivate(context: ExecutionContext): boolean;
7
+ }
@@ -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
+ 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.RolesGuard = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ let RolesGuard = class RolesGuard {
16
+ reflector;
17
+ constructor(reflector) {
18
+ this.reflector = reflector;
19
+ }
20
+ canActivate(context) {
21
+ const isPublic = this.reflector.getAllAndOverride('isPublic', [
22
+ context.getHandler(),
23
+ context.getClass(),
24
+ ]);
25
+ if (isPublic) {
26
+ return true;
27
+ }
28
+ const requiredRoles = this.reflector.getAllAndOverride('roles', [
29
+ context.getHandler(),
30
+ context.getClass(),
31
+ ]);
32
+ if (!requiredRoles) {
33
+ return true;
34
+ }
35
+ const request = context
36
+ .switchToHttp()
37
+ .getRequest();
38
+ const user = request.user;
39
+ return requiredRoles.some((role) => user.role === role);
40
+ }
41
+ };
42
+ exports.RolesGuard = RolesGuard;
43
+ exports.RolesGuard = RolesGuard = __decorate([
44
+ (0, common_1.Injectable)(),
45
+ __metadata("design:paramtypes", [core_1.Reflector])
46
+ ], RolesGuard);
@@ -0,0 +1,8 @@
1
+ export * from './auth.module';
2
+ export * from './decorators/roles.decorator';
3
+ export * from './dto/refresh-token.dto';
4
+ export * from './guard';
5
+ export * from './interfaces/auth.interface';
6
+ export * from './services/auth0.service';
7
+ export * from './strategies/jwt.strategy';
8
+ export * from './strategies/refresh-token.strategy';
@@ -0,0 +1,24 @@
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("./auth.module"), exports);
18
+ __exportStar(require("./decorators/roles.decorator"), exports);
19
+ __exportStar(require("./dto/refresh-token.dto"), exports);
20
+ __exportStar(require("./guard"), exports);
21
+ __exportStar(require("./interfaces/auth.interface"), exports);
22
+ __exportStar(require("./services/auth0.service"), exports);
23
+ __exportStar(require("./strategies/jwt.strategy"), exports);
24
+ __exportStar(require("./strategies/refresh-token.strategy"), exports);
@@ -0,0 +1,26 @@
1
+ export interface AuthResponse {
2
+ accessToken: string;
3
+ refreshToken?: string;
4
+ user: {
5
+ email: string;
6
+ firstName?: string;
7
+ lastName?: string;
8
+ mobile?: string;
9
+ features: string[];
10
+ isOnboarded: boolean;
11
+ };
12
+ }
13
+ export interface JwtPayload {
14
+ email: string;
15
+ sub: string;
16
+ role: string;
17
+ }
18
+ export interface TokenResponse {
19
+ accessToken: string;
20
+ refreshToken: string;
21
+ }
22
+ export interface UserPayload {
23
+ id: string;
24
+ email: string;
25
+ role: string;
26
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import { ConfigService } from '@nestjs/config';
2
+ export declare class Auth0Service {
3
+ private readonly configService;
4
+ private jwksClient;
5
+ constructor(configService: ConfigService);
6
+ private getKey;
7
+ validateToken(token: string): Promise<any>;
8
+ }
@@ -0,0 +1,92 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.Auth0Service = void 0;
46
+ const common_1 = require("@nestjs/common");
47
+ const jwt = __importStar(require("jsonwebtoken"));
48
+ const jwksRsa = __importStar(require("jwks-rsa"));
49
+ const config_1 = require("@nestjs/config");
50
+ let Auth0Service = class Auth0Service {
51
+ configService;
52
+ jwksClient;
53
+ constructor(configService) {
54
+ this.configService = configService;
55
+ const domain = this.configService.get('AUTH0_DOMAIN');
56
+ this.jwksClient = new jwksRsa.JwksClient({
57
+ jwksUri: `https://${domain}/.well-known/jwks.json`,
58
+ cache: true,
59
+ rateLimit: true,
60
+ jwksRequestsPerMinute: 10,
61
+ });
62
+ }
63
+ getKey(header, callback) {
64
+ this.jwksClient.getSigningKey(header.kid, (err, key) => {
65
+ if (err) {
66
+ return callback(err, null);
67
+ }
68
+ const signingKey = key.getPublicKey();
69
+ callback(null, signingKey);
70
+ });
71
+ }
72
+ async validateToken(token) {
73
+ return new Promise((resolve, reject) => {
74
+ jwt.verify(token, this.getKey.bind(this), {
75
+ algorithms: ['RS256'],
76
+ audience: this.configService.get('AUTH0_AUDIENCE'),
77
+ issuer: `https://${this.configService.get('AUTH0_DOMAIN')}/`,
78
+ }, (err, decoded) => {
79
+ if (err) {
80
+ console.error('Token validation error:', err);
81
+ return reject(new common_1.UnauthorizedException('Invalid token'));
82
+ }
83
+ resolve(decoded);
84
+ });
85
+ });
86
+ }
87
+ };
88
+ exports.Auth0Service = Auth0Service;
89
+ exports.Auth0Service = Auth0Service = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [config_1.ConfigService])
92
+ ], Auth0Service);
@@ -0,0 +1,15 @@
1
+ import { Strategy } from 'passport-jwt';
2
+ import { ConfigService } from '@nestjs/config';
3
+ declare const JwtStrategy_base: new (...args: [opt: import("passport-jwt").StrategyOptionsWithRequest] | [opt: import("passport-jwt").StrategyOptionsWithoutRequest]) => Strategy & {
4
+ validate(...args: any[]): unknown;
5
+ };
6
+ export declare class JwtStrategy extends JwtStrategy_base {
7
+ private readonly configService;
8
+ constructor(configService: ConfigService);
9
+ validate(payload: any): Promise<{
10
+ userId: any;
11
+ email: any;
12
+ role: any;
13
+ }>;
14
+ }
15
+ export {};
@@ -0,0 +1,57 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.JwtStrategy = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const passport_1 = require("@nestjs/passport");
18
+ const passport_jwt_1 = require("passport-jwt");
19
+ const config_1 = require("@nestjs/config");
20
+ const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
21
+ let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy) {
22
+ configService;
23
+ constructor(configService) {
24
+ const domain = configService.get('AUTH0_DOMAIN');
25
+ const jwksClient = (0, jwks_rsa_1.default)({
26
+ jwksUri: `https://${domain}/.well-known/jwks.json`,
27
+ cache: true,
28
+ rateLimit: true,
29
+ jwksRequestsPerMinute: 10,
30
+ });
31
+ super({
32
+ jwtFromRequest: passport_jwt_1.ExtractJwt.fromAuthHeaderAsBearerToken(),
33
+ ignoreExpiration: false,
34
+ secretOrKeyProvider: (request, token, done) => {
35
+ jwksClient.getSigningKey(token.header.kid, (err, key) => {
36
+ if (err) {
37
+ return done(err, null);
38
+ }
39
+ const signingKey = key.getPublicKey();
40
+ done(null, signingKey);
41
+ });
42
+ },
43
+ audience: configService.get('AUTH0_AUDIENCE'),
44
+ issuer: `https://${domain}/`,
45
+ algorithms: ['RS256'],
46
+ });
47
+ this.configService = configService;
48
+ }
49
+ async validate(payload) {
50
+ return { userId: payload.sub, email: payload.email, role: payload.role };
51
+ }
52
+ };
53
+ exports.JwtStrategy = JwtStrategy;
54
+ exports.JwtStrategy = JwtStrategy = __decorate([
55
+ (0, common_1.Injectable)(),
56
+ __metadata("design:paramtypes", [config_1.ConfigService])
57
+ ], JwtStrategy);
@@ -0,0 +1,15 @@
1
+ import { Strategy } from 'passport-jwt';
2
+ import { ConfigService } from '@nestjs/config';
3
+ declare const RefreshTokenStrategy_base: new (...args: [opt: import("passport-jwt").StrategyOptionsWithRequest] | [opt: import("passport-jwt").StrategyOptionsWithoutRequest]) => Strategy & {
4
+ validate(...args: any[]): unknown;
5
+ };
6
+ export declare class RefreshTokenStrategy extends RefreshTokenStrategy_base {
7
+ private readonly configService;
8
+ constructor(configService: ConfigService);
9
+ validate(payload: any): Promise<{
10
+ userId: any;
11
+ email: any;
12
+ role: any;
13
+ }>;
14
+ }
15
+ export {};
@@ -0,0 +1,57 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RefreshTokenStrategy = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const passport_1 = require("@nestjs/passport");
18
+ const passport_jwt_1 = require("passport-jwt");
19
+ const config_1 = require("@nestjs/config");
20
+ const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
21
+ let RefreshTokenStrategy = class RefreshTokenStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy, 'jwt-refresh') {
22
+ configService;
23
+ constructor(configService) {
24
+ const domain = configService.get('AUTH0_DOMAIN');
25
+ const jwksClient = (0, jwks_rsa_1.default)({
26
+ jwksUri: `https://${domain}/.well-known/jwks.json`,
27
+ cache: true,
28
+ rateLimit: true,
29
+ jwksRequestsPerMinute: 10,
30
+ });
31
+ super({
32
+ jwtFromRequest: passport_jwt_1.ExtractJwt.fromAuthHeaderAsBearerToken(),
33
+ ignoreExpiration: false,
34
+ secretOrKeyProvider: (request, token, done) => {
35
+ jwksClient.getSigningKey(token.header.kid, (err, key) => {
36
+ if (err) {
37
+ return done(err, null);
38
+ }
39
+ const signingKey = key.getPublicKey();
40
+ done(null, signingKey);
41
+ });
42
+ },
43
+ audience: configService.get('AUTH0_AUDIENCE'),
44
+ issuer: `https://${domain}/`,
45
+ algorithms: ['RS256'],
46
+ });
47
+ this.configService = configService;
48
+ }
49
+ async validate(payload) {
50
+ return { userId: payload.sub, email: payload.email, role: payload.role };
51
+ }
52
+ };
53
+ exports.RefreshTokenStrategy = RefreshTokenStrategy;
54
+ exports.RefreshTokenStrategy = RefreshTokenStrategy = __decorate([
55
+ (0, common_1.Injectable)(),
56
+ __metadata("design:paramtypes", [config_1.ConfigService])
57
+ ], RefreshTokenStrategy);
@@ -0,0 +1,2 @@
1
+ export * from './auth';
2
+ export * from './middlewares/AuthMiddleware';
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
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("./auth"), exports);
18
+ __exportStar(require("./middlewares/AuthMiddleware"), exports);
@@ -0,0 +1,9 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { Request, Response } from 'express';
3
+ import { Auth0Service } from '../auth/services/auth0.service';
4
+ export declare class AuthMiddleware implements NestMiddleware {
5
+ private readonly auth0Service;
6
+ private readonly logger;
7
+ constructor(auth0Service: Auth0Service);
8
+ use(req: Request, res: Response, next: () => void): Promise<void>;
9
+ }
@@ -0,0 +1,62 @@
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 AuthMiddleware_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AuthMiddleware = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const lodash_1 = require("lodash");
16
+ const auth0_service_1 = require("../auth/services/auth0.service");
17
+ let AuthMiddleware = AuthMiddleware_1 = class AuthMiddleware {
18
+ auth0Service;
19
+ logger = new common_1.Logger(AuthMiddleware_1.name);
20
+ constructor(auth0Service) {
21
+ this.auth0Service = auth0Service;
22
+ }
23
+ async use(req, res, next) {
24
+ const bearerHeader = req.headers.authorization;
25
+ const accessToken = bearerHeader && bearerHeader.split(' ')[1];
26
+ if (!bearerHeader) {
27
+ throw new common_1.ForbiddenException('Authorization header is missing');
28
+ }
29
+ if (!accessToken) {
30
+ throw new common_1.ForbiddenException('Token is missing');
31
+ }
32
+ try {
33
+ this.logger.debug('requesting jwt verify token process');
34
+ const decodedToken = (await this.auth0Service.validateToken(accessToken));
35
+ const userEmail = (0, lodash_1.get)(decodedToken, 'https://clippyhq.com/email', '');
36
+ const user = {
37
+ id: decodedToken?.sub,
38
+ email: userEmail,
39
+ };
40
+ this.logger.debug('token');
41
+ this.logger.debug({ sub: decodedToken.sub, email: userEmail });
42
+ if (user) {
43
+ res.locals.user = user;
44
+ res.locals.email = user?.email;
45
+ req['customer'] = user;
46
+ this.logger.debug('customer found. Request updated to use customer data...');
47
+ }
48
+ this.logger.debug('jwt token verification success');
49
+ }
50
+ catch (error) {
51
+ this.logger.error('jwt token verification failed');
52
+ this.logger.error(error);
53
+ this.logger.debug('jwt token verification failed.');
54
+ }
55
+ next();
56
+ }
57
+ };
58
+ exports.AuthMiddleware = AuthMiddleware;
59
+ exports.AuthMiddleware = AuthMiddleware = AuthMiddleware_1 = __decorate([
60
+ (0, common_1.Injectable)(),
61
+ __metadata("design:paramtypes", [auth0_service_1.Auth0Service])
62
+ ], AuthMiddleware);
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "clhq-auth-module",
3
+ "version": "1.1.0-alpha.90",
4
+ "description": "Reusable Auth module for NestJS, ready for npm publishing.",
5
+ "author": "khanzzirfan <reacthub.ai@gmail.com>",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist/**/*"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/reacthub-pricematch/clhq-api-monorepo"
14
+ },
15
+ "publishConfig": {
16
+ "registry": "https://registry.npmjs.org/",
17
+ "access": "public"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/reacthub-pricematch/clhq-api-monorepo/issues"
21
+ },
22
+ "license": "MIT",
23
+ "scripts": {
24
+ "build": "yarn exec tsc -p tsconfig.json",
25
+ "test": "jest",
26
+ "version:upgrade:alpha": "standard-version --prerelease alpha",
27
+ "release": "npm publish --tag alpha",
28
+ "release:alpha": "npm publish --tag alpha",
29
+ "release:prealpha": "",
30
+ "clean:build": "rimraf .build",
31
+ "clean:dist": "rimraf dist",
32
+ "clean:webpack": "rimraf .webpack",
33
+ "clean:serverless": "rimraf .serverless",
34
+ "clean:all": "npm run clean:build&& npm run clean:dist&& npm run clean:webpack&& npm run clean:serverless",
35
+ "format": "prettier --write \"src/**/*.ts\"",
36
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
37
+ },
38
+ "peerDependencies": {
39
+ "@nestjs/common": ">=11.0.0",
40
+ "@nestjs/core": ">=11.0.0"
41
+ },
42
+ "devDependencies": {
43
+ "class-transformer": "^0.5.1",
44
+ "class-validator": "^0.14.2",
45
+ "compression": "^1.7.4",
46
+ "reflect-metadata": "^0.2.2",
47
+ "rxjs": "^7.8.2",
48
+ "standard-version": "^9.5.0"
49
+ }
50
+ }