@things-factory/auth-base 10.0.19 → 10.1.0
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/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/application/application-query.js +3 -24
- package/dist-server/service/application/application-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/build-auth-url.d.ts +36 -0
- package/dist-server/utils/build-auth-url.js +85 -0
- package/dist-server/utils/build-auth-url.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **이 요청이 들어온 우리 주소**에 경로를 붙여 절대 주소를 만든다.
|
|
3
|
+
*
|
|
4
|
+
* 로그인·OAuth 의 주소를 화면과 저장 값에 내려 줄 때 쓴다.
|
|
5
|
+
*
|
|
6
|
+
* buildAuthURL('/oauth/authorize', context)
|
|
7
|
+
* buildAuthURL('/oauth2-client/callback', context)
|
|
8
|
+
*
|
|
9
|
+
* ── 왜 공용인가 ─────────────────────────────────────────────────────────────
|
|
10
|
+
* 이 열두 줄이 auth-base 와 oauth2-client 에 **똑같이 베껴져** 있었다(2026-09-04).
|
|
11
|
+
* x-forwarded 셋 읽기 · 폴백 · protocol 덮기 · pathname 붙이기가 같은 코드였다.
|
|
12
|
+
* 한쪽만 고치는 일이 실제로 났다 — 그래서 한 집으로 모았다.
|
|
13
|
+
*
|
|
14
|
+
* ── 프록시 뒤에서는 프록시가 본 주소를 쓴다 ─────────────────────────────────
|
|
15
|
+
* 리버스 프록시를 거치면 소켓이 보는 것은 프록시와의 연결이라 공개 주소가 아니다. 그때는
|
|
16
|
+
* 프록시가 실어 주는 x-forwarded-* 가 유일한 단서다.
|
|
17
|
+
*
|
|
18
|
+
* ── 폴백에서 request.origin 을 쓰지 않는 이유 ───────────────────────────────
|
|
19
|
+
* Koa 2 에서는 origin 이 정확히 우리가 원하는 값이다.
|
|
20
|
+
*
|
|
21
|
+
* [읽었음] node_modules/koa/lib/request.js:98
|
|
22
|
+
* get origin() { return `${this.protocol}://${this.host}` }
|
|
23
|
+
*
|
|
24
|
+
* 그런데 **Koa 3 은 그 뜻을 바꾼다** — 현재 호스트가 아니라 브라우저가 보낸 Origin 헤더를
|
|
25
|
+
* 준다(CORS 표준에 맞춘 변경, koajs/koa v3.0.0 릴리즈 노트). 그 헤더는 같은 출처 요청에는
|
|
26
|
+
* 아예 없고 어떤 경우엔 문자열 null 이다. 그러면 new URL(...) 이 던지고 **로그인과 OAuth
|
|
27
|
+
* 콜백이 런타임에 깨진다.** 타입도 맞고 테스트도 도니까 띄워서 로그인해 봐야 안다.
|
|
28
|
+
*
|
|
29
|
+
* 그래서 Koa 2 의 정의를 그대로 펼쳐 쓴다. protocol 과 host 는 두 판 모두 「이 요청이 들어온
|
|
30
|
+
* 곳」이고 app.proxy 설정도 그대로 존중한다. **오늘 값은 바뀌지 않는다.**
|
|
31
|
+
*
|
|
32
|
+
* ── config 의 protocol 이 마지막에 이긴다 ───────────────────────────────────
|
|
33
|
+
* 프록시가 헤더를 안 실어 주면서 TLS 종료를 하는 배치가 있다. 그때 여기서 읽은 것은 http 인데
|
|
34
|
+
* 브라우저가 아는 것은 https 다. 그 경우를 설정으로 못 박는다.
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildAuthURL(pathname: string, context: ResolverContext): string;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildAuthURL = buildAuthURL;
|
|
4
|
+
const url_1 = require("url");
|
|
5
|
+
const env_1 = require("@things-factory/env");
|
|
6
|
+
/*
|
|
7
|
+
* 프록시가 헤더를 안 실어 주면서 TLS 종료를 하는 배치를 위한 못. 모듈이 실릴 때 한 번 읽는다
|
|
8
|
+
* — 옮겨 오기 전에도 같은 자리에서 같은 방식으로 읽고 있었다.
|
|
9
|
+
*/
|
|
10
|
+
const protocol = env_1.config.get('protocol');
|
|
11
|
+
/**
|
|
12
|
+
* **이 요청이 들어온 우리 주소**에 경로를 붙여 절대 주소를 만든다.
|
|
13
|
+
*
|
|
14
|
+
* 로그인·OAuth 의 주소를 화면과 저장 값에 내려 줄 때 쓴다.
|
|
15
|
+
*
|
|
16
|
+
* buildAuthURL('/oauth/authorize', context)
|
|
17
|
+
* buildAuthURL('/oauth2-client/callback', context)
|
|
18
|
+
*
|
|
19
|
+
* ── 왜 공용인가 ─────────────────────────────────────────────────────────────
|
|
20
|
+
* 이 열두 줄이 auth-base 와 oauth2-client 에 **똑같이 베껴져** 있었다(2026-09-04).
|
|
21
|
+
* x-forwarded 셋 읽기 · 폴백 · protocol 덮기 · pathname 붙이기가 같은 코드였다.
|
|
22
|
+
* 한쪽만 고치는 일이 실제로 났다 — 그래서 한 집으로 모았다.
|
|
23
|
+
*
|
|
24
|
+
* ── 프록시 뒤에서는 프록시가 본 주소를 쓴다 ─────────────────────────────────
|
|
25
|
+
* 리버스 프록시를 거치면 소켓이 보는 것은 프록시와의 연결이라 공개 주소가 아니다. 그때는
|
|
26
|
+
* 프록시가 실어 주는 x-forwarded-* 가 유일한 단서다.
|
|
27
|
+
*
|
|
28
|
+
* ── 폴백에서 request.origin 을 쓰지 않는 이유 ───────────────────────────────
|
|
29
|
+
* Koa 2 에서는 origin 이 정확히 우리가 원하는 값이다.
|
|
30
|
+
*
|
|
31
|
+
* [읽었음] node_modules/koa/lib/request.js:98
|
|
32
|
+
* get origin() { return `${this.protocol}://${this.host}` }
|
|
33
|
+
*
|
|
34
|
+
* 그런데 **Koa 3 은 그 뜻을 바꾼다** — 현재 호스트가 아니라 브라우저가 보낸 Origin 헤더를
|
|
35
|
+
* 준다(CORS 표준에 맞춘 변경, koajs/koa v3.0.0 릴리즈 노트). 그 헤더는 같은 출처 요청에는
|
|
36
|
+
* 아예 없고 어떤 경우엔 문자열 null 이다. 그러면 new URL(...) 이 던지고 **로그인과 OAuth
|
|
37
|
+
* 콜백이 런타임에 깨진다.** 타입도 맞고 테스트도 도니까 띄워서 로그인해 봐야 안다.
|
|
38
|
+
*
|
|
39
|
+
* 그래서 Koa 2 의 정의를 그대로 펼쳐 쓴다. protocol 과 host 는 두 판 모두 「이 요청이 들어온
|
|
40
|
+
* 곳」이고 app.proxy 설정도 그대로 존중한다. **오늘 값은 바뀌지 않는다.**
|
|
41
|
+
*
|
|
42
|
+
* ── config 의 protocol 이 마지막에 이긴다 ───────────────────────────────────
|
|
43
|
+
* 프록시가 헤더를 안 실어 주면서 TLS 종료를 하는 배치가 있다. 그때 여기서 읽은 것은 http 인데
|
|
44
|
+
* 브라우저가 아는 것은 https 다. 그 경우를 설정으로 못 박는다.
|
|
45
|
+
*/
|
|
46
|
+
function buildAuthURL(pathname, context) {
|
|
47
|
+
const originalProtocol = context.headers['x-forwarded-proto'];
|
|
48
|
+
const originalHost = context.headers['x-forwarded-host'];
|
|
49
|
+
const originalPort = context.headers['x-forwarded-port'];
|
|
50
|
+
if (originalProtocol && originalHost) {
|
|
51
|
+
var url = new url_1.URL(`${originalProtocol}://${originalHost}`);
|
|
52
|
+
if (originalPort) {
|
|
53
|
+
url.port = originalPort;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
/*
|
|
58
|
+
* ── 왜 request.origin 을 쓰지 않나 ──────────────────────────────────────
|
|
59
|
+
*
|
|
60
|
+
* 여기가 하려는 일은 **이 요청이 들어온 우리 주소**를 얻는 것이다. 위의 x-forwarded-*
|
|
61
|
+
* 가 없을 때(프록시를 안 거친 직접 접속) 그 값을 요청에서 읽는다.
|
|
62
|
+
*
|
|
63
|
+
* 전에는 context.request.origin 이었다. Koa 2 에서는 그것이 정확히 우리가 원하는 값이다.
|
|
64
|
+
*
|
|
65
|
+
* [읽었음] node_modules/koa/lib/request.js:98
|
|
66
|
+
* get origin() { return `${this.protocol}://${this.host}` }
|
|
67
|
+
*
|
|
68
|
+
* 그런데 **Koa 3 은 그 뜻을 바꾼다** — 현재 호스트가 아니라 브라우저가 보낸 Origin 헤더를
|
|
69
|
+
* 준다(CORS 표준에 맞춘 변경, koajs/koa v3.0.0 릴리즈 노트). 그 헤더는 같은 출처 요청에는
|
|
70
|
+
* 아예 없고 어떤 경우엔 문자열 null 이다. 그러면 new URL(...) 이 던지고, **로그인·OAuth
|
|
71
|
+
* 콜백 주소를 만드는 이 자리에서 런타임에 깨진다.** 타입도 맞고 테스트도 도니까 띄워서
|
|
72
|
+
* 로그인해 봐야 안다.
|
|
73
|
+
*
|
|
74
|
+
* 그래서 Koa 2 의 정의를 그대로 펼쳐 쓴다. protocol 과 host 는 두 판 모두 「이 요청이
|
|
75
|
+
* 들어온 곳」이고 app.proxy 설정도 그대로 존중한다. **오늘 값은 바뀌지 않는다.**
|
|
76
|
+
*/
|
|
77
|
+
var url = new url_1.URL(`${context.request.protocol}://${context.request.host}`);
|
|
78
|
+
}
|
|
79
|
+
if (protocol) {
|
|
80
|
+
url.protocol = protocol;
|
|
81
|
+
}
|
|
82
|
+
url.pathname = pathname;
|
|
83
|
+
return url.href;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=build-auth-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-auth-url.js","sourceRoot":"","sources":["../../server/utils/build-auth-url.ts"],"names":[],"mappings":";;AA6CA,oCA0CC;AAvFD,6BAAyB;AAEzB,6CAA4C;AAE5C;;;GAGG;AACH,MAAM,QAAQ,GAAW,YAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,SAAgB,YAAY,CAAC,QAAgB,EAAE,OAAwB;IAErE,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAExD,IAAI,gBAAgB,IAAI,YAAY,EAAE,CAAC;QACrC,IAAI,GAAG,GAAQ,IAAI,SAAG,CAAC,GAAG,gBAAgB,MAAM,YAAY,EAAE,CAAC,CAAA;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,GAAG,YAAY,CAAA;QACzB,CAAC;IACH,CAAC;SAAM,CAAC;QACR;;;;;;;;;;;;;;;;;;;WAmBG;QACD,IAAI,GAAG,GAAQ,IAAI,SAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACjF,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACzB,CAAC;IAED,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAEvB,OAAO,GAAG,CAAC,IAAI,CAAA;AACjB,CAAC","sourcesContent":["import { URL } from 'url'\n\nimport { config } from '@things-factory/env'\n\n/*\n * 프록시가 헤더를 안 실어 주면서 TLS 종료를 하는 배치를 위한 못. 모듈이 실릴 때 한 번 읽는다\n * — 옮겨 오기 전에도 같은 자리에서 같은 방식으로 읽고 있었다.\n */\nconst protocol: string = config.get('protocol')\n\n/**\n * **이 요청이 들어온 우리 주소**에 경로를 붙여 절대 주소를 만든다.\n *\n * 로그인·OAuth 의 주소를 화면과 저장 값에 내려 줄 때 쓴다.\n *\n * buildAuthURL('/oauth/authorize', context)\n * buildAuthURL('/oauth2-client/callback', context)\n *\n * ── 왜 공용인가 ─────────────────────────────────────────────────────────────\n * 이 열두 줄이 auth-base 와 oauth2-client 에 **똑같이 베껴져** 있었다(2026-09-04).\n * x-forwarded 셋 읽기 · 폴백 · protocol 덮기 · pathname 붙이기가 같은 코드였다.\n * 한쪽만 고치는 일이 실제로 났다 — 그래서 한 집으로 모았다.\n *\n * ── 프록시 뒤에서는 프록시가 본 주소를 쓴다 ─────────────────────────────────\n * 리버스 프록시를 거치면 소켓이 보는 것은 프록시와의 연결이라 공개 주소가 아니다. 그때는\n * 프록시가 실어 주는 x-forwarded-* 가 유일한 단서다.\n *\n * ── 폴백에서 request.origin 을 쓰지 않는 이유 ───────────────────────────────\n * Koa 2 에서는 origin 이 정확히 우리가 원하는 값이다.\n *\n * [읽었음] node_modules/koa/lib/request.js:98\n * get origin() { return `${this.protocol}://${this.host}` }\n *\n * 그런데 **Koa 3 은 그 뜻을 바꾼다** — 현재 호스트가 아니라 브라우저가 보낸 Origin 헤더를\n * 준다(CORS 표준에 맞춘 변경, koajs/koa v3.0.0 릴리즈 노트). 그 헤더는 같은 출처 요청에는\n * 아예 없고 어떤 경우엔 문자열 null 이다. 그러면 new URL(...) 이 던지고 **로그인과 OAuth\n * 콜백이 런타임에 깨진다.** 타입도 맞고 테스트도 도니까 띄워서 로그인해 봐야 안다.\n *\n * 그래서 Koa 2 의 정의를 그대로 펼쳐 쓴다. protocol 과 host 는 두 판 모두 「이 요청이 들어온\n * 곳」이고 app.proxy 설정도 그대로 존중한다. **오늘 값은 바뀌지 않는다.**\n *\n * ── config 의 protocol 이 마지막에 이긴다 ───────────────────────────────────\n * 프록시가 헤더를 안 실어 주면서 TLS 종료를 하는 배치가 있다. 그때 여기서 읽은 것은 http 인데\n * 브라우저가 아는 것은 https 다. 그 경우를 설정으로 못 박는다.\n */\nexport function buildAuthURL(pathname: string, context: ResolverContext): string {\n\n const originalProtocol = context.headers['x-forwarded-proto']\n const originalHost = context.headers['x-forwarded-host']\n const originalPort = context.headers['x-forwarded-port']\n\n if (originalProtocol && originalHost) {\n var url: URL = new URL(`${originalProtocol}://${originalHost}`)\n if (originalPort) {\n url.port = originalPort\n }\n } else {\n /*\n * ── 왜 request.origin 을 쓰지 않나 ──────────────────────────────────────\n *\n * 여기가 하려는 일은 **이 요청이 들어온 우리 주소**를 얻는 것이다. 위의 x-forwarded-*\n * 가 없을 때(프록시를 안 거친 직접 접속) 그 값을 요청에서 읽는다.\n *\n * 전에는 context.request.origin 이었다. Koa 2 에서는 그것이 정확히 우리가 원하는 값이다.\n *\n * [읽었음] node_modules/koa/lib/request.js:98\n * get origin() { return `${this.protocol}://${this.host}` }\n *\n * 그런데 **Koa 3 은 그 뜻을 바꾼다** — 현재 호스트가 아니라 브라우저가 보낸 Origin 헤더를\n * 준다(CORS 표준에 맞춘 변경, koajs/koa v3.0.0 릴리즈 노트). 그 헤더는 같은 출처 요청에는\n * 아예 없고 어떤 경우엔 문자열 null 이다. 그러면 new URL(...) 이 던지고, **로그인·OAuth\n * 콜백 주소를 만드는 이 자리에서 런타임에 깨진다.** 타입도 맞고 테스트도 도니까 띄워서\n * 로그인해 봐야 안다.\n *\n * 그래서 Koa 2 의 정의를 그대로 펼쳐 쓴다. protocol 과 host 는 두 판 모두 「이 요청이\n * 들어온 곳」이고 app.proxy 설정도 그대로 존중한다. **오늘 값은 바뀌지 않는다.**\n */\n var url: URL = new URL(`${context.request.protocol}://${context.request.host}`)\n }\n\n if (protocol) {\n url.protocol = protocol\n }\n\n url.pathname = pathname\n\n return url.href\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/auth-base",
|
|
3
|
-
"version": "10.0
|
|
3
|
+
"version": "10.1.0",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
"@reduxjs/toolkit": "^2.2.5",
|
|
35
35
|
"@simplewebauthn/browser": "^13.0.0",
|
|
36
36
|
"@simplewebauthn/server": "^13.0.0",
|
|
37
|
-
"@things-factory/email-base": "^10.0
|
|
37
|
+
"@things-factory/email-base": "^10.1.0",
|
|
38
38
|
"@things-factory/env": "^10.0.8",
|
|
39
|
-
"@things-factory/shell": "^10.0
|
|
39
|
+
"@things-factory/shell": "^10.1.0",
|
|
40
40
|
"@things-factory/utils": "^10.0.8",
|
|
41
41
|
"@types/webappsec-credential-management": "^0.6.9",
|
|
42
42
|
"jsonwebtoken": "^9.0.0",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"passport-jwt": "^4.0.0",
|
|
49
49
|
"passport-local": "^1.0.0"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "8407b1e9d1f47f6676af144d4a33c8ac01cb49c4"
|
|
52
52
|
}
|