@point3/logto-module 1.0.16 → 1.0.17

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 (62) hide show
  1. package/.idea/inspectionProfiles/Project_Default.xml +7 -0
  2. package/.idea/misc.xml +6 -0
  3. package/.idea/modules.xml +8 -0
  4. package/.idea/point3-logto-module.iml +9 -0
  5. package/.idea/vcs.xml +6 -0
  6. package/client/logto-login-session.ts +1 -1
  7. package/package.json +1 -1
  8. package/dist/client/__tests__/m2m-client.spec.d.ts +0 -1
  9. package/dist/client/__tests__/m2m-client.spec.js +0 -55
  10. package/dist/client/__tests__/m2m-client.spec.js.map +0 -1
  11. package/dist/client/__tests__/oauth-client.spec.d.ts +0 -1
  12. package/dist/client/__tests__/oauth-client.spec.js +0 -40
  13. package/dist/client/__tests__/oauth-client.spec.js.map +0 -1
  14. package/dist/client/config.d.ts +0 -21
  15. package/dist/client/config.js +0 -16
  16. package/dist/client/config.js.map +0 -1
  17. package/dist/client/index.d.ts +0 -5
  18. package/dist/client/index.js +0 -22
  19. package/dist/client/index.js.map +0 -1
  20. package/dist/client/logto-login-session.d.ts +0 -28
  21. package/dist/client/logto-login-session.js +0 -128
  22. package/dist/client/logto-login-session.js.map +0 -1
  23. package/dist/client/m2m-client.d.ts +0 -38
  24. package/dist/client/m2m-client.js +0 -225
  25. package/dist/client/m2m-client.js.map +0 -1
  26. package/dist/client/oauth-client.d.ts +0 -25
  27. package/dist/client/oauth-client.js +0 -135
  28. package/dist/client/oauth-client.js.map +0 -1
  29. package/dist/client/types.d.ts +0 -45
  30. package/dist/client/types.js +0 -37
  31. package/dist/client/types.js.map +0 -1
  32. package/dist/errors.d.ts +0 -24
  33. package/dist/errors.js +0 -62
  34. package/dist/errors.js.map +0 -1
  35. package/dist/index.d.ts +0 -4
  36. package/dist/index.js +0 -41
  37. package/dist/index.js.map +0 -1
  38. package/dist/module.d.ts +0 -4
  39. package/dist/module.js +0 -70
  40. package/dist/module.js.map +0 -1
  41. package/dist/stateless/decorator.d.ts +0 -7
  42. package/dist/stateless/decorator.js +0 -10
  43. package/dist/stateless/decorator.js.map +0 -1
  44. package/dist/stateless/guard.d.ts +0 -11
  45. package/dist/stateless/guard.js +0 -70
  46. package/dist/stateless/guard.js.map +0 -1
  47. package/dist/stateless/guard.spec.d.ts +0 -1
  48. package/dist/stateless/guard.spec.js +0 -210
  49. package/dist/stateless/guard.spec.js.map +0 -1
  50. package/dist/stateless/index.d.ts +0 -2
  51. package/dist/stateless/index.js +0 -19
  52. package/dist/stateless/index.js.map +0 -1
  53. package/dist/token/access-token.d.ts +0 -31
  54. package/dist/token/access-token.js +0 -19
  55. package/dist/token/access-token.js.map +0 -1
  56. package/dist/token/index.d.ts +0 -2
  57. package/dist/token/index.js +0 -19
  58. package/dist/token/index.js.map +0 -1
  59. package/dist/token/verifier.d.ts +0 -13
  60. package/dist/token/verifier.js +0 -65
  61. package/dist/token/verifier.js.map +0 -1
  62. package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/module.js DELETED
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogtoModule = void 0;
4
- const config_1 = require("@nestjs/config");
5
- const client_1 = require("./client");
6
- const token_1 = require("./token");
7
- const stateless_1 = require("./stateless");
8
- class LogtoModule {
9
- static forLogger(loggerModule, loggerToken, global = false) {
10
- const baseProviders = [
11
- {
12
- provide: client_1.LogtoLoggerServiceToken,
13
- useExisting: loggerToken,
14
- },
15
- {
16
- provide: token_1.LogtoTokenVerifierToken,
17
- useClass: token_1.LogtoTokenVerifier,
18
- },
19
- {
20
- provide: stateless_1.LogtoTokenGuardToken,
21
- useClass: stateless_1.LogtoTokenGuard,
22
- },
23
- ];
24
- const statefulProviders = [
25
- {
26
- provide: client_1.OAuthClientToken,
27
- useFactory: (configService, logger) => {
28
- if (configService.get('LOGTO_CLIENT')?.toLowerCase() === 'true') {
29
- return new client_1.OAuthClient(configService, logger);
30
- }
31
- return null;
32
- },
33
- inject: [config_1.ConfigService, client_1.LogtoLoggerServiceToken],
34
- },
35
- {
36
- provide: client_1.LogtoLoginSessionToken,
37
- useFactory: (configService, logger, oauthClient) => {
38
- if (configService.get('LOGTO_CLIENT')?.toLowerCase() === 'true') {
39
- return new client_1.LogtoLoginSession(logger, configService, oauthClient);
40
- }
41
- return null;
42
- },
43
- inject: [config_1.ConfigService, client_1.LogtoLoggerServiceToken, client_1.OAuthClientToken],
44
- },
45
- {
46
- provide: client_1.LogtoM2MClientToken,
47
- useFactory: (configService, tokenVerifier, logger) => {
48
- if (configService.get('LOGTO_CLIENT')?.toLowerCase() === 'true') {
49
- return new client_1.LogtoM2MClient(configService, tokenVerifier, logger);
50
- }
51
- return null;
52
- },
53
- inject: [config_1.ConfigService, token_1.LogtoTokenVerifierToken, client_1.LogtoLoggerServiceToken],
54
- },
55
- ];
56
- const providers = [...baseProviders, ...statefulProviders];
57
- return {
58
- module: LogtoModule,
59
- global: global,
60
- imports: [
61
- loggerModule,
62
- ],
63
- providers: providers,
64
- exports: providers,
65
- };
66
- }
67
- }
68
- exports.LogtoModule = LogtoModule;
69
- ;
70
- //# sourceMappingURL=module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../module.ts"],"names":[],"mappings":";;;AACA,2CAA6D;AAC7D,qCAQkB;AAClB,mCAAsE;AACtE,2CAAoE;AAiBpE,MAAa,WAAW;IAgDpB,MAAM,CAAC,SAAS,CACZ,YAAuB,EACvB,WAA4B,EAC5B,SAAkB,KAAK;QAEvB,MAAM,aAAa,GAAe;YAC9B;gBACI,OAAO,EAAE,gCAAuB;gBAChC,WAAW,EAAE,WAAW;aAC3B;YACD;gBACI,OAAO,EAAE,+BAAuB;gBAChC,QAAQ,EAAE,0BAAkB;aAC/B;YACD;gBACI,OAAO,EAAE,gCAAoB;gBAC7B,QAAQ,EAAE,2BAAe;aAC5B;SACJ,CAAC;QAEF,MAAM,iBAAiB,GAAe;YAClC;gBACI,OAAO,EAAE,yBAAgB;gBACzB,UAAU,EAAE,CAAC,aAA4B,EAAE,MAAW,EAAE,EAAE;oBACtD,IAAI,aAAa,CAAC,GAAG,CAAS,cAAc,CAAC,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;wBACtE,OAAO,IAAI,oBAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;oBAClD,CAAC;oBACD,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,MAAM,EAAE,CAAC,sBAAa,EAAE,gCAAuB,CAAC;aACnD;YACD;gBACI,OAAO,EAAE,+BAAsB;gBAC/B,UAAU,EAAE,CAAC,aAA4B,EAAE,MAAW,EAAE,WAAwB,EAAE,EAAE;oBAChF,IAAI,aAAa,CAAC,GAAG,CAAS,cAAc,CAAC,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;wBACtE,OAAO,IAAI,0BAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;oBACrE,CAAC;oBACD,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,MAAM,EAAE,CAAC,sBAAa,EAAE,gCAAuB,EAAE,yBAAgB,CAAC;aACrE;YACD;gBACI,OAAO,EAAE,4BAAmB;gBAC5B,UAAU,EAAE,CAAC,aAA4B,EAAE,aAAiC,EAAE,MAAW,EAAE,EAAE;oBACzF,IAAI,aAAa,CAAC,GAAG,CAAS,cAAc,CAAC,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;wBACtE,OAAO,IAAI,uBAAc,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;oBACpE,CAAC;oBACD,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,MAAM,EAAE,CAAC,sBAAa,EAAE,+BAAuB,EAAE,gCAAuB,CAAC;aAC5E;SACJ,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,iBAAiB,CAAC,CAAC;QAE3D,OAAO;YACH,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,YAAY;aACf;YACD,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,SAAS;SACrB,CAAC;IACN,CAAC;CACJ;AAjHD,kCAiHC;AAAA,CAAC"}
@@ -1,7 +0,0 @@
1
- import { applyDecorators } from '@nestjs/common';
2
- type LogtoProtectedOptions<T> = Partial<{
3
- requiredScopes: string[];
4
- requiredRoles: (T | 'management-point3')[];
5
- }>;
6
- export declare function LogtoProtected<RoleType>(options?: LogtoProtectedOptions<RoleType>): ReturnType<typeof applyDecorators>;
7
- export {};
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogtoProtected = LogtoProtected;
4
- const common_1 = require("@nestjs/common");
5
- const guard_1 = require("./guard");
6
- function LogtoProtected(options) {
7
- const { requiredScopes, requiredRoles } = options ?? {};
8
- return (0, common_1.applyDecorators)((0, common_1.UseGuards)(guard_1.LogtoTokenGuard), (0, common_1.SetMetadata)('requiredScopes', requiredScopes && requiredScopes.length > 0 ? requiredScopes : undefined), (0, common_1.SetMetadata)('requiredRoles', requiredRoles && requiredRoles.length > 0 ? requiredRoles : undefined));
9
- }
10
- //# sourceMappingURL=decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decorator.js","sourceRoot":"","sources":["../../stateless/decorator.ts"],"names":[],"mappings":";;AAQA,wCAOC;AAfD,2CAAyE;AACzE,mCAA0C;AAO1C,SAAgB,cAAc,CAAW,OAAyC;IAChF,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACxD,OAAO,IAAA,wBAAe,EACpB,IAAA,kBAAS,EAAC,uBAAe,CAAC,EAC1B,IAAA,oBAAW,EAAC,gBAAgB,EAAE,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EACvG,IAAA,oBAAW,EAAC,eAAe,EAAE,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CACpG,CAAC;AACJ,CAAC"}
@@ -1,11 +0,0 @@
1
- import { CanActivate, ExecutionContext } from '@nestjs/common';
2
- import { Reflector } from '@nestjs/core';
3
- import { LogtoTokenVerifier } from '../token';
4
- export declare const LogtoTokenGuardToken: unique symbol;
5
- export declare class LogtoTokenGuard implements CanActivate {
6
- private reflector;
7
- private tokenVerifier;
8
- constructor(reflector: Reflector, tokenVerifier: LogtoTokenVerifier);
9
- canActivate(context: ExecutionContext): Promise<boolean>;
10
- private extractBearerTokenFrom;
11
- }
@@ -1,70 +0,0 @@
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.LogtoTokenGuard = exports.LogtoTokenGuardToken = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const core_1 = require("@nestjs/core");
18
- const jose_1 = require("jose");
19
- const point3_common_tool_1 = require("point3-common-tool");
20
- const token_1 = require("../token");
21
- exports.LogtoTokenGuardToken = Symbol('LogtoTokenGuard');
22
- let LogtoTokenGuard = class LogtoTokenGuard {
23
- constructor(reflector, tokenVerifier) {
24
- this.reflector = reflector;
25
- this.tokenVerifier = tokenVerifier;
26
- }
27
- async canActivate(context) {
28
- const requiredScopes = this.reflector.get('requiredScopes', context.getHandler());
29
- const requiredRoles = this.reflector.get('requiredRoles', context.getHandler());
30
- const request = context.switchToHttp().getRequest();
31
- try {
32
- const bearerToken = this.extractBearerTokenFrom(request.headers);
33
- const result = await this.tokenVerifier.verifyToken(bearerToken, requiredScopes, requiredRoles);
34
- request.user = {
35
- userId: result.sub,
36
- managerId: point3_common_tool_1.p3Values.Guid.parse(result.managerId),
37
- clientId: result.clientId ? point3_common_tool_1.p3Values.Guid.parse(result.clientId) : undefined,
38
- };
39
- return true;
40
- }
41
- catch (error) {
42
- if (error instanceof common_1.UnauthorizedException)
43
- throw error;
44
- if (error instanceof jose_1.errors.JOSEError)
45
- throw new common_1.UnauthorizedException(error);
46
- if (error instanceof Error)
47
- throw new common_1.InternalServerErrorException("요청을 처리하지 못하였습니다.", `${common_1.HttpStatus.INTERNAL_SERVER_ERROR}`);
48
- throw new common_1.UnauthorizedException("접근이 허용되지 않습니다.");
49
- }
50
- }
51
- extractBearerTokenFrom(headers) {
52
- const bearerTokenIdentifier = 'Bearer';
53
- if (!headers.authorization) {
54
- throw new common_1.UnauthorizedException('Authorization header is missing');
55
- }
56
- if (!headers.authorization.startsWith(bearerTokenIdentifier)) {
57
- throw new common_1.UnauthorizedException('Authorization token type not supported');
58
- }
59
- return headers.authorization.slice(bearerTokenIdentifier.length + 1);
60
- }
61
- ;
62
- };
63
- exports.LogtoTokenGuard = LogtoTokenGuard;
64
- exports.LogtoTokenGuard = LogtoTokenGuard = __decorate([
65
- (0, common_1.Injectable)(),
66
- __param(1, (0, common_1.Inject)(token_1.LogtoTokenVerifierToken)),
67
- __metadata("design:paramtypes", [core_1.Reflector,
68
- token_1.LogtoTokenVerifier])
69
- ], LogtoTokenGuard);
70
- //# sourceMappingURL=guard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../stateless/guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAQwB;AACxB,uCAAyC;AAGzC,+BAA8B;AAE9B,2DAA8C;AAC9C,oCAAuE;AAE1D,QAAA,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAGvD,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YACU,SAAoB,EAGpB,aAAiC;QAHjC,cAAS,GAAT,SAAS,CAAW;QAGpB,kBAAa,GAAb,aAAa,CAAoB;IACvC,CAAC;IAEL,KAAK,CAAC,WAAW,CAAC,OAAyB;QAEzC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAW,gBAAgB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5F,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAW,eAAe,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAE1F,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAGpD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;YAGhG,OAAO,CAAC,IAAI,GAAG;gBACb,MAAM,EAAE,MAAM,CAAC,GAAG;gBAClB,SAAS,EAAE,6BAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;gBAChD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,6BAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aAC7E,CAAA;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,8BAAqB;gBAAE,MAAM,KAAK,CAAC;YACxD,IAAI,KAAK,YAAY,aAAM,CAAC,SAAS;gBAAE,MAAM,IAAI,8BAAqB,CAAC,KAAK,CAAC,CAAC;YAC9E,IAAI,KAAK,YAAY,KAAK;gBAAE,MAAM,IAAI,qCAA4B,CAAC,kBAAkB,EAAE,GAAG,mBAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAE9H,MAAM,IAAI,8BAAqB,CAAC,gBAAgB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAQO,sBAAsB,CAAC,OAA4B;QACzD,MAAM,qBAAqB,GAAG,QAAQ,CAAC;QAEvC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,8BAAqB,CAAC,iCAAiC,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,8BAAqB,CAAC,wCAAwC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvE,CAAC;IAAA,CAAC;CACH,CAAA;AAvDY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,+BAAuB,CAAC,CAAA;qCAFb,gBAAS;QAGL,0BAAkB;GALhC,eAAe,CAuD3B"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,210 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const testing_1 = require("@nestjs/testing");
4
- const common_1 = require("@nestjs/common");
5
- const core_1 = require("@nestjs/core");
6
- const guard_1 = require("./guard");
7
- const token_1 = require("../token");
8
- const point3_common_tool_1 = require("point3-common-tool");
9
- const client_1 = require("client");
10
- describe('LogtoTokenGuard 테스트', () => {
11
- let guard;
12
- let tokenUtil;
13
- let reflector;
14
- let logger;
15
- const testToken = 'eyJhbGciOiJFUzM4NCIsInR5cCI6ImF0K2p3dCIsImtpZCI6ImxKUjU3SkFqVmV1dHk4eWljVzUtdFFySDM2WFl6NUlzWFhXSDVzeXV0dEEifQ.eyJ1c2VyUm9sZXMiOlsicDMtQ0lTTy0wIl0sIm1hbmFnZXJJZCI6Im1hbmFnZXItMDE5NjQ0NWMtOGVjNy03MDc4LWExNDItNGU3ZGI5YTRhYWVhIiwiY2xpZW50SWQiOiJwb2ludDMtMDE5NjNjODUtNDQ2ZS03NGM5LWFmNzktNDhlMjU0NjVjMzI3IiwianRpIjoiV0RYTmxoTWkwT0tHQ1pTRzFKZnBrIiwic3ViIjoieXVsaXVmdHNvMWQwIiwiaWF0IjoxNzQ5MDI0NzIzLCJleHAiOjE3NDkwMjgzMjMsInNjb3BlIjoiIiwiY2xpZW50X2lkIjoiNXFydmk5eW0wajJ0YTJ6YXBnbHU0IiwiaXNzIjoiaHR0cHM6Ly9sb2d0by5wb2ludDMuaW8vb2lkYyIsImF1ZCI6Imh0dHBzOi8vZGVmYXVsdC5sb2d0by5hcHAvYXBpIn0.nZdzvdxQ74m2oFEklVTfQlcqYBkRrRxtHQEgz1L6DjST9_9Wa7H7J1gKJVEjm8NnjFCQXljYM_hTVx1ABTmUgDrEKVjtHFVKUyPoSzxQitXexwmBZY5l8WdyqJDqAy8d';
16
- const mockPayload = {
17
- userRoles: ['p3-CISO-0'],
18
- managerId: 'manager-0196445c-8ec7-7078-a142-4e7db9a4aaea',
19
- clientId: 'point3-019663c85-446e-74c9-af79-48e25465c327',
20
- jti: 'WDXNlhMi0OKGCZSG1Jfpk',
21
- sub: 'yuliuftso1d0',
22
- iat: 1749024723,
23
- exp: 1749028323,
24
- scope: '',
25
- client_id: '5qrvi9ym0j2ta2zapglu4',
26
- iss: 'https://logto.point3.io/oidc',
27
- aud: 'https://default.logto.app/api'
28
- };
29
- beforeEach(async () => {
30
- const mockTokenUtil = {
31
- verifyToken: jest.fn(),
32
- };
33
- const mockReflector = {
34
- get: jest.fn(),
35
- };
36
- const mockLogger = {
37
- warn: jest.fn(),
38
- error: jest.fn(),
39
- log: jest.fn(),
40
- };
41
- const module = await testing_1.Test.createTestingModule({
42
- providers: [
43
- guard_1.LogtoTokenGuard,
44
- {
45
- provide: token_1.LogtoTokenVerifierToken,
46
- useValue: mockTokenUtil,
47
- },
48
- {
49
- provide: core_1.Reflector,
50
- useValue: mockReflector,
51
- },
52
- {
53
- provide: client_1.LogtoLoggerServiceToken,
54
- useValue: mockLogger,
55
- },
56
- ],
57
- }).compile();
58
- guard = module.get(guard_1.LogtoTokenGuard);
59
- tokenUtil = module.get(token_1.LogtoTokenVerifierToken);
60
- reflector = module.get(core_1.Reflector);
61
- logger = module.get(client_1.LogtoLoggerServiceToken);
62
- jest.clearAllMocks();
63
- });
64
- const createMockExecutionContext = (headers = {}, route = { path: '/test' }) => {
65
- const mockRequest = {
66
- headers,
67
- route,
68
- user: undefined
69
- };
70
- return {
71
- switchToHttp: () => ({
72
- getRequest: () => mockRequest,
73
- getResponse: jest.fn(),
74
- getNext: jest.fn(),
75
- }),
76
- getHandler: jest.fn(),
77
- getClass: jest.fn(),
78
- getArgs: jest.fn(),
79
- getArgByIndex: jest.fn(),
80
- switchToRpc: jest.fn(),
81
- switchToWs: jest.fn(),
82
- getType: jest.fn(),
83
- };
84
- };
85
- describe('🔐 성공적인 인증 테스트', () => {
86
- it('유효한 토큰이 제공되었을 때 인증하고 사용자 데이터를 설정해야 함', async () => {
87
- const context = createMockExecutionContext({
88
- authorization: `Bearer ${testToken}`,
89
- });
90
- reflector.get
91
- .mockReturnValueOnce(undefined)
92
- .mockReturnValueOnce(['p3-CISO-0']);
93
- tokenUtil.verifyToken.mockResolvedValueOnce(mockPayload);
94
- const result = await guard.canActivate(context);
95
- const request = context.switchToHttp().getRequest();
96
- expect(result).toBe(true);
97
- expect(tokenUtil.verifyToken).toHaveBeenCalledWith(testToken, undefined, ['p3-CISO-0']);
98
- expect(request.user).toEqual({
99
- userId: 'yuliuftso1d0',
100
- managerId: expect.objectContaining({
101
- toString: expect.any(Function)
102
- }),
103
- clientId: expect.objectContaining({
104
- toString: expect.any(Function)
105
- }),
106
- });
107
- expect(request.user.managerId.toString()).toContain('manager');
108
- expect(request.user.managerId.toString()).toContain('0196445c-8ec7-7078-a142-4e7db9a4aaea');
109
- expect(request.user.clientId.toString()).toContain('point3');
110
- expect(request.user.clientId.toString()).toContain('019663c85-446e-74c9-af79-48e25465c327');
111
- });
112
- it('필수 스코프나 역할이 없을 때도 동작해야 함', async () => {
113
- const context = createMockExecutionContext({
114
- authorization: `Bearer ${testToken}`,
115
- });
116
- reflector.get
117
- .mockReturnValueOnce(undefined)
118
- .mockReturnValueOnce(undefined);
119
- tokenUtil.verifyToken.mockResolvedValueOnce(mockPayload);
120
- const result = await guard.canActivate(context);
121
- expect(result).toBe(true);
122
- expect(tokenUtil.verifyToken).toHaveBeenCalledWith(testToken, undefined, undefined);
123
- });
124
- });
125
- describe('🚫 토큰 추출 실패 테스트', () => {
126
- it('Authorization 헤더가 없을 때 UnauthorizedException을 던져야 함', async () => {
127
- const context = createMockExecutionContext({});
128
- reflector.get
129
- .mockReturnValueOnce(undefined)
130
- .mockReturnValueOnce(['p3-CISO-0']);
131
- await expect(guard.canActivate(context)).rejects.toThrow(common_1.UnauthorizedException);
132
- await expect(guard.canActivate(context)).rejects.toThrow('Authorization header is missing');
133
- });
134
- it('Authorization 헤더가 Bearer가 아닐 때 UnauthorizedException을 던져야 함', async () => {
135
- const context = createMockExecutionContext({
136
- authorization: 'Basic sometoken',
137
- });
138
- reflector.get
139
- .mockReturnValueOnce(undefined)
140
- .mockReturnValueOnce(['p3-CISO-0']);
141
- await expect(guard.canActivate(context)).rejects.toThrow(common_1.UnauthorizedException);
142
- await expect(guard.canActivate(context)).rejects.toThrow('Authorization token type not supported');
143
- });
144
- it('Bearer 헤더에서 토큰을 올바르게 추출해야 함', async () => {
145
- const context = createMockExecutionContext({
146
- authorization: `Bearer ${testToken}`,
147
- });
148
- reflector.get
149
- .mockReturnValueOnce(undefined)
150
- .mockReturnValueOnce(['p3-CISO-0']);
151
- tokenUtil.verifyToken.mockResolvedValueOnce(mockPayload);
152
- await guard.canActivate(context);
153
- expect(tokenUtil.verifyToken).toHaveBeenCalledWith(testToken, undefined, ['p3-CISO-0']);
154
- });
155
- });
156
- describe('❌ 토큰 검증 실패 테스트', () => {
157
- it('토큰 검증에서 UnauthorizedException이 발생하면 다시 던져야 함', async () => {
158
- const context = createMockExecutionContext({
159
- authorization: `Bearer ${testToken}`,
160
- });
161
- reflector.get
162
- .mockReturnValueOnce(undefined)
163
- .mockReturnValueOnce(['p3-CISO-0']);
164
- const authError = new common_1.UnauthorizedException('Invalid token');
165
- tokenUtil.verifyToken.mockRejectedValueOnce(authError);
166
- await expect(guard.canActivate(context)).rejects.toThrow(common_1.UnauthorizedException);
167
- });
168
- it('다른 에러가 발생하면 일반적인 에러 메시지를 던져야 함', async () => {
169
- const context = createMockExecutionContext({
170
- authorization: `Bearer ${testToken}`,
171
- });
172
- reflector.get
173
- .mockReturnValueOnce(undefined)
174
- .mockReturnValueOnce(['p3-CISO-0']);
175
- tokenUtil.verifyToken.mockRejectedValueOnce(new Error('Some other error'));
176
- await expect(guard.canActivate(context)).rejects.toThrow('요청을 처리하지 못하였습니다.');
177
- });
178
- });
179
- describe('🔍 실제 JWT 토큰 분석', () => {
180
- it('제공된 JWT 토큰의 페이로드를 올바르게 디코딩해야 함', () => {
181
- const [header, payload, signature] = testToken.split('.');
182
- const decodedPayload = JSON.parse(Buffer.from(payload, 'base64url').toString());
183
- console.log('🔍 디코딩된 토큰 페이로드:');
184
- console.log(JSON.stringify(decodedPayload, null, 2));
185
- expect(decodedPayload.userRoles).toEqual(['p3-CISO-0']);
186
- expect(decodedPayload.managerId).toBe('manager-0196445c-8ec7-7078-a142-4e7db9a4aaea');
187
- expect(decodedPayload.clientId).toBe('point3-01963c85-446e-74c9-af79-48e25465c327');
188
- expect(decodedPayload.sub).toBe('yuliuftso1d0');
189
- expect(decodedPayload.iss).toBe('https://logto.point3.io/oidc');
190
- const expirationDate = new Date(decodedPayload.exp * 1000);
191
- const issuedDate = new Date(decodedPayload.iat * 1000);
192
- console.log(`📅 토큰 발급 시간: ${issuedDate.toISOString()}`);
193
- console.log(`⏰ 토큰 만료 시간: ${expirationDate.toISOString()}`);
194
- console.log(`🏢 발급자: ${decodedPayload.iss}`);
195
- console.log(`👤 사용자 역할: ${decodedPayload.userRoles.join(', ')}`);
196
- });
197
- it('토큰에서 추출된 GUID 값들이 올바른 형식인지 확인해야 함', () => {
198
- const [header, payload, signature] = testToken.split('.');
199
- const decodedPayload = JSON.parse(Buffer.from(payload, 'base64url').toString());
200
- const managerId = point3_common_tool_1.p3Values.Guid.parse(decodedPayload.managerId);
201
- expect(managerId.Prefix == 'manager');
202
- const clientId = point3_common_tool_1.p3Values.Guid.parse(decodedPayload.clientId);
203
- expect(clientId.Prefix == 'point3');
204
- console.log('✅ GUID 형식 검증 완료:');
205
- console.log(` Manager ID: ${managerId.toString()}`);
206
- console.log(` Client ID: ${clientId.toString()}`);
207
- });
208
- });
209
- });
210
- //# sourceMappingURL=guard.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guard.spec.js","sourceRoot":"","sources":["../../stateless/guard.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export * from "./guard";
2
- export * from "./decorator";
@@ -1,19 +0,0 @@
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("./guard"), exports);
18
- __exportStar(require("./decorator"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../stateless/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B"}
@@ -1,31 +0,0 @@
1
- export declare class AccessToken {
2
- static THRESHOLD_TIME: number;
3
- accountId: string;
4
- token: string;
5
- expiresAt: Date;
6
- constructor(accountId: string, token: string, expireInSeconds: number);
7
- isExpired(): boolean;
8
- toString(): string;
9
- }
10
- export type AccessTokenPayload = {
11
- jti: string;
12
- sub: string;
13
- iat: number;
14
- exp: number;
15
- scope: string;
16
- client_id: string;
17
- iss: string;
18
- aud: string;
19
- userRoles: string[];
20
- clientId: string;
21
- managerId: string;
22
- userScopes?: string[];
23
- };
24
- export type IdTokenPayload = {
25
- sub: string;
26
- email: string;
27
- email_verified: boolean;
28
- name: string;
29
- phone_number: string;
30
- username: string;
31
- };
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AccessToken = void 0;
4
- class AccessToken {
5
- constructor(accountId, token, expireInSeconds) {
6
- this.accountId = accountId;
7
- this.token = token;
8
- this.expiresAt = new Date(Date.now() + expireInSeconds * 1000 - AccessToken.THRESHOLD_TIME);
9
- }
10
- isExpired() {
11
- return this.expiresAt < new Date();
12
- }
13
- toString() {
14
- return `AccessToken{accountId: ${this.accountId}, expiresAt: ${this.expiresAt}}`;
15
- }
16
- }
17
- exports.AccessToken = AccessToken;
18
- AccessToken.THRESHOLD_TIME = 1000 * 60 * 10;
19
- //# sourceMappingURL=access-token.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-token.js","sourceRoot":"","sources":["../../token/access-token.ts"],"names":[],"mappings":";;;AACA,MAAa,WAAW;IAOpB,YAAY,SAAiB,EAAE,KAAa,EAAE,eAAuB;QACjE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CACrB,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,IAAI,GAAG,WAAW,CAAC,cAAc,CACnE,CAAC;IACN,CAAC;IAEM,SAAS;QACZ,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IACvC,CAAC;IAEM,QAAQ;QACX,OAAO,0BAA0B,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,SAAS,GAAG,CAAC;IACrF,CAAC;;AArBL,kCAsBC;AArBU,0BAAc,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "./access-token";
2
- export * from "./verifier";
@@ -1,19 +0,0 @@
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("./access-token"), exports);
18
- __exportStar(require("./verifier"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../token/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,6CAA2B"}
@@ -1,13 +0,0 @@
1
- import { ConfigService } from "@nestjs/config";
2
- import * as token from "./access-token";
3
- export declare const LogtoTokenVerifierToken: unique symbol;
4
- export declare class LogtoTokenVerifier {
5
- private readonly configService;
6
- constructor(configService: ConfigService);
7
- verifyToken(token: string): Promise<token.AccessTokenPayload>;
8
- verifyToken(token: string, requiredScopes: string[], requiredRoles: string[]): Promise<token.AccessTokenPayload>;
9
- verifyIdToken(token: string): Promise<token.IdTokenPayload>;
10
- private shouldContainRequiredPrivileges;
11
- private hasInsufficientScopes;
12
- private hasInsufficientRoles;
13
- }
@@ -1,65 +0,0 @@
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.LogtoTokenVerifier = exports.LogtoTokenVerifierToken = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const config_1 = require("@nestjs/config");
18
- const jose_1 = require("jose");
19
- exports.LogtoTokenVerifierToken = Symbol.for("LogtoTokenVerifier");
20
- let LogtoTokenVerifier = class LogtoTokenVerifier {
21
- constructor(configService) {
22
- this.configService = configService;
23
- }
24
- async verifyToken(token, requiredScopes, requiredRoles) {
25
- if (!token)
26
- throw new common_1.UnauthorizedException('엑세스 토큰이 존재하지 않습니다.');
27
- const jwksUri = this.configService.get("LOGTO_JWKS_URI") ?? 'http://localhost:3001/oidc/jwks';
28
- const issuer = this.configService.get("LOGTO_AUTH_ISSUER");
29
- const { payload } = await (0, jose_1.jwtVerify)(token, (0, jose_1.createRemoteJWKSet)(new URL(jwksUri)), { issuer });
30
- const tokenPayload = payload;
31
- if (requiredScopes || requiredRoles) {
32
- this.shouldContainRequiredPrivileges(tokenPayload, requiredScopes, requiredRoles);
33
- }
34
- return tokenPayload;
35
- }
36
- async verifyIdToken(token) {
37
- const jwksUri = process.env.LOGTO_JWKS_URI ?? 'http://localhost:3001/oidc/jwks';
38
- const issuer = process.env.LOGTO_AUTH_ISSUER;
39
- const { payload } = await (0, jose_1.jwtVerify)(token, (0, jose_1.createRemoteJWKSet)(new URL(jwksUri)), { issuer });
40
- return payload;
41
- }
42
- shouldContainRequiredPrivileges(payload, requiredScopes, requiredRoles) {
43
- const { userScopes, userRoles } = payload;
44
- const scopes = userScopes?.flat() ?? [];
45
- if (this.hasInsufficientScopes(requiredScopes, scopes)) {
46
- throw new common_1.UnauthorizedException({ code: 'auth.insufficient_scope', status: 403 }, { cause: requiredScopes });
47
- }
48
- if (this.hasInsufficientRoles(requiredRoles, userRoles)) {
49
- throw new common_1.UnauthorizedException({ code: 'auth.role_mismatch', status: 403 }, { cause: requiredRoles });
50
- }
51
- }
52
- hasInsufficientScopes(requiredScopes, userScopes) {
53
- return !!(requiredScopes && requiredScopes.length > 0 && !requiredScopes.every(scope => userScopes.includes(scope)));
54
- }
55
- hasInsufficientRoles(requiredRoles, userRoles) {
56
- return !!(requiredRoles && requiredRoles.length > 0 && !requiredRoles.some(role => userRoles.includes(role)));
57
- }
58
- };
59
- exports.LogtoTokenVerifier = LogtoTokenVerifier;
60
- exports.LogtoTokenVerifier = LogtoTokenVerifier = __decorate([
61
- (0, common_1.Injectable)(),
62
- __param(0, (0, common_1.Inject)(config_1.ConfigService)),
63
- __metadata("design:paramtypes", [config_1.ConfigService])
64
- ], LogtoTokenVerifier);
65
- //# sourceMappingURL=verifier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../token/verifier.ts"],"names":[],"mappings":"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"}