@point3/logto-module 1.1.5 → 1.1.7
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/client/__tests__/m2m-client.spec.ts +28 -6
- package/client/__tests__/oauth-client.spec.ts +4 -0
- package/client/m2m-client.ts +51 -30
- package/client/oauth-client.ts +29 -0
- package/client/types.ts +15 -0
- package/dist/client/__tests__/m2m-client.spec.js +13 -0
- package/dist/client/__tests__/m2m-client.spec.js.map +1 -1
- package/dist/client/__tests__/oauth-client.spec.js +3 -0
- package/dist/client/__tests__/oauth-client.spec.js.map +1 -1
- package/dist/client/m2m-client.d.ts +4 -4
- package/dist/client/m2m-client.js +18 -20
- package/dist/client/m2m-client.js.map +1 -1
- package/dist/client/oauth-client.d.ts +3 -0
- package/dist/client/oauth-client.js +18 -0
- package/dist/client/oauth-client.js.map +1 -1
- package/dist/client/types.d.ts +8 -0
- package/dist/client/types.js.map +1 -1
- package/dist/env-config.d.ts +15 -0
- package/dist/env-config.js +157 -0
- package/dist/env-config.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.js +8 -1
- package/dist/errors.js.map +1 -1
- package/dist/local-test.d.ts +1 -0
- package/dist/local-test.js +87 -0
- package/dist/local-test.js.map +1 -0
- package/dist/stateless/guard.d.ts +4 -1
- package/dist/stateless/guard.js +17 -3
- package/dist/stateless/guard.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/errors.ts +7 -0
- package/package.json +5 -3
- package/stateless/guard.ts +30 -12
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LOGTO_ENV_REGISTRY = exports.LogtoEnvValidationError = void 0;
|
|
4
|
+
exports.resolveEnv = resolveEnv;
|
|
5
|
+
exports.resolveEnvOrThrow = resolveEnvOrThrow;
|
|
6
|
+
exports.validateLogtoEnv = validateLogtoEnv;
|
|
7
|
+
const errors_1 = require("./errors");
|
|
8
|
+
class LogtoEnvValidationError extends errors_1.LogtoError {
|
|
9
|
+
constructor(mode, missingVars) {
|
|
10
|
+
super(`LogtoModule 초기화 실패 [${mode} 모드]: 필수 환경변수가 누락되었습니다 - ${missingVars.join(', ')}`);
|
|
11
|
+
this.name = 'LogtoEnvValidationError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.LogtoEnvValidationError = LogtoEnvValidationError;
|
|
15
|
+
exports.LOGTO_ENV_REGISTRY = [
|
|
16
|
+
{
|
|
17
|
+
newName: 'LOGTO/JWKS_URI',
|
|
18
|
+
legacyName: 'LOGTO_JWKS_URI',
|
|
19
|
+
requirement: 'always',
|
|
20
|
+
description: 'JWT 검증용 JWKS 엔드포인트',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
newName: 'LOGTO/AUTH_ISSUER',
|
|
24
|
+
legacyName: 'LOGTO_AUTH_ISSUER',
|
|
25
|
+
requirement: 'always',
|
|
26
|
+
description: 'JWT 발급자(iss)',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
newName: 'LOGTO/AUTH_ENDPOINT',
|
|
30
|
+
legacyName: 'LOGTO_AUTH_ENDPOINT',
|
|
31
|
+
requirement: 'client',
|
|
32
|
+
description: 'Logto 인증 서버 OIDC 엔드포인트',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
newName: 'LOGTO/CLIENT_ID',
|
|
36
|
+
legacyName: 'LOGTO_CLIENT_ID',
|
|
37
|
+
requirement: 'client',
|
|
38
|
+
description: 'OAuth 클라이언트 ID',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
newName: 'LOGTO/CLIENT_SECRET',
|
|
42
|
+
legacyName: 'LOGTO_CLIENT_SECRET',
|
|
43
|
+
requirement: 'client',
|
|
44
|
+
description: 'OAuth 클라이언트 시크릿',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
newName: 'LOGTO/RESOURCES',
|
|
48
|
+
legacyName: 'LOGTO_RESOURCES',
|
|
49
|
+
requirement: 'client',
|
|
50
|
+
description: '접근할 리소스 서버',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
newName: 'LOGTO/SCOPES',
|
|
54
|
+
legacyName: 'LOGTO_SCOPES',
|
|
55
|
+
requirement: 'client',
|
|
56
|
+
description: '요청할 OAuth 스코프',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
newName: 'LOGTO/PROMPT',
|
|
60
|
+
legacyName: 'LOGTO_PROMPT',
|
|
61
|
+
requirement: 'client',
|
|
62
|
+
description: 'OAuth prompt 파라미터',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
newName: 'LOGTO/REDIRECT_URI',
|
|
66
|
+
legacyName: 'LOGTO_REDIRECT_URI',
|
|
67
|
+
requirement: 'client',
|
|
68
|
+
description: '인증 후 리다이렉트 URI',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
newName: 'LOGTO/SIGN_IN_URI',
|
|
72
|
+
legacyName: 'LOGTO_SIGN_IN_URI',
|
|
73
|
+
requirement: 'client',
|
|
74
|
+
description: '기본 로그인 URI',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
newName: 'LOGTO/M2M_CLIENT_ID',
|
|
78
|
+
legacyName: 'LOGTO_M2M_CLIENT_ID',
|
|
79
|
+
requirement: 'client',
|
|
80
|
+
description: 'M2M 인증용 클라이언트 ID',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
newName: 'LOGTO/M2M_CLIENT_SECRET',
|
|
84
|
+
legacyName: 'LOGTO_M2M_CLIENT_SECRET',
|
|
85
|
+
requirement: 'client',
|
|
86
|
+
description: 'M2M 인증용 클라이언트 시크릿',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
newName: 'LOGTO/M2M_RESOURCE',
|
|
90
|
+
legacyName: 'LOGTO_M2M_RESOURCE',
|
|
91
|
+
requirement: 'client',
|
|
92
|
+
description: 'M2M 인증용 리소스',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
newName: 'LOGTO/M2M_API_URL',
|
|
96
|
+
legacyName: 'LOGTO_M2M_API_URL',
|
|
97
|
+
requirement: 'client',
|
|
98
|
+
description: 'M2M API 서버 base URL',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
newName: 'LOGTO/DASHBOARD_SIGN_IN_URI',
|
|
102
|
+
legacyName: 'LOGTO_DASHBOARD_SIGN_IN_URI',
|
|
103
|
+
requirement: 'optional',
|
|
104
|
+
description: '대시보드 로그인 URI',
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
const warnedDeprecations = new Set();
|
|
108
|
+
function resolveEnv(newName, legacyName) {
|
|
109
|
+
const newValue = process.env[newName];
|
|
110
|
+
if (newValue !== undefined) {
|
|
111
|
+
return newValue;
|
|
112
|
+
}
|
|
113
|
+
const legacyValue = process.env[legacyName];
|
|
114
|
+
if (legacyValue !== undefined) {
|
|
115
|
+
if (!warnedDeprecations.has(legacyName)) {
|
|
116
|
+
console.warn(`[DEPRECATION WARNING] 환경변수 '${legacyName}'는 deprecated되었습니다. '${newName}'를 사용하세요.`);
|
|
117
|
+
warnedDeprecations.add(legacyName);
|
|
118
|
+
}
|
|
119
|
+
return legacyValue;
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
function resolveEnvOrThrow(newName, legacyName) {
|
|
124
|
+
const value = resolveEnv(newName, legacyName);
|
|
125
|
+
if (value === undefined) {
|
|
126
|
+
throw new Error(`환경변수 '${newName}' 또는 '${legacyName}'가 설정되지 않았습니다.`);
|
|
127
|
+
}
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
function validateLogtoEnv(enableClient) {
|
|
131
|
+
const mode = enableClient ? 'Stateful' : 'Stateless';
|
|
132
|
+
const missingVars = [];
|
|
133
|
+
for (const entry of exports.LOGTO_ENV_REGISTRY) {
|
|
134
|
+
const isRequired = entry.requirement === 'always' ||
|
|
135
|
+
(enableClient && entry.requirement === 'client');
|
|
136
|
+
if (isRequired) {
|
|
137
|
+
const value = resolveEnv(entry.newName, entry.legacyName);
|
|
138
|
+
if (value === undefined) {
|
|
139
|
+
missingVars.push(`${entry.newName} (또는 ${entry.legacyName})`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (missingVars.length > 0) {
|
|
144
|
+
throw new LogtoEnvValidationError(mode, missingVars);
|
|
145
|
+
}
|
|
146
|
+
if (enableClient) {
|
|
147
|
+
for (const entry of exports.LOGTO_ENV_REGISTRY) {
|
|
148
|
+
if (entry.requirement === 'optional') {
|
|
149
|
+
const value = resolveEnv(entry.newName, entry.legacyName);
|
|
150
|
+
if (value === undefined) {
|
|
151
|
+
console.warn(`[WARNING] 선택적 환경변수 '${entry.newName}' (또는 '${entry.legacyName}')가 설정되지 않았습니다.`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=env-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-config.js","sourceRoot":"","sources":["../env-config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
package/dist/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SignOutUriGenerationError = exports.SignInUriGenerationError = exports.AuthorizationCodeTokenFetchError = exports.TokenRevocationFailedError = exports.MultipleUsersFoundError = exports.UserNotFoundError = exports.UserMissingRequiredFieldsError = exports.LogtoError = void 0;
|
|
3
|
+
exports.PersonalAccessTokenFetchError = exports.SignOutUriGenerationError = exports.SignInUriGenerationError = exports.AuthorizationCodeTokenFetchError = exports.TokenRevocationFailedError = exports.MultipleUsersFoundError = exports.UserNotFoundError = exports.UserMissingRequiredFieldsError = exports.LogtoError = void 0;
|
|
4
4
|
class LogtoError extends Error {
|
|
5
5
|
constructor(e) {
|
|
6
6
|
super(typeof e === 'string' ? e : e.message);
|
|
@@ -59,4 +59,11 @@ class SignOutUriGenerationError extends LogtoError {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
exports.SignOutUriGenerationError = SignOutUriGenerationError;
|
|
62
|
+
class PersonalAccessTokenFetchError extends LogtoError {
|
|
63
|
+
constructor() {
|
|
64
|
+
super('Personal Access Token을 사용한 액세스 토큰 발급에 실패했습니다.');
|
|
65
|
+
this.name = "PersonalAccessTokenFetchError";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.PersonalAccessTokenFetchError = PersonalAccessTokenFetchError;
|
|
62
69
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAW,SAAQ,KAAK;IACjC,YAAY,CAAiB;QACzB,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9D,CAAC;CACJ;AAPD,gCAOC;AAED,MAAa,8BAA+B,SAAQ,UAAU;IAC1D;QACI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IACjD,CAAC;CACJ;AALD,wEAKC;AAED,MAAa,iBAAkB,SAAQ,UAAU;IAC7C,YAAY,KAAa,EAAE,KAAa;QACpC,KAAK,CAAC,QAAQ,KAAK,WAAW,KAAK,mBAAmB,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACpC,CAAC;CACJ;AALD,8CAKC;AAED,MAAa,uBAAwB,SAAQ,UAAU;IACnD,YAAY,KAAa,EAAE,KAAa;QACpC,KAAK,CAAC,QAAQ,KAAK,WAAW,KAAK,oBAAoB,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IAC1C,CAAC;CACJ;AALD,0DAKC;AAED,MAAa,0BAA2B,SAAQ,UAAU;IACtD;QACI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC7C,CAAC;CACJ;AALD,gEAKC;AAED,MAAa,gCAAiC,SAAQ,UAAU;IAC5D,YAAY,IAAY;QACpB,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;IACnD,CAAC;CACJ;AALD,4EAKC;AAED,MAAa,wBAAyB,SAAQ,UAAU;IACpD,YAAY,UAAkB;QAC1B,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC3C,CAAC;CACJ;AALD,4DAKC;AAED,MAAa,yBAA0B,SAAQ,UAAU;IACrD;QACI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC5C,CAAC;CACJ;AALD,8DAKC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAW,SAAQ,KAAK;IACjC,YAAY,CAAiB;QACzB,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9D,CAAC;CACJ;AAPD,gCAOC;AAED,MAAa,8BAA+B,SAAQ,UAAU;IAC1D;QACI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IACjD,CAAC;CACJ;AALD,wEAKC;AAED,MAAa,iBAAkB,SAAQ,UAAU;IAC7C,YAAY,KAAa,EAAE,KAAa;QACpC,KAAK,CAAC,QAAQ,KAAK,WAAW,KAAK,mBAAmB,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACpC,CAAC;CACJ;AALD,8CAKC;AAED,MAAa,uBAAwB,SAAQ,UAAU;IACnD,YAAY,KAAa,EAAE,KAAa;QACpC,KAAK,CAAC,QAAQ,KAAK,WAAW,KAAK,oBAAoB,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IAC1C,CAAC;CACJ;AALD,0DAKC;AAED,MAAa,0BAA2B,SAAQ,UAAU;IACtD;QACI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC7C,CAAC;CACJ;AALD,gEAKC;AAED,MAAa,gCAAiC,SAAQ,UAAU;IAC5D,YAAY,IAAY;QACpB,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;IACnD,CAAC;CACJ;AALD,4EAKC;AAED,MAAa,wBAAyB,SAAQ,UAAU;IACpD,YAAY,UAAkB;QAC1B,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC3C,CAAC;CACJ;AALD,4DAKC;AAED,MAAa,yBAA0B,SAAQ,UAAU;IACrD;QACI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC5C,CAAC;CACJ;AALD,8DAKC;AAED,MAAa,6BAA8B,SAAQ,UAAU;IACzD;QACI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAChD,CAAC;CACJ;AALD,sEAKC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const MY_LOGGER_TOKEN: unique symbol;
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MY_LOGGER_TOKEN = void 0;
|
|
10
|
+
const testing_1 = require("@nestjs/testing");
|
|
11
|
+
const config_1 = require("@nestjs/config");
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const module_1 = require("./module");
|
|
14
|
+
const token_1 = require("./token");
|
|
15
|
+
exports.MY_LOGGER_TOKEN = Symbol("LOGGER");
|
|
16
|
+
let MockLoggerService = class MockLoggerService {
|
|
17
|
+
log(message) {
|
|
18
|
+
console.log("[MockLogger] LOG:", message);
|
|
19
|
+
}
|
|
20
|
+
error(message) {
|
|
21
|
+
console.error("[MockLogger] ERROR:", message);
|
|
22
|
+
}
|
|
23
|
+
warn(message) {
|
|
24
|
+
console.warn("[MockLogger] WARN:", message);
|
|
25
|
+
}
|
|
26
|
+
debug(message) {
|
|
27
|
+
console.debug("[MockLogger] DEBUG:", message);
|
|
28
|
+
}
|
|
29
|
+
verbose(message) {
|
|
30
|
+
console.log("[MockLogger] VERBOSE:", message);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
MockLoggerService = __decorate([
|
|
34
|
+
(0, common_1.Injectable)()
|
|
35
|
+
], MockLoggerService);
|
|
36
|
+
let MockLoggerModule = class MockLoggerModule {
|
|
37
|
+
};
|
|
38
|
+
MockLoggerModule = __decorate([
|
|
39
|
+
(0, common_1.Global)(),
|
|
40
|
+
(0, common_1.Module)({
|
|
41
|
+
providers: [
|
|
42
|
+
{
|
|
43
|
+
provide: exports.MY_LOGGER_TOKEN,
|
|
44
|
+
useClass: MockLoggerService,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
exports: [exports.MY_LOGGER_TOKEN],
|
|
48
|
+
})
|
|
49
|
+
], MockLoggerModule);
|
|
50
|
+
async function runTest() {
|
|
51
|
+
console.log("--- Starting Local Test for @point3/logto-module ---");
|
|
52
|
+
process.env.LOGTO_AUTH_ISSUER = "https://auth.example.com/oidc";
|
|
53
|
+
process.env.LOGTO_JWKS_URI = "https://auth.example.com/oidc/jwks";
|
|
54
|
+
try {
|
|
55
|
+
const moduleRef = await testing_1.Test.createTestingModule({
|
|
56
|
+
imports: [
|
|
57
|
+
config_1.ConfigModule.forRoot({
|
|
58
|
+
isGlobal: true,
|
|
59
|
+
ignoreEnvFile: true,
|
|
60
|
+
}),
|
|
61
|
+
module_1.LogtoModule.forRoot({
|
|
62
|
+
global: true,
|
|
63
|
+
logger: {
|
|
64
|
+
module: MockLoggerModule,
|
|
65
|
+
token: exports.MY_LOGGER_TOKEN,
|
|
66
|
+
},
|
|
67
|
+
}),
|
|
68
|
+
],
|
|
69
|
+
}).compile();
|
|
70
|
+
const verifier = moduleRef.get(token_1.LogtoTokenVerifierToken);
|
|
71
|
+
if (verifier) {
|
|
72
|
+
console.log("✅ LogtoModule initialized successfully!");
|
|
73
|
+
console.log("✅ LogtoTokenVerifierToken resolved correctly.");
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error("❌ LogtoTokenVerifierToken could NOT be resolved.");
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
console.log("--- Test Completed Successfully ---");
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.error("❌ Error during module initialization:", error);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
runTest();
|
|
87
|
+
//# sourceMappingURL=local-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-test.js","sourceRoot":"","sources":["../local-test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,6CAAsD;AACtD,2CAA8C;AAC9C,2CAA4D;AAC5D,qCAAuC;AACvC,mCAAkD;AAGrC,QAAA,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAGhD,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACrB,GAAG,CAAC,OAAY;QACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,OAAY;QAChB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,OAAY;QACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,CAAC,OAAY;QAChB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,OAAY;QAClB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF,CAAA;AAhBK,iBAAiB;IADtB,IAAA,mBAAU,GAAE;GACP,iBAAiB,CAgBtB;AAYD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,gBAAgB;IAVrB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,uBAAe;gBACxB,QAAQ,EAAE,iBAAiB;aAC5B;SACF;QACD,OAAO,EAAE,CAAC,uBAAe,CAAC;KAC3B,CAAC;GACI,gBAAgB,CAAG;AAEzB,KAAK,UAAU,OAAO;IACpB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAKpE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,+BAA+B,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,oCAAoC,CAAC;IAElE,IAAI,CAAC;QAEH,MAAM,SAAS,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC9D,OAAO,EAAE;gBAEP,qBAAY,CAAC,OAAO,CAAC;oBACnB,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,IAAI;iBACpB,CAAC;gBACF,oBAAW,CAAC,OAAO,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE;wBACN,MAAM,EAAE,gBAAgB;wBACxB,KAAK,EAAE,uBAAe;qBACvB;iBACF,CAAC;aACH;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAGb,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,+BAAuB,CAAC,CAAC;QAExD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import { LogtoTokenVerifier } from '../token';
|
|
3
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
4
|
export declare const LogtoTokenGuardToken: unique symbol;
|
|
4
5
|
export declare class LogtoTokenGuard implements CanActivate {
|
|
5
6
|
private tokenVerifier;
|
|
7
|
+
private configService;
|
|
6
8
|
private reflector;
|
|
7
|
-
constructor(tokenVerifier: LogtoTokenVerifier);
|
|
9
|
+
constructor(tokenVerifier: LogtoTokenVerifier, configService: ConfigService);
|
|
8
10
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
9
11
|
private extractBearerTokenFrom;
|
|
12
|
+
private getRequest;
|
|
10
13
|
}
|
package/dist/stateless/guard.js
CHANGED
|
@@ -14,20 +14,26 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.LogtoTokenGuard = exports.LogtoTokenGuardToken = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
17
18
|
const core_1 = require("@nestjs/core");
|
|
18
19
|
const jose_1 = require("jose");
|
|
19
20
|
const point3_common_tool_1 = require("point3-common-tool");
|
|
20
21
|
const token_1 = require("../token");
|
|
22
|
+
const config_1 = require("@nestjs/config");
|
|
21
23
|
exports.LogtoTokenGuardToken = Symbol('LogtoTokenGuard');
|
|
22
24
|
let LogtoTokenGuard = class LogtoTokenGuard {
|
|
23
|
-
constructor(tokenVerifier) {
|
|
25
|
+
constructor(tokenVerifier, configService) {
|
|
24
26
|
this.tokenVerifier = tokenVerifier;
|
|
27
|
+
this.configService = configService;
|
|
25
28
|
this.reflector = new core_1.Reflector();
|
|
26
29
|
}
|
|
27
30
|
async canActivate(context) {
|
|
31
|
+
if (this.configService.get('NODE_ENV') === 'local') {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
28
34
|
const requiredScopes = this.reflector.get('requiredScopes', context.getHandler());
|
|
29
35
|
const requiredRoles = this.reflector.get('requiredRoles', context.getHandler());
|
|
30
|
-
const request =
|
|
36
|
+
const request = this.getRequest(context);
|
|
31
37
|
try {
|
|
32
38
|
const bearerToken = this.extractBearerTokenFrom(request.headers);
|
|
33
39
|
const result = await this.tokenVerifier.verifyToken(bearerToken, requiredScopes, requiredRoles);
|
|
@@ -59,11 +65,19 @@ let LogtoTokenGuard = class LogtoTokenGuard {
|
|
|
59
65
|
return headers.authorization.slice(bearerTokenIdentifier.length + 1);
|
|
60
66
|
}
|
|
61
67
|
;
|
|
68
|
+
getRequest(context) {
|
|
69
|
+
if (context.getType() === 'graphql') {
|
|
70
|
+
const gqlCtx = graphql_1.GqlExecutionContext.create(context);
|
|
71
|
+
return gqlCtx.getContext().req;
|
|
72
|
+
}
|
|
73
|
+
return context.switchToHttp().getRequest();
|
|
74
|
+
}
|
|
62
75
|
};
|
|
63
76
|
exports.LogtoTokenGuard = LogtoTokenGuard;
|
|
64
77
|
exports.LogtoTokenGuard = LogtoTokenGuard = __decorate([
|
|
65
78
|
(0, common_1.Injectable)(),
|
|
66
79
|
__param(0, (0, common_1.Inject)(token_1.LogtoTokenVerifierToken)),
|
|
67
|
-
__metadata("design:paramtypes", [token_1.LogtoTokenVerifier
|
|
80
|
+
__metadata("design:paramtypes", [token_1.LogtoTokenVerifier,
|
|
81
|
+
config_1.ConfigService])
|
|
68
82
|
], LogtoTokenGuard);
|
|
69
83
|
//# sourceMappingURL=guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../stateless/guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAQwB;AACxB,uCAAyC;AAGzC,+BAA8B;AAE9B,2DAA8C;AAC9C,oCAAuE;
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../stateless/guard.ts"],"names":[],"mappings":"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"}
|