@point3/logto-module 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,8 +10,25 @@ NestJS 기반 Logto 인증/권한 통합 모듈
10
10
  `@point3-logto-module`은 [Logto](https://logto.io/) 인증 시스템을 NestJS 환경에서 손쉽게 통합할 수 있도록 설계된 모듈 번들입니다.
11
11
  OAuth, M2M(Machine-to-Machine), 사용자/역할 관리, 토큰 검증, 인증 가드 등 인증/권한 관련 기능을 일관된 DI 패턴으로 제공합니다.
12
12
 
13
+ ### 동작 모드
14
+
15
+ `LOGTO_CLIENT` 환경변수 값에 따라 두 가지 모드로 동작합니다:
16
+
17
+ - **Stateless 모드 (`LOGTO_CLIENT=false` 또는 미설정)**:
18
+ - API 서버와 같이 토큰 검증만 필요한 경우 사용
19
+ - `@LogtoProtected()` 가드와 `LogtoTokenVerifier`만 활성화
20
+ - 필수 환경변수: `LOGTO_JWKS_URI`, `LOGTO_AUTH_ISSUER`만 필요
21
+
22
+ - **Stateful 모드 (`LOGTO_CLIENT=true`)**:
23
+ - 로그인/로그아웃 처리가 필요한 웹 애플리케이션이나 M2M 통신이 필요한 경우 사용
24
+ - `OAuthClient`, `LogtoM2MClient` 등 모든 클라이언트 기능 활성화
25
+ - 추가 환경변수 필요 (OAuth, M2M 관련)
26
+
27
+ ### 주요 특징
28
+
13
29
  - **유연한 로깅 연동**: 외부 로거 모듈/토큰을 DI로 주입받아, 다양한 로깅 시스템과 쉽게 통합
14
30
  - **NestJS Dynamic Module 패턴**: 환경/구성에 따라 동적으로 모듈 생성
31
+ - **Global 모듈 지원**: 애플리케이션 전체에서 사용할 수 있는 글로벌 모듈로 설정 가능
15
32
  - **실제 서비스에서 검증된 인증/권한 관리 기능**: OAuth, M2M, 사용자/역할 관리, 토큰 검증, 인증 가드 등
16
33
 
17
34
  ---
@@ -21,7 +38,8 @@ OAuth, M2M(Machine-to-Machine), 사용자/역할 관리, 토큰 검증, 인증
21
38
  ### 1. LogtoModule (Dynamic Module)
22
39
 
23
40
  - 외부에서 로거 모듈과 토큰을 주입받아, Logto 인증/권한 기능을 번들로 제공
24
- - `logto.module.LogtoModule.forLogger(loggerModule, loggerToken)` 패턴으로 사용
41
+ - `logto.module.LogtoModule.forLogger(loggerModule, loggerToken, global?)` 패턴으로 사용
42
+ - global 파라미터를 true로 설정하면 애플리케이션 전체에서 사용 가능한 글로벌 모듈로 등록
25
43
 
26
44
  ### 2. 핵심 서비스/토큰
27
45
 
@@ -76,12 +94,17 @@ export class MyLoggerModule {}
76
94
 
77
95
  ```ts
78
96
  import { Module } from '@nestjs/common';
97
+ import { ConfigModule } from '@nestjs/config';
79
98
  import * as logto from '@point3/logto-module';
80
99
  import { MyLoggerModule, MY_LOGGER_TOKEN } from './my-logger.module';
81
100
 
82
101
  @Module({
83
102
  imports: [
84
- logto.module.LogtoModule.forLogger(MyLoggerModule, MY_LOGGER_TOKEN),
103
+ // 환경변수를 먼저 로드
104
+ ConfigModule.forRoot({ isGlobal: true }),
105
+
106
+ // LogtoModule을 글로벌 모듈로 설정 (세 번째 파라미터를 true로 설정)
107
+ logto.module.LogtoModule.forLogger(MyLoggerModule, MY_LOGGER_TOKEN, true),
85
108
  ],
86
109
  })
87
110
  export class AppModule {}
@@ -125,96 +148,155 @@ export class AuthService {
125
148
 
126
149
  ### 4. stateless 네임스페이스 활용 예시
127
150
 
128
- #### 4-1. Express/Fastify 미들웨어로 토큰 인증
151
+ > ⚠️ **중요한 주의사항**
152
+ > `requiredScopes`와 `requiredRoles`에 사용되는 모든 스코프와 역할은 **반드시 Logto 관리 콘솔에서 먼저 정의되어야 합니다**.
153
+ >
154
+ > - **스코프(Scopes)**: Logto 콘솔의 API Resources → 해당 리소스 → Scopes에서 정의
155
+ > - **역할(Roles)**: Logto 콘솔의 User Management → Roles에서 정의
156
+ > - **역할-스코프 연결**: 각 역할에 필요한 스코프들을 Logto 콘솔에서 할당
157
+ >
158
+ > 코드에서 사용하는 스코프/역할 이름이 Logto에 정의되지 않았다면 토큰 검증이 실패합니다.
159
+
160
+ #### 4-1. LogtoProtected 데코레이터를 사용한 라우트 보호
129
161
 
130
162
  ```ts
131
- // main.ts
163
+ // user.controller.ts
164
+ import { Controller, Get } from '@nestjs/common';
132
165
  import { stateless } from '@point3/logto-module';
133
- import { NestFactory } from '@nestjs/core';
134
- import { AppModule } from './app.module';
135
166
 
136
- async function bootstrap() {
137
- const app = await NestFactory.create(AppModule);
138
- // JWT Bearer 토큰 인증 미들웨어 (stateless)
139
- app.use(stateless.createTokenAuthMiddleware({
140
- requiredScopes: ['admin'],
141
- requiredRoles: ['superuser'],
142
- }));
143
- await app.listen(3000);
144
- }
145
- bootstrap();
146
- ```
167
+ @Controller('users')
168
+ export class UserController {
169
+ // 기본 토큰 인증만 필요한 경우
170
+ @Get('profile')
171
+ @stateless.LogtoProtected()
172
+ getProfile() {
173
+ return { message: '인증된 사용자만 접근 가능' };
174
+ }
147
175
 
148
- #### 4-2. 커스텀 가드/핸들러에서 stateless 유틸리티 활용
176
+ // 특정 스코프가 필요한 경우
177
+ @Get('admin')
178
+ @stateless.LogtoProtected({
179
+ requiredScopes: ['admin', 'user:read']
180
+ })
181
+ getAdminData() {
182
+ return { message: '관리자 스코프가 필요한 데이터' };
183
+ }
149
184
 
150
- ```ts
151
- // custom.guard.ts
152
- import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
153
- import { stateless } from '@point3/logto-module';
185
+ // 특정 역할이 필요한 경우
186
+ @Get('management')
187
+ @stateless.LogtoProtected({
188
+ requiredRoles: ['superuser', 'management-point3']
189
+ })
190
+ getManagementData() {
191
+ return { message: '관리자 역할이 필요한 데이터' };
192
+ }
154
193
 
155
- @Injectable()
156
- export class MyStatelessGuard implements CanActivate {
157
- async canActivate(context: ExecutionContext): Promise<boolean> {
158
- const req = context.switchToHttp().getRequest();
159
- // stateless 토큰 검증 및 권한 체크
160
- const payload = await stateless.verifyRequestToken(req, {
161
- requiredScopes: ['user'],
162
- });
163
- // payload에 따라 추가 로직 가능
164
- return !!payload;
194
+ // 스코프와 역할을 모두 요구하는 경우
195
+ @Get('secure')
196
+ @stateless.LogtoProtected({
197
+ requiredScopes: ['admin'],
198
+ requiredRoles: ['superuser']
199
+ })
200
+ getSecureData() {
201
+ return { message: '고급 권한이 필요한 데이터' };
165
202
  }
166
203
  }
167
204
  ```
168
205
 
169
- #### 4-3. 커스텀 데코레이터로 유저 정보 추출
206
+ #### 4-2. 커스텀 데코레이터로 유저 정보 추출
170
207
 
171
208
  ```ts
172
209
  // user.decorator.ts
173
210
  import { createParamDecorator, ExecutionContext } from '@nestjs/common';
174
- import { stateless } from '@point3/logto-module';
175
211
 
176
212
  export const CurrentUser = createParamDecorator(
177
- async (data, ctx: ExecutionContext) => {
178
- const req = ctx.switchToHttp().getRequest();
179
- const payload = await stateless.verifyRequestToken(req);
180
- return payload;
213
+ (data: unknown, ctx: ExecutionContext) => {
214
+ const request = ctx.switchToHttp().getRequest();
215
+ // LogtoTokenGuard가 request.user에 설정한 사용자 정보 반환
216
+ return request.user;
181
217
  },
182
218
  );
183
219
 
184
220
  // 컨트롤러에서 사용
185
- @Get('me')
186
- getMe(@CurrentUser() user) {
187
- return user;
221
+ @Controller('me')
222
+ export class MeController {
223
+ @Get()
224
+ @stateless.LogtoProtected()
225
+ getMe(@CurrentUser() user: any) {
226
+ return {
227
+ userId: user.userId,
228
+ managerId: user.managerId,
229
+ clientId: user.clientId
230
+ };
231
+ }
188
232
  }
189
233
  ```
190
234
 
191
- #### 4-4. NestJS Provider로 stateless 가드 등록
235
+ #### 4-3. 전역 가드로 LogtoTokenGuard 등록
192
236
 
193
237
  ```ts
194
238
  // app.module.ts
195
239
  import { Module } from '@nestjs/common';
240
+ import { APP_GUARD } from '@nestjs/core';
196
241
  import { stateless } from '@point3/logto-module';
197
242
 
198
243
  @Module({
199
244
  providers: [
200
245
  {
201
- provide: 'STATLESS_GUARD',
202
- useClass: stateless.StatelessTokenGuard,
246
+ provide: APP_GUARD,
247
+ useClass: stateless.LogtoTokenGuard,
203
248
  },
204
249
  ],
205
250
  })
206
251
  export class AppModule {}
207
252
  ```
208
253
 
209
- #### 4-5. 직접 토큰 검증/유저 정보 추출 (서비스/핸들러 등)
254
+ #### 4-4. 커스텀 가드에서 LogtoTokenGuard 확장
210
255
 
211
256
  ```ts
257
+ // custom.guard.ts
258
+ import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
212
259
  import { stateless } from '@point3/logto-module';
213
260
 
214
- async function handleRequest(req) {
215
- const payload = await stateless.verifyRequestToken(req);
216
- if (!payload) throw new Error('인증 실패');
217
- // payload.sub, payload.userRoles 활용
261
+ @Injectable()
262
+ export class CustomLogtoGuard extends stateless.LogtoTokenGuard {
263
+ async canActivate(context: ExecutionContext): Promise<boolean> {
264
+ // 기본 토큰 검증 수행
265
+ const isValid = await super.canActivate(context);
266
+
267
+ if (!isValid) return false;
268
+
269
+ // 추가 커스텀 로직
270
+ const request = context.switchToHttp().getRequest();
271
+ const user = request.user;
272
+
273
+ // 예: 특정 시간대에만 접근 허용
274
+ const currentHour = new Date().getHours();
275
+ if (currentHour < 9 || currentHour > 18) {
276
+ return false;
277
+ }
278
+
279
+ return true;
280
+ }
281
+ }
282
+ ```
283
+
284
+ #### 4-5. 타입 안전성을 위한 역할 타입 정의
285
+
286
+ ```ts
287
+ // types/roles.ts
288
+ export type UserRole = 'admin' | 'user' | 'moderator';
289
+
290
+ // 컨트롤러에서 타입 안전하게 사용
291
+ @Controller('typed')
292
+ export class TypedController {
293
+ @Get('admin-only')
294
+ @stateless.LogtoProtected<UserRole>({
295
+ requiredRoles: ['admin'] // 타입 체크됨
296
+ })
297
+ getAdminData() {
298
+ return { message: '타입 안전한 역할 기반 접근 제어' };
299
+ }
218
300
  }
219
301
  ```
220
302
 
@@ -275,25 +357,35 @@ const config: LogtoConfig = {
275
357
 
276
358
  ## 🗂️ 환경변수 목록 및 설명
277
359
 
360
+ ### 필수 환경변수 (Stateless/Stateful 모드 공통)
361
+
278
362
  | 환경변수명 | 설명 | 예시 값 |
279
363
  |-----------------------------------|---------------------------------------------------|------------------------------------------|
280
- | LOGTO_AUTH_ENDPOINT | Logto 인증 서버 OIDC 엔드포인트 | https://auth.example.com/oidc |
281
- | LOGTO_CLIENT_ID | OAuth 클라이언트 ID | my-client-id |
282
- | LOGTO_CLIENT_SECRET | OAuth 클라이언트 시크릿 | my-client-secret |
283
- | LOGTO_RESOURCES | 접근할 리소스 서버(여러 개일 경우 쉼표로 구분) | https://api.example.com |
284
- | LOGTO_SCOPES | 요청할 OAuth 스코프(쉼표로 구분) | openid,profile,email |
285
- | LOGTO_PROMPT | OAuth prompt 파라미터 | login |
286
- | LOGTO_REDIRECT_URI | 인증 후 리다이렉트될 URI | https://myapp.com/callback |
287
- | LOGTO_SIGN_IN_URI | 기본 로그인 URI | https://auth.example.com |
288
- | LOGTO_DASHBOARD_SIGN_IN_URI | 대시보드 로그인 URI(선택) | https://dashboard.example.com |
289
- | LOGTO_M2M_CLIENT_ID | M2M 인증용 클라이언트 ID | my-m2m-client-id |
290
- | LOGTO_M2M_CLIENT_SECRET | M2M 인증용 클라이언트 시크릿 | my-m2m-client-secret |
291
- | LOGTO_M2M_RESOURCE | M2M 인증용 리소스 | https://api.example.com |
292
- | LOGTO_M2M_API_URL | M2M API 서버의 base URL | https://api.example.com/api |
293
364
  | LOGTO_JWKS_URI | JWT 검증용 JWKS 엔드포인트 | https://auth.example.com/oidc/jwks |
294
365
  | LOGTO_AUTH_ISSUER | JWT 발급자(iss) | https://auth.example.com/oidc |
295
366
 
296
- > ⚠️ 실제로 필요한 환경변수는 사용하는 서비스(OAuth, M2M, 세션 등)에 따라 다를 수 있습니다. 위 표를 참고하여 .env 파일 또는 환경설정에 추가하세요.
367
+ ### 선택적 환경변수
368
+
369
+ | 환경변수명 | 설명 | 예시 값 | 필요 조건 |
370
+ |-----------------------------------|---------------------------------------------------|------------------------------------------|-----------------------------------------|
371
+ | LOGTO_CLIENT | Stateful 모드 활성화 (클라이언트 기능 사용) | true | 클라이언트 기능 사용 시 |
372
+ | LOGTO_AUTH_ENDPOINT | Logto 인증 서버 OIDC 엔드포인트 | https://auth.example.com/oidc | LOGTO_CLIENT=true |
373
+ | LOGTO_CLIENT_ID | OAuth 클라이언트 ID | my-client-id | LOGTO_CLIENT=true |
374
+ | LOGTO_CLIENT_SECRET | OAuth 클라이언트 시크릿 | my-client-secret | LOGTO_CLIENT=true |
375
+ | LOGTO_RESOURCES | 접근할 리소스 서버(여러 개일 경우 쉼표로 구분) | https://api.example.com | LOGTO_CLIENT=true |
376
+ | LOGTO_SCOPES | 요청할 OAuth 스코프(쉼표로 구분) | openid,profile,email | LOGTO_CLIENT=true |
377
+ | LOGTO_PROMPT | OAuth prompt 파라미터 | login | LOGTO_CLIENT=true |
378
+ | LOGTO_REDIRECT_URI | 인증 후 리다이렉트될 URI | https://myapp.com/callback | LOGTO_CLIENT=true |
379
+ | LOGTO_SIGN_IN_URI | 기본 로그인 URI | https://auth.example.com | LOGTO_CLIENT=true |
380
+ | LOGTO_DASHBOARD_SIGN_IN_URI | 대시보드 로그인 URI(선택) | https://dashboard.example.com | LOGTO_CLIENT=true |
381
+ | LOGTO_M2M_CLIENT_ID | M2M 인증용 클라이언트 ID | my-m2m-client-id | LOGTO_CLIENT=true & M2M 기능 사용 시 |
382
+ | LOGTO_M2M_CLIENT_SECRET | M2M 인증용 클라이언트 시크릿 | my-m2m-client-secret | LOGTO_CLIENT=true & M2M 기능 사용 시 |
383
+ | LOGTO_M2M_RESOURCE | M2M 인증용 리소스 | https://api.example.com | LOGTO_CLIENT=true & M2M 기능 사용 시 |
384
+ | LOGTO_M2M_API_URL | M2M API 서버의 base URL | https://api.example.com/api | LOGTO_CLIENT=true & M2M 기능 사용 시 |
385
+
386
+ > ⚠️ **중요**:
387
+ > - Stateless 모드(기본값): `LOGTO_JWKS_URI`와 `LOGTO_AUTH_ISSUER`만 설정하면 토큰 검증 기능을 사용할 수 있습니다.
388
+ > - Stateful 모드: `LOGTO_CLIENT=true`로 설정하고 OAuth/M2M 관련 환경변수를 추가로 설정해야 합니다.
297
389
 
298
390
  ---
299
391
 
@@ -316,6 +408,16 @@ const config: LogtoConfig = {
316
408
  - **Q. 인증/권한 외에 사용자/역할 관리도 가능한가요?**
317
409
  → 네, `LogtoM2MClient`를 통해 사용자/역할 생성, 조회, 수정, 삭제, 할당 등 모든 관리가 가능합니다.
318
410
 
411
+ - **Q. Stateless 모드와 Stateful 모드의 차이는 무엇인가요?**
412
+ → Stateless 모드는 토큰 검증만 필요한 API 서버에 적합하며, 최소한의 환경변수(`LOGTO_JWKS_URI`, `LOGTO_AUTH_ISSUER`)만 필요합니다.
413
+ → Stateful 모드는 `LOGTO_CLIENT=true`로 설정하여 로그인/로그아웃, M2M 통신 등 클라이언트 기능을 모두 사용할 수 있습니다.
414
+
415
+ - **Q. global 파라미터는 언제 사용하나요?**
416
+ → `forLogger`의 세 번째 파라미터를 `true`로 설정하면 LogtoModule이 글로벌 모듈로 등록되어, 다른 모듈에서 별도의 import 없이 Logto 서비스들을 사용할 수 있습니다.
417
+
418
+ - **Q. 토큰 검증만 필요한데 모든 환경변수를 설정해야 하나요?**
419
+ → 아니요. 토큰 검증만 필요하다면 `LOGTO_JWKS_URI`와 `LOGTO_AUTH_ISSUER`만 설정하면 됩니다. `LOGTO_CLIENT`를 설정하지 않거나 `false`로 설정하면 자동으로 Stateless 모드가 활성화됩니다.
420
+
319
421
  ---
320
422
 
321
423
  ## 🏷️ 내보내는 토큰/서비스
package/dist/module.js CHANGED
@@ -1,45 +1,67 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LogtoModule = void 0;
4
- const stateless_1 = require("./stateless");
5
- const token_1 = require("./token");
4
+ const config_1 = require("@nestjs/config");
6
5
  const client_1 = require("./client");
6
+ const token_1 = require("./token");
7
+ const stateless_1 = require("./stateless");
7
8
  class LogtoModule {
8
9
  static forLogger(loggerModule, loggerToken, global = false) {
9
- return {
10
- module: LogtoModule,
11
- global: global,
12
- imports: [loggerModule],
13
- providers: [
14
- {
15
- provide: client_1.LogtoLoggerServiceToken,
16
- useExisting: loggerToken
17
- },
18
- {
19
- provide: token_1.LogtoTokenVerifierToken,
20
- useClass: token_1.LogtoTokenVerifier,
21
- },
22
- {
23
- provide: client_1.OAuthClientToken,
24
- useClass: client_1.OAuthClient,
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;
25
32
  },
26
- {
27
- provide: client_1.LogtoLoginSessionToken,
28
- useClass: client_1.LogtoLoginSession
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;
29
42
  },
30
- {
31
- provide: client_1.LogtoM2MClientToken,
32
- useClass: client_1.LogtoM2MClient
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;
33
52
  },
34
- stateless_1.LogtoTokenGuard
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,
35
62
  ],
36
- exports: [
37
- client_1.OAuthClientToken,
38
- client_1.LogtoM2MClientToken,
39
- token_1.LogtoTokenVerifierToken,
40
- client_1.LogtoLoginSessionToken,
41
- stateless_1.LogtoTokenGuard,
42
- ]
63
+ providers: providers,
64
+ exports: providers,
43
65
  };
44
66
  }
45
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../module.ts"],"names":[],"mappings":";;;AACA,2CAA8C;AAC9C,mCAAsE;AACtE,qCAKkB;AAqBlB,MAAa,WAAW;IAiBpB,MAAM,CAAC,SAAS,CACZ,YAAuB,EACvB,WAA4B,EAC5B,SAAkB,KAAK;QAEvB,OAAO;YACH,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,CAAC,YAAY,CAAC;YACvB,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,gCAAuB;oBAChC,WAAW,EAAE,WAAW;iBAC3B;gBACD;oBACI,OAAO,EAAE,+BAAuB;oBAChC,QAAQ,EAAE,0BAAkB;iBAC/B;gBACD;oBACI,OAAO,EAAE,yBAAgB;oBACzB,QAAQ,EAAE,oBAAW;iBACxB;gBACD;oBACI,OAAO,EAAE,+BAAsB;oBAC/B,QAAQ,EAAE,0BAAiB;iBAC9B;gBACD;oBACI,OAAO,EAAE,4BAAmB;oBAC5B,QAAQ,EAAE,uBAAc;iBAC3B;gBACD,2BAAe;aAClB;YACD,OAAO,EAAE;gBACL,yBAAgB;gBAChB,4BAAmB;gBACnB,+BAAuB;gBACvB,+BAAsB;gBACtB,2BAAe;aAClB;SACJ,CAAA;IACL,CAAC;CACJ;AA1DD,kCA0DC;AAAA,CAAC"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../module.ts"],"names":[],"mappings":";;;AACA,2CAA6D;AAC7D,qCAQkB;AAClB,mCAAsE;AACtE,2CAAoE;AAmBpE,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,10 +1,11 @@
1
1
  import { CanActivate, ExecutionContext } from '@nestjs/common';
2
2
  import { Reflector } from '@nestjs/core';
3
- import * as token from '../token';
3
+ import { LogtoTokenVerifier } from '../token';
4
+ export declare const LogtoTokenGuardToken: unique symbol;
4
5
  export declare class LogtoTokenGuard implements CanActivate {
5
6
  private reflector;
6
7
  private tokenVerifier;
7
- constructor(reflector: Reflector, tokenVerifier: token.LogtoTokenVerifier);
8
+ constructor(reflector: Reflector, tokenVerifier: LogtoTokenVerifier);
8
9
  canActivate(context: ExecutionContext): Promise<boolean>;
9
10
  private extractBearerTokenFrom;
10
11
  }
@@ -1,43 +1,10 @@
1
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
2
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
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;
22
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
23
7
  };
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
8
  var __metadata = (this && this.__metadata) || function (k, v) {
42
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
10
  };
@@ -45,12 +12,13 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
12
  return function (target, key) { decorator(target, key, paramIndex); }
46
13
  };
47
14
  Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.LogtoTokenGuard = void 0;
15
+ exports.LogtoTokenGuard = exports.LogtoTokenGuardToken = void 0;
49
16
  const common_1 = require("@nestjs/common");
50
17
  const core_1 = require("@nestjs/core");
51
18
  const jose_1 = require("jose");
52
19
  const point3_common_tool_1 = require("point3-common-tool");
53
- const token = __importStar(require("../token"));
20
+ const token_1 = require("../token");
21
+ exports.LogtoTokenGuardToken = Symbol('LogtoTokenGuard');
54
22
  let LogtoTokenGuard = class LogtoTokenGuard {
55
23
  constructor(reflector, tokenVerifier) {
56
24
  this.reflector = reflector;
@@ -94,9 +62,9 @@ let LogtoTokenGuard = class LogtoTokenGuard {
94
62
  };
95
63
  exports.LogtoTokenGuard = LogtoTokenGuard;
96
64
  exports.LogtoTokenGuard = LogtoTokenGuard = __decorate([
97
- (0, common_1.Global)(),
98
65
  (0, common_1.Injectable)(),
99
- __param(1, (0, common_1.Inject)(token.LogtoTokenVerifierToken)),
100
- __metadata("design:paramtypes", [core_1.Reflector, token.LogtoTokenVerifier])
66
+ __param(1, (0, common_1.Inject)(token_1.LogtoTokenVerifierToken)),
67
+ __metadata("design:paramtypes", [core_1.Reflector,
68
+ token_1.LogtoTokenVerifier])
101
69
  ], LogtoTokenGuard);
102
70
  //# sourceMappingURL=guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../stateless/guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CASwB;AACxB,uCAAyC;AAGzC,+BAA8B;AAE9B,2DAA8C;AAC9C,gDAAkC;AAI3B,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YACU,SAAoB,EAGpB,aAAuC;QAHvC,cAAS,GAAT,SAAS,CAAW;QAGpB,kBAAa,GAAb,aAAa,CAA0B;IAC7C,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,6BAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC/C,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;IAF3B,IAAA,eAAM,GAAE;IACR,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;qCAFnB,gBAAS,EAGL,KAAK,CAAC,kBAAkB;GALtC,eAAe,CAuD3B"}
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,6BAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC/C,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"}
@@ -58,7 +58,6 @@ let LogtoTokenVerifier = class LogtoTokenVerifier {
58
58
  };
59
59
  exports.LogtoTokenVerifier = LogtoTokenVerifier;
60
60
  exports.LogtoTokenVerifier = LogtoTokenVerifier = __decorate([
61
- (0, common_1.Global)(),
62
61
  (0, common_1.Injectable)(),
63
62
  __param(0, (0, common_1.Inject)(config_1.ConfigService)),
64
63
  __metadata("design:paramtypes", [config_1.ConfigService])
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../token/verifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../token/verifier.ts"],"names":[],"mappings":"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"}