@point3/logto-module 1.0.12 → 1.0.14
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 +59 -16
- 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 +118 -63
- package/package.json +3 -2
- package/stateless/guard.ts +5 -5
- package/token/verifier.ts +1 -2
package/module.ts
CHANGED
|
@@ -1,88 +1,143 @@
|
|
|
1
|
-
import { DynamicModule, Type } from '@nestjs/common';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { DynamicModule, Module, Provider, Type } from '@nestjs/common';
|
|
2
|
+
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
3
|
+
import {
|
|
4
|
+
LogtoLoggerServiceToken,
|
|
5
|
+
LogtoLoginSessionToken,
|
|
6
|
+
LogtoM2MClientToken,
|
|
7
|
+
OAuthClient,
|
|
8
|
+
OAuthClientToken,
|
|
9
|
+
LogtoLoginSession,
|
|
10
|
+
LogtoM2MClient,
|
|
9
11
|
} from './client';
|
|
12
|
+
import { LogtoTokenVerifier, LogtoTokenVerifierToken } from './token';
|
|
13
|
+
import { LogtoTokenGuard, LogtoTokenGuardToken } from './stateless';
|
|
10
14
|
|
|
11
15
|
/**
|
|
12
16
|
* LogtoModule
|
|
13
17
|
*
|
|
14
|
-
* Logto 인증 및
|
|
15
|
-
*
|
|
18
|
+
* Logto 인증 및 토큰 검증, 클라이언트 기능을 NestJS 모듈로 제공합니다.
|
|
19
|
+
*
|
|
20
|
+
* 이 모듈은 `LOGTO_CLIENT` 환경 변수 값에 따라 동적으로 구성됩니다.
|
|
21
|
+
* - **Stateless 모드 (`LOGTO_CLIENT=false` 또는 미설정)**:
|
|
22
|
+
* API 서버와 같이 토큰 검증만 필요한 경우 사용합니다. `@LogtoProtected()` 가드와 `LogtoTokenVerifier`만 활성화되어 최소한의 리소스를 사용합니다.
|
|
16
23
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* import { MyLoggerModule, MY_LOGGER_TOKEN } from './my-logger';
|
|
24
|
+
* - **Stateful 모드 (`LOGTO_CLIENT=true`)**:
|
|
25
|
+
* 로그인/로그아웃 처리가 필요한 웹 애플리케이션이나, M2M 통신으로 Logto의 User/Role 관리 API를 사용해야 할 경우에 사용합니다.
|
|
26
|
+
* `OAuthClient`, `LogtoM2MClient` 등 모든 클라이언트 기능이 추가로 활성화됩니다.
|
|
21
27
|
*
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* LogtoModule.forLogger(MyLoggerModule, MY_LOGGER_TOKEN)
|
|
25
|
-
* ]
|
|
26
|
-
* })
|
|
27
|
-
* export class AppModule {}
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
28
|
+
*외부 로거 모듈과 연동하여 일관된 로깅을 지원합니다.
|
|
29
|
+
**/
|
|
30
30
|
export class LogtoModule {
|
|
31
|
+
|
|
31
32
|
/**
|
|
32
33
|
* forLogger
|
|
33
34
|
*
|
|
34
|
-
*
|
|
35
|
+
* 외부 로거와 연동하여 LogtoModule을 초기화합니다.
|
|
36
|
+
*
|
|
37
|
+
* @param loggerModule - DI에 등록된 로거 모듈 (예: WinstonLoggerModule)
|
|
38
|
+
* @param loggerToken - DI에 등록된 로거 서비스의 Injection Token
|
|
39
|
+
* @param global - 모듈을 전역(Global)으로 설정할지 여부 (기본값: false)
|
|
40
|
+
* @returns DynamicModule
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // src/app.module.ts
|
|
44
|
+
*
|
|
45
|
+
* import { Module } from '@nestjs/common';
|
|
46
|
+
* import { ConfigModule } from '@nestjs/config';
|
|
47
|
+
* import { LogtoModule } from 'point3-logto-module';
|
|
48
|
+
* // `MyLoggerModule`과 `MY_LOGGER_TOKEN`은 사용하는 로깅 시스템에 맞게 구현해야 합니다.
|
|
49
|
+
* import { MyLoggerModule, MY_LOGGER_TOKEN } from './common/logger';
|
|
50
|
+
*
|
|
51
|
+
* \@Module({
|
|
52
|
+
* imports: [
|
|
53
|
+
* // .env 파일을 읽기 위해 ConfigModule을 먼저 임포트합니다.
|
|
54
|
+
* ConfigModule.forRoot({ isGlobal: true }),
|
|
55
|
+
*
|
|
56
|
+
* // LogtoModule을 설정합니다.
|
|
57
|
+
* // `LOGTO_CLIENT` 환경변수 값에 따라 필요한 서비스만 주입됩니다.
|
|
58
|
+
* LogtoModule.forLogger(MyLoggerModule, MY_LOGGER_TOKEN, true),
|
|
59
|
+
* ],
|
|
60
|
+
* })
|
|
61
|
+
* export class AppModule {}
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // src/my-api.controller.ts (Stateless 모드 사용 예시)
|
|
35
65
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* @param global - 모듈을 글로벌로 등록할지 여부 (기본값: false)
|
|
39
|
-
* @returns DynamicModule - Logto 인증/권한 기능이 포함된 NestJS 모듈
|
|
66
|
+
* import { Controller, Get } from '@nestjs/common';
|
|
67
|
+
* import { LogtoProtected } from 'point3-logto-module';
|
|
40
68
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
69
|
+
* \@Controller('items')
|
|
70
|
+
* export class MyApiController {
|
|
71
|
+
* \@Get('protected')
|
|
72
|
+
* \@LogtoProtected() // 헤더의 Bearer 토큰을 자동으로 검증합니다.
|
|
73
|
+
* getProtectedResource() {
|
|
74
|
+
* return { message: 'This is a protected resource.' };
|
|
75
|
+
* }
|
|
76
|
+
* }
|
|
46
77
|
*/
|
|
47
78
|
static forLogger(
|
|
48
79
|
loggerModule: Type<any>,
|
|
49
80
|
loggerToken: Symbol | string,
|
|
50
81
|
global: boolean = false,
|
|
51
82
|
): DynamicModule {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
83
|
+
const baseProviders: Provider[] = [
|
|
84
|
+
{
|
|
85
|
+
provide: LogtoLoggerServiceToken,
|
|
86
|
+
useExisting: loggerToken,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
provide: LogtoTokenVerifierToken,
|
|
90
|
+
useClass: LogtoTokenVerifier,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
provide: LogtoTokenGuardToken,
|
|
94
|
+
useClass: LogtoTokenGuard,
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
const statefulProviders: Provider[] = [
|
|
99
|
+
{
|
|
100
|
+
provide: OAuthClientToken,
|
|
101
|
+
useFactory: (configService: ConfigService, logger: any) => {
|
|
102
|
+
if (configService.get<string>('LOGTO_CLIENT')?.toLowerCase() === 'true') {
|
|
103
|
+
return new OAuthClient(configService, logger);
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
68
106
|
},
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
107
|
+
inject: [ConfigService, LogtoLoggerServiceToken],
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
provide: LogtoLoginSessionToken,
|
|
111
|
+
useFactory: (configService: ConfigService, logger: any, oauthClient: OAuthClient) => {
|
|
112
|
+
if (configService.get<string>('LOGTO_CLIENT')?.toLowerCase() === 'true') {
|
|
113
|
+
return new LogtoLoginSession(logger, configService, oauthClient);
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
72
116
|
},
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
117
|
+
inject: [ConfigService, LogtoLoggerServiceToken, OAuthClientToken],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
provide: LogtoM2MClientToken,
|
|
121
|
+
useFactory: (configService: ConfigService, tokenVerifier: LogtoTokenVerifier, logger: any) => {
|
|
122
|
+
if (configService.get<string>('LOGTO_CLIENT')?.toLowerCase() === 'true') {
|
|
123
|
+
return new LogtoM2MClient(configService, tokenVerifier, logger);
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
76
126
|
},
|
|
77
|
-
|
|
127
|
+
inject: [ConfigService, LogtoTokenVerifierToken, LogtoLoggerServiceToken],
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
const providers = [...baseProviders, ...statefulProviders];
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
module: LogtoModule,
|
|
135
|
+
global: global,
|
|
136
|
+
imports: [
|
|
137
|
+
loggerModule,
|
|
78
138
|
],
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
LogtoTokenVerifierToken,
|
|
83
|
-
LogtoLoginSessionToken,
|
|
84
|
-
LogtoTokenGuard,
|
|
85
|
-
]
|
|
86
|
-
}
|
|
139
|
+
providers: providers,
|
|
140
|
+
exports: providers,
|
|
141
|
+
};
|
|
87
142
|
}
|
|
88
143
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@point3/logto-module",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "포인트3 내부 logto Authentication 모듈입니다",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"point3-common-tool": "^1.0.13"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@types/jest": "^29.5.14"
|
|
25
|
+
"@types/jest": "^29.5.14",
|
|
26
|
+
"typescript": "^5.8.3"
|
|
26
27
|
},
|
|
27
28
|
"repository": {
|
|
28
29
|
"type": "git",
|
package/stateless/guard.ts
CHANGED
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
UnauthorizedException,
|
|
6
6
|
InternalServerErrorException,
|
|
7
7
|
Inject,
|
|
8
|
-
Global,
|
|
9
8
|
HttpStatus
|
|
10
9
|
} from '@nestjs/common';
|
|
11
10
|
import { Reflector } from '@nestjs/core';
|
|
@@ -14,16 +13,17 @@ import { IncomingHttpHeaders } from 'http';
|
|
|
14
13
|
import { errors } from 'jose';
|
|
15
14
|
|
|
16
15
|
import { p3Values } from 'point3-common-tool';
|
|
17
|
-
import
|
|
16
|
+
import { LogtoTokenVerifier, LogtoTokenVerifierToken } from '../token';
|
|
17
|
+
|
|
18
|
+
export const LogtoTokenGuardToken = Symbol('LogtoTokenGuard');
|
|
18
19
|
|
|
19
|
-
@Global()
|
|
20
20
|
@Injectable()
|
|
21
21
|
export class LogtoTokenGuard implements CanActivate {
|
|
22
22
|
constructor(
|
|
23
23
|
private reflector: Reflector,
|
|
24
24
|
|
|
25
|
-
@Inject(
|
|
26
|
-
private tokenVerifier:
|
|
25
|
+
@Inject(LogtoTokenVerifierToken)
|
|
26
|
+
private tokenVerifier: LogtoTokenVerifier
|
|
27
27
|
) { }
|
|
28
28
|
|
|
29
29
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
package/token/verifier.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Inject, Injectable, UnauthorizedException } from "@nestjs/common";
|
|
2
2
|
import { ConfigService } from "@nestjs/config";
|
|
3
3
|
import { jwtVerify, createRemoteJWKSet } from "jose";
|
|
4
4
|
|
|
@@ -6,7 +6,6 @@ import * as token from "./access-token";
|
|
|
6
6
|
|
|
7
7
|
export const LogtoTokenVerifierToken = Symbol.for("LogtoTokenVerifier");
|
|
8
8
|
|
|
9
|
-
@Global()
|
|
10
9
|
@Injectable()
|
|
11
10
|
export class LogtoTokenVerifier {
|
|
12
11
|
constructor(
|