@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 +165 -63
- package/dist/module.js +54 -32
- package/dist/module.js.map +1 -1
- package/dist/stateless/guard.d.ts +3 -2
- package/dist/stateless/guard.js +6 -38
- package/dist/stateless/guard.js.map +1 -1
- package/dist/token/verifier.js +0 -1
- package/dist/token/verifier.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/module.ts +120 -63
- package/package.json +3 -2
- package/stateless/guard.ts +5 -5
- package/token/verifier.ts +1 -2
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
176
|
+
// 특정 스코프가 필요한 경우
|
|
177
|
+
@Get('admin')
|
|
178
|
+
@stateless.LogtoProtected({
|
|
179
|
+
requiredScopes: ['admin', 'user:read']
|
|
180
|
+
})
|
|
181
|
+
getAdminData() {
|
|
182
|
+
return { message: '관리자 스코프가 필요한 데이터' };
|
|
183
|
+
}
|
|
149
184
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
185
|
+
// 특정 역할이 필요한 경우
|
|
186
|
+
@Get('management')
|
|
187
|
+
@stateless.LogtoProtected({
|
|
188
|
+
requiredRoles: ['superuser', 'management-point3']
|
|
189
|
+
})
|
|
190
|
+
getManagementData() {
|
|
191
|
+
return { message: '관리자 역할이 필요한 데이터' };
|
|
192
|
+
}
|
|
154
193
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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-
|
|
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
|
-
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
return
|
|
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
|
-
@
|
|
186
|
-
|
|
187
|
-
|
|
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-
|
|
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:
|
|
202
|
-
useClass: stateless.
|
|
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-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
}
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../module.ts"],"names":[],"mappings":";;;AACA,
|
|
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
|
|
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:
|
|
8
|
+
constructor(reflector: Reflector, tokenVerifier: LogtoTokenVerifier);
|
|
8
9
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
9
10
|
private extractBearerTokenFrom;
|
|
10
11
|
}
|
package/dist/stateless/guard.js
CHANGED
|
@@ -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
|
|
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)(
|
|
100
|
-
__metadata("design:paramtypes", [core_1.Reflector,
|
|
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":"
|
|
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"}
|
package/dist/token/verifier.js
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../token/verifier.ts"],"names":[],"mappings":"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"}
|