@point3/logto-module 1.1.2 → 1.1.4

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 (65) hide show
  1. package/README.md +2 -2
  2. package/dist/client/__tests__/m2m-client.spec.d.ts +1 -0
  3. package/dist/client/__tests__/m2m-client.spec.js +55 -0
  4. package/dist/client/__tests__/m2m-client.spec.js.map +1 -0
  5. package/dist/client/__tests__/oauth-client.spec.d.ts +1 -0
  6. package/dist/client/__tests__/oauth-client.spec.js +40 -0
  7. package/dist/client/__tests__/oauth-client.spec.js.map +1 -0
  8. package/dist/client/config.d.ts +44 -0
  9. package/dist/client/config.js +16 -0
  10. package/dist/client/config.js.map +1 -0
  11. package/dist/client/index.d.ts +5 -0
  12. package/dist/client/index.js +22 -0
  13. package/dist/client/index.js.map +1 -0
  14. package/dist/client/logto-login-session.d.ts +27 -0
  15. package/dist/client/logto-login-session.js +119 -0
  16. package/dist/client/logto-login-session.js.map +1 -0
  17. package/dist/client/m2m-client.d.ts +37 -0
  18. package/dist/client/m2m-client.js +196 -0
  19. package/dist/client/m2m-client.js.map +1 -0
  20. package/dist/client/oauth-client.d.ts +25 -0
  21. package/dist/client/oauth-client.js +129 -0
  22. package/dist/client/oauth-client.js.map +1 -0
  23. package/dist/client/types.d.ts +45 -0
  24. package/dist/client/types.js +37 -0
  25. package/dist/client/types.js.map +1 -0
  26. package/dist/errors.d.ts +24 -0
  27. package/dist/errors.js +62 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/index.d.ts +4 -0
  30. package/dist/index.js +41 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/module.d.ts +27 -0
  33. package/dist/module.js +171 -0
  34. package/dist/module.js.map +1 -0
  35. package/dist/stateless/decorator.d.ts +7 -0
  36. package/dist/stateless/decorator.js +10 -0
  37. package/dist/stateless/decorator.js.map +1 -0
  38. package/dist/stateless/guard.d.ts +10 -0
  39. package/dist/stateless/guard.js +69 -0
  40. package/dist/stateless/guard.js.map +1 -0
  41. package/dist/stateless/guard.spec.d.ts +1 -0
  42. package/dist/stateless/guard.spec.js +210 -0
  43. package/dist/stateless/guard.spec.js.map +1 -0
  44. package/dist/stateless/index.d.ts +2 -0
  45. package/dist/stateless/index.js +19 -0
  46. package/dist/stateless/index.js.map +1 -0
  47. package/dist/token/access-token.d.ts +31 -0
  48. package/dist/token/access-token.js +19 -0
  49. package/dist/token/access-token.js.map +1 -0
  50. package/dist/token/index.d.ts +2 -0
  51. package/dist/token/index.js +19 -0
  52. package/dist/token/index.js.map +1 -0
  53. package/dist/token/verifier.d.ts +13 -0
  54. package/dist/token/verifier.js +56 -0
  55. package/dist/token/verifier.js.map +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/module.ts +61 -61
  58. package/package.json +2 -2
  59. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  60. package/.idea/inspectionProfiles/Project_Default.xml +0 -7
  61. package/.idea/misc.xml +0 -7
  62. package/.idea/modules.xml +0 -8
  63. package/.idea/point3-logto-module.iml +0 -9
  64. package/.idea/vcs.xml +0 -6
  65. package/.serena/project.yml +0 -87
@@ -0,0 +1,69 @@
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(tokenVerifier) {
24
+ this.tokenVerifier = tokenVerifier;
25
+ this.reflector = new core_1.Reflector();
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(0, (0, common_1.Inject)(token_1.LogtoTokenVerifierToken)),
67
+ __metadata("design:paramtypes", [token_1.LogtoTokenVerifier])
68
+ ], LogtoTokenGuard);
69
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
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;IAE1B,YAKE,aAAyC;QAAjC,kBAAa,GAAb,aAAa,CAAoB;QANnC,cAAS,GAAc,IAAI,gBAAS,EAAE,CAAC;IAO3C,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;AAzDY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,+BAAuB,CAAC,CAAA;qCACT,0BAAkB;GAPhC,eAAe,CAyD3B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,210 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.spec.js","sourceRoot":"","sources":["../../stateless/guard.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./guard";
2
+ export * from "./decorator";
@@ -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("./guard"), exports);
18
+ __exportStar(require("./decorator"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../stateless/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B"}
@@ -0,0 +1,31 @@
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
+ };
@@ -0,0 +1,19 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export * from "./access-token";
2
+ export * from "./verifier";
@@ -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("./access-token"), exports);
18
+ __exportStar(require("./verifier"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../token/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,6CAA2B"}
@@ -0,0 +1,13 @@
1
+ import { LogtoVerifierConfig } from "../client/config";
2
+ import * as token from "./access-token";
3
+ export declare const LogtoTokenVerifierToken: unique symbol;
4
+ export declare class LogtoTokenVerifier {
5
+ private readonly config;
6
+ constructor(config: LogtoVerifierConfig);
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
+ }
@@ -0,0 +1,56 @@
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.LogtoTokenVerifier = exports.LogtoTokenVerifierToken = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const jose_1 = require("jose");
15
+ exports.LogtoTokenVerifierToken = Symbol.for("LogtoTokenVerifier");
16
+ let LogtoTokenVerifier = class LogtoTokenVerifier {
17
+ constructor(config) {
18
+ this.config = config;
19
+ }
20
+ async verifyToken(token, requiredScopes, requiredRoles) {
21
+ if (!token)
22
+ throw new common_1.UnauthorizedException('엑세스 토큰이 존재하지 않습니다.');
23
+ const { payload } = await (0, jose_1.jwtVerify)(token, (0, jose_1.createRemoteJWKSet)(new URL(this.config.jwksUri)), { issuer: this.config.issuer });
24
+ const tokenPayload = payload;
25
+ if (requiredScopes || requiredRoles) {
26
+ this.shouldContainRequiredPrivileges(tokenPayload, requiredScopes, requiredRoles);
27
+ }
28
+ return tokenPayload;
29
+ }
30
+ async verifyIdToken(token) {
31
+ const { payload } = await (0, jose_1.jwtVerify)(token, (0, jose_1.createRemoteJWKSet)(new URL(this.config.jwksUri)), { issuer: this.config.issuer });
32
+ return payload;
33
+ }
34
+ shouldContainRequiredPrivileges(payload, requiredScopes, requiredRoles) {
35
+ const { userScopes, userRoles } = payload;
36
+ const scopes = userScopes?.flat() ?? [];
37
+ if (this.hasInsufficientScopes(requiredScopes, scopes)) {
38
+ throw new common_1.UnauthorizedException({ code: 'auth.insufficient_scope', status: 403 }, { cause: requiredScopes });
39
+ }
40
+ if (this.hasInsufficientRoles(requiredRoles, userRoles)) {
41
+ throw new common_1.UnauthorizedException({ code: 'auth.role_mismatch', status: 403 }, { cause: requiredRoles });
42
+ }
43
+ }
44
+ hasInsufficientScopes(requiredScopes, userScopes) {
45
+ return !!(requiredScopes && requiredScopes.length > 0 && !requiredScopes.every(scope => userScopes.includes(scope)));
46
+ }
47
+ hasInsufficientRoles(requiredRoles, userRoles) {
48
+ return !!(requiredRoles && requiredRoles.length > 0 && !requiredRoles.some(role => userRoles.includes(role)));
49
+ }
50
+ };
51
+ exports.LogtoTokenVerifier = LogtoTokenVerifier;
52
+ exports.LogtoTokenVerifier = LogtoTokenVerifier = __decorate([
53
+ (0, common_1.Injectable)(),
54
+ __metadata("design:paramtypes", [Object])
55
+ ], LogtoTokenVerifier);
56
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../token/verifier.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmE;AACnE,+BAAqD;AAKxC,QAAA,uBAAuB,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAGjE,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC3B,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAI,CAAC;IAYtD,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,cAAyB,EAAE,aAAwB;QACvF,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,8BAAqB,CAAC,oBAAoB,CAAC,CAAC;QAElE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,gBAAS,EAC/B,KAAK,EAAE,IAAA,yBAAkB,EAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EACvD,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CACjC,CAAC;QAEF,MAAM,YAAY,GAAG,OAAmC,CAAC;QAEzD,IAAI,cAAc,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,CAAC,+BAA+B,CAChC,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAOM,KAAK,CAAC,aAAa,CAAC,KAAa;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,gBAAS,EAC/B,KAAK,EACL,IAAA,yBAAkB,EAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAChD,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CACjC,CAAC;QACF,OAAO,OAA+B,CAAC;IAC3C,CAAC;IAQO,+BAA+B,CACnC,OAAiC,EACjC,cAAyB,EACzB,aAAwB;QAExB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC1C,MAAM,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAExC,IAAI,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,8BAAqB,CAC3B,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,GAAG,EAAE,EAChD,EAAE,KAAK,EAAE,cAAc,EAAE,CAC5B,CAAC;QACN,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,8BAAqB,CAC3B,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,GAAG,EAAE,EAC3C,EAAE,KAAK,EAAE,aAAa,EAAE,CAC3B,CAAC;QACN,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,cAAoC,EAAE,UAAoB;QACpF,OAAO,CAAC,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzH,CAAC;IAEO,oBAAoB,CAAC,aAAmC,EAAE,SAAmB;QACjF,OAAO,CAAC,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClH,CAAC;CACJ,CAAA;AAjFY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;;GACA,kBAAkB,CAiF9B"}