@thoughtspot/mcp-auth 2.1.1 → 3.0.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/README.md +28 -0
- package/assets/oauth-callback.html +1 -1
- package/assets/oauth-callback.js +26 -16
- package/dist/auth-state.d.ts +53 -0
- package/dist/auth-state.d.ts.map +1 -0
- package/dist/auth-state.js +143 -0
- package/dist/auth-state.js.map +1 -0
- package/dist/handlers.d.ts +7 -0
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +102 -89
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth-utils.d.ts +10 -6
- package/dist/oauth-utils.d.ts.map +1 -1
- package/dist/oauth-utils.js +18 -30
- package/dist/oauth-utils.js.map +1 -1
- package/dist/token-utils.d.ts +8 -1
- package/dist/token-utils.d.ts.map +1 -1
- package/dist/token-utils.js +23 -6
- package/dist/token-utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -53,6 +53,34 @@ export default {
|
|
|
53
53
|
|
|
54
54
|
The token callback page expects `oauth-callback.{html,css,js}` available via an `assetsFetcher`. Either ship the bundled assets in `./assets/` to your Worker's `[assets]` binding, or pass a custom fetcher.
|
|
55
55
|
|
|
56
|
+
## OAuth state (3.0.0+)
|
|
57
|
+
|
|
58
|
+
The authorization request is kept server-side in the `OAUTH_KV` binding (the same namespace the OAuth provider uses) under an opaque, single-use state ID, bound to the browser that started the flow with an `HttpOnly; Secure; SameSite=Lax` `__Host-` cookie. Only the state ID travels through the approval form, the SAML `targetURLPath` and `/callback`.
|
|
59
|
+
|
|
60
|
+
Custom callback pages must follow this contract:
|
|
61
|
+
|
|
62
|
+
- `oauth-callback.html` contains `<script type="application/json" id="oauth-flow">{{OAUTH_FLOW}}</script>`. It is replaced with `{"state": "...", "instanceUrl": "..."}`.
|
|
63
|
+
- The page posts `{ "token": { "data": { "token": "..." } }, "state": "<state>" }` to `/store-token`. Any `oauthReqInfo` or `instanceUrl` in the body is ignored.
|
|
64
|
+
- A `403` from `/callback` or `/store-token` means the state is missing, expired, already used, or was opened in a different browser; the response body is a message safe to show the user.
|
|
65
|
+
|
|
66
|
+
### Local development over plain HTTP
|
|
67
|
+
|
|
68
|
+
Browsers drop `Secure` / `__Host-` cookies set over plain HTTP unless the host is `localhost`, `*.localhost` or a loopback IP. A hosts-file alias such as `http://myserver.com` does not qualify, so the binding cookie is lost and every flow fails with a 403.
|
|
69
|
+
|
|
70
|
+
For local development only, add this to `.dev.vars`:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
OAUTH_ALLOW_INSECURE_DEV_COOKIE=true
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
HTTP requests then use a `ts_mcp_oauth_binding` cookie without `Secure` (still `HttpOnly; SameSite=Lax`), and a warning is logged each time one is issued. HTTPS requests always get the `__Host-` / `Secure` cookie, even with the variable set. Never set it in a deployed environment.
|
|
77
|
+
|
|
78
|
+
### Upgrading from 2.x
|
|
79
|
+
|
|
80
|
+
- Replace the `{{OAUTH_REQ_INFO}}` script block with the `{{OAUTH_FLOW}}` one above, stop reading `window.INSTANCE_URL`, and send `state` instead of `oauthReqInfo`/`instanceUrl` to `/store-token`. The bundled `./assets/` already do this.
|
|
81
|
+
- `renderTokenCallback(flow, assets, origin)`, `renderApprovalDialog(request, { stateId, ... })`, `parseRedirectApproval()` (returns `{ stateId, instanceUrl }`) and `buildSamlRedirectUrl(instanceUrl, stateId, origin)` changed signatures.
|
|
82
|
+
- Authorization flows in progress during the upgrade must be restarted. Existing grants and tokens are unaffected.
|
|
83
|
+
|
|
56
84
|
## License
|
|
57
85
|
|
|
58
86
|
ThoughtSpot Development Tools End User License Agreement — see [LICENSE](LICENSE).
|
package/assets/oauth-callback.js
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
// Immediately invoke the async function
|
|
2
2
|
(async () => {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
// /store-token answers errors in plain text, but fall back gracefully if a
|
|
4
|
+
// JSON body ({ error } or { message }) comes back instead.
|
|
5
|
+
async function readErrorMessage(response) {
|
|
6
|
+
const text = await response.text();
|
|
7
|
+
try {
|
|
8
|
+
const parsed = JSON.parse(text);
|
|
9
|
+
return parsed?.error || parsed?.message || text;
|
|
10
|
+
} catch {
|
|
11
|
+
return text;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let oauthFlow;
|
|
16
|
+
|
|
5
17
|
// Ensure manual section is hidden initially
|
|
6
18
|
const manualSection = document.getElementById('manual-token-section');
|
|
7
19
|
const freeTrialErrorSection = document.getElementById('free-trial-error-section');
|
|
@@ -9,12 +21,15 @@
|
|
|
9
21
|
manualSection.style.display = 'none';
|
|
10
22
|
|
|
11
23
|
try {
|
|
12
|
-
//
|
|
13
|
-
|
|
24
|
+
// Parsed inside try so a malformed block shows an error, not a stuck spinner.
|
|
25
|
+
oauthFlow = JSON.parse(document.getElementById('oauth-flow').textContent);
|
|
26
|
+
|
|
27
|
+
// Check the instance URL is available
|
|
28
|
+
if (!oauthFlow.instanceUrl) {
|
|
14
29
|
throw new Error('Instance URL not available. Please ensure you accessed this page through the proper OAuth flow.');
|
|
15
30
|
}
|
|
16
31
|
|
|
17
|
-
const base = new URL(
|
|
32
|
+
const base = new URL(oauthFlow.instanceUrl);
|
|
18
33
|
if (!base.pathname.endsWith('/')) {
|
|
19
34
|
base.pathname += '/';
|
|
20
35
|
}
|
|
@@ -108,15 +123,13 @@
|
|
|
108
123
|
},
|
|
109
124
|
body: JSON.stringify({
|
|
110
125
|
token: tokenData,
|
|
111
|
-
|
|
112
|
-
instanceUrl: window.INSTANCE_URL
|
|
126
|
+
state: oauthFlow.state
|
|
113
127
|
})
|
|
114
128
|
});
|
|
115
|
-
const responseData = await storeResponse.json();
|
|
116
129
|
if (!storeResponse.ok) {
|
|
117
|
-
|
|
118
|
-
throw new Error(`Failed to store token (Status: ${storeResponse.status}): ${errorText}`);
|
|
130
|
+
throw new Error(await readErrorMessage(storeResponse));
|
|
119
131
|
}
|
|
132
|
+
const responseData = await storeResponse.json();
|
|
120
133
|
window.location.href = responseData.redirectTo;
|
|
121
134
|
} catch (err) {
|
|
122
135
|
document.getElementById('status').textContent = err.message;
|
|
@@ -140,16 +153,13 @@
|
|
|
140
153
|
},
|
|
141
154
|
body: JSON.stringify({
|
|
142
155
|
token: data,
|
|
143
|
-
|
|
144
|
-
instanceUrl: window.INSTANCE_URL
|
|
156
|
+
state: oauthFlow.state
|
|
145
157
|
})
|
|
146
158
|
});
|
|
147
|
-
const responseData = await storeResponse.json();
|
|
148
|
-
|
|
149
159
|
if (!storeResponse.ok) {
|
|
150
|
-
|
|
151
|
-
throw new Error(`Failed to store token (Status: ${storeResponse.status}): ${errorText}`);
|
|
160
|
+
throw new Error(await readErrorMessage(storeResponse));
|
|
152
161
|
}
|
|
162
|
+
const responseData = await storeResponse.json();
|
|
153
163
|
|
|
154
164
|
window.location.href = responseData.redirectTo;
|
|
155
165
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AuthRequest } from "@cloudflare/workers-oauth-provider";
|
|
2
|
+
/**
|
|
3
|
+
* Server-side record of an in-flight OAuth authorization.
|
|
4
|
+
*
|
|
5
|
+
* The validated auth request from GET /authorize is kept here, and only the
|
|
6
|
+
* opaque `stateId` travels through the browser (approval form, SAML
|
|
7
|
+
* targetURLPath, /callback, /store-token). Each record is bound to the browser
|
|
8
|
+
* that started the flow via an HttpOnly cookie, so a state ID minted by one
|
|
9
|
+
* browser cannot be completed from another.
|
|
10
|
+
*/
|
|
11
|
+
/** Long enough for SAML + MFA, or logging in to a free trial in another tab. */
|
|
12
|
+
export declare const AUTH_STATE_TTL_SECONDS: number;
|
|
13
|
+
export declare const BROWSER_BINDING_COOKIE = "__Host-ts_mcp_oauth_binding";
|
|
14
|
+
/**
|
|
15
|
+
* Local-development fallback for plain-HTTP hosts other than localhost (e.g. a
|
|
16
|
+
* hosts-file alias), where browsers drop `Secure` / `__Host-` cookies.
|
|
17
|
+
*/
|
|
18
|
+
export declare const DEV_BROWSER_BINDING_COOKIE = "ts_mcp_oauth_binding";
|
|
19
|
+
/** Shown for every state failure so callers can't tell missing, expired and mismatched apart. */
|
|
20
|
+
export declare const INVALID_AUTH_STATE_MESSAGE = "This sign-in link has expired or was opened in a different browser. Restart the connection from your MCP client.";
|
|
21
|
+
export interface AuthStateRecord {
|
|
22
|
+
oauthReqInfo: AuthRequest;
|
|
23
|
+
instanceUrl?: string;
|
|
24
|
+
bindingHash: string;
|
|
25
|
+
expiresAt: number;
|
|
26
|
+
}
|
|
27
|
+
export interface BrowserBinding {
|
|
28
|
+
bindingId: string;
|
|
29
|
+
setCookieHeader: string;
|
|
30
|
+
}
|
|
31
|
+
export interface BindingCookieOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Local development only: on plain-HTTP requests, use a cookie without
|
|
34
|
+
* `Secure` / `__Host-`. HTTPS requests always get the secure cookie.
|
|
35
|
+
*/
|
|
36
|
+
allowInsecureDevCookie?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reuses the browser's existing binding cookie, or creates one. Reusing it lets
|
|
40
|
+
* several OAuth flows run in the same browser without overwriting each other.
|
|
41
|
+
* The cookie is always re-issued so its lifetime covers the newest flow.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getOrCreateBrowserBinding(request: Request, options?: BindingCookieOptions): BrowserBinding;
|
|
44
|
+
export declare function createAuthState(kv: KVNamespace, oauthReqInfo: AuthRequest, bindingId: string): Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Loads a state record and checks it belongs to the calling browser. Throws a
|
|
47
|
+
* generic 403 when the state is missing, expired, or bound to another browser.
|
|
48
|
+
*/
|
|
49
|
+
export declare function loadAuthState(kv: KVNamespace, stateId: string | null | undefined, request: Request, options?: BindingCookieOptions): Promise<AuthStateRecord>;
|
|
50
|
+
export declare function setAuthStateInstanceUrl(kv: KVNamespace, stateId: string, record: AuthStateRecord, instanceUrl: string): Promise<AuthStateRecord>;
|
|
51
|
+
/** Deletes the record so the state cannot be used to mint a second grant. */
|
|
52
|
+
export declare function consumeAuthState(kv: KVNamespace, stateId: string): Promise<void>;
|
|
53
|
+
//# sourceMappingURL=auth-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-state.d.ts","sourceRoot":"","sources":["../src/auth-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAItE;;;;;;;;GAQG;AAEH,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,QAAU,CAAC;AAE9C,eAAO,MAAM,sBAAsB,gCAAgC,CAAC;AACpE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AAEjE,iGAAiG;AACjG,eAAO,MAAM,0BAA0B,qHAC4E,CAAC;AAEpH,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACjC;AAuDD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,oBAAyB,GAChC,cAAc,CA4BhB;AAED,wBAAsB,eAAe,CACpC,EAAE,EAAE,WAAW,EACf,YAAY,EAAE,WAAW,EACzB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAClC,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED,wBAAsB,uBAAuB,CAC5C,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAQ1B;AAED,6EAA6E;AAC7E,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { parse, serialize } from "hono/utils/cookie";
|
|
3
|
+
import { McpServerError } from "./errors";
|
|
4
|
+
/**
|
|
5
|
+
* Server-side record of an in-flight OAuth authorization.
|
|
6
|
+
*
|
|
7
|
+
* The validated auth request from GET /authorize is kept here, and only the
|
|
8
|
+
* opaque `stateId` travels through the browser (approval form, SAML
|
|
9
|
+
* targetURLPath, /callback, /store-token). Each record is bound to the browser
|
|
10
|
+
* that started the flow via an HttpOnly cookie, so a state ID minted by one
|
|
11
|
+
* browser cannot be completed from another.
|
|
12
|
+
*/
|
|
13
|
+
/** Long enough for SAML + MFA, or logging in to a free trial in another tab. */
|
|
14
|
+
export const AUTH_STATE_TTL_SECONDS = 15 * 60;
|
|
15
|
+
const AUTH_STATE_KEY_PREFIX = "mcp_auth_state:";
|
|
16
|
+
export const BROWSER_BINDING_COOKIE = "__Host-ts_mcp_oauth_binding";
|
|
17
|
+
/**
|
|
18
|
+
* Local-development fallback for plain-HTTP hosts other than localhost (e.g. a
|
|
19
|
+
* hosts-file alias), where browsers drop `Secure` / `__Host-` cookies.
|
|
20
|
+
*/
|
|
21
|
+
export const DEV_BROWSER_BINDING_COOKIE = "ts_mcp_oauth_binding";
|
|
22
|
+
/** Shown for every state failure so callers can't tell missing, expired and mismatched apart. */
|
|
23
|
+
export const INVALID_AUTH_STATE_MESSAGE = "This sign-in link has expired or was opened in a different browser. Restart the connection from your MCP client.";
|
|
24
|
+
async function sha256Hex(input) {
|
|
25
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input));
|
|
26
|
+
return Array.from(new Uint8Array(digest))
|
|
27
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
28
|
+
.join("");
|
|
29
|
+
}
|
|
30
|
+
function usesInsecureDevCookie(request, options) {
|
|
31
|
+
return (options.allowInsecureDevCookie === true &&
|
|
32
|
+
new URL(request.url).protocol === "http:");
|
|
33
|
+
}
|
|
34
|
+
function bindingCookieName(request, options) {
|
|
35
|
+
return usesInsecureDevCookie(request, options)
|
|
36
|
+
? DEV_BROWSER_BINDING_COOKIE
|
|
37
|
+
: BROWSER_BINDING_COOKIE;
|
|
38
|
+
}
|
|
39
|
+
function readBindingCookie(request, options) {
|
|
40
|
+
const cookieHeader = request.headers.get("Cookie");
|
|
41
|
+
if (!cookieHeader)
|
|
42
|
+
return undefined;
|
|
43
|
+
const name = bindingCookieName(request, options);
|
|
44
|
+
return parse(cookieHeader, name)[name];
|
|
45
|
+
}
|
|
46
|
+
function stateKey(stateId) {
|
|
47
|
+
return `${AUTH_STATE_KEY_PREFIX}${stateId}`;
|
|
48
|
+
}
|
|
49
|
+
function invalidAuthState() {
|
|
50
|
+
return new McpServerError({
|
|
51
|
+
message: "Invalid OAuth state",
|
|
52
|
+
userMessage: INVALID_AUTH_STATE_MESSAGE,
|
|
53
|
+
}, 403);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Reuses the browser's existing binding cookie, or creates one. Reusing it lets
|
|
57
|
+
* several OAuth flows run in the same browser without overwriting each other.
|
|
58
|
+
* The cookie is always re-issued so its lifetime covers the newest flow.
|
|
59
|
+
*/
|
|
60
|
+
export function getOrCreateBrowserBinding(request, options = {}) {
|
|
61
|
+
const bindingId = readBindingCookie(request, options) ?? crypto.randomUUID();
|
|
62
|
+
// Lax, not Strict: /callback is reached by a cross-site top-level redirect
|
|
63
|
+
// from ThoughtSpot / the IdP and must still carry the cookie.
|
|
64
|
+
if (usesInsecureDevCookie(request, options)) {
|
|
65
|
+
console.warn("OAuth binding cookie issued without Secure: insecure dev cookies are enabled for this HTTP request. Never enable this in production.");
|
|
66
|
+
return {
|
|
67
|
+
bindingId,
|
|
68
|
+
setCookieHeader: serialize(DEV_BROWSER_BINDING_COOKIE, bindingId, {
|
|
69
|
+
path: "/",
|
|
70
|
+
httpOnly: true,
|
|
71
|
+
sameSite: "Lax",
|
|
72
|
+
maxAge: AUTH_STATE_TTL_SECONDS,
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
bindingId,
|
|
78
|
+
setCookieHeader: serialize(BROWSER_BINDING_COOKIE, bindingId, {
|
|
79
|
+
path: "/",
|
|
80
|
+
secure: true,
|
|
81
|
+
httpOnly: true,
|
|
82
|
+
sameSite: "Lax",
|
|
83
|
+
maxAge: AUTH_STATE_TTL_SECONDS,
|
|
84
|
+
}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export async function createAuthState(kv, oauthReqInfo, bindingId) {
|
|
88
|
+
const stateId = crypto.randomUUID();
|
|
89
|
+
const record = {
|
|
90
|
+
oauthReqInfo,
|
|
91
|
+
bindingHash: await sha256Hex(bindingId),
|
|
92
|
+
expiresAt: Date.now() + AUTH_STATE_TTL_SECONDS * 1000,
|
|
93
|
+
};
|
|
94
|
+
await kv.put(stateKey(stateId), JSON.stringify(record), {
|
|
95
|
+
expirationTtl: AUTH_STATE_TTL_SECONDS,
|
|
96
|
+
});
|
|
97
|
+
return stateId;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Loads a state record and checks it belongs to the calling browser. Throws a
|
|
101
|
+
* generic 403 when the state is missing, expired, or bound to another browser.
|
|
102
|
+
*/
|
|
103
|
+
export async function loadAuthState(kv, stateId, request, options = {}) {
|
|
104
|
+
const bindingId = readBindingCookie(request, options);
|
|
105
|
+
if (!stateId || !bindingId) {
|
|
106
|
+
throw invalidAuthState();
|
|
107
|
+
}
|
|
108
|
+
const raw = await kv.get(stateKey(stateId));
|
|
109
|
+
if (!raw) {
|
|
110
|
+
throw invalidAuthState();
|
|
111
|
+
}
|
|
112
|
+
let record;
|
|
113
|
+
try {
|
|
114
|
+
record = JSON.parse(raw);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error("Corrupt OAuth state record:", error);
|
|
118
|
+
throw invalidAuthState();
|
|
119
|
+
}
|
|
120
|
+
if (Date.now() > record.expiresAt) {
|
|
121
|
+
throw invalidAuthState();
|
|
122
|
+
}
|
|
123
|
+
const expected = new TextEncoder().encode(record.bindingHash);
|
|
124
|
+
const actual = new TextEncoder().encode(await sha256Hex(bindingId));
|
|
125
|
+
if (expected.length !== actual.length || !timingSafeEqual(expected, actual)) {
|
|
126
|
+
throw invalidAuthState();
|
|
127
|
+
}
|
|
128
|
+
return record;
|
|
129
|
+
}
|
|
130
|
+
export async function setAuthStateInstanceUrl(kv, stateId, record, instanceUrl) {
|
|
131
|
+
const updated = { ...record, instanceUrl };
|
|
132
|
+
// expiresAt is unchanged, so the logical lifetime does not extend; the KV TTL
|
|
133
|
+
// only governs cleanup.
|
|
134
|
+
await kv.put(stateKey(stateId), JSON.stringify(updated), {
|
|
135
|
+
expirationTtl: AUTH_STATE_TTL_SECONDS,
|
|
136
|
+
});
|
|
137
|
+
return updated;
|
|
138
|
+
}
|
|
139
|
+
/** Deletes the record so the state cannot be used to mint a second grant. */
|
|
140
|
+
export async function consumeAuthState(kv, stateId) {
|
|
141
|
+
await kv.delete(stateKey(stateId));
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=auth-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-state.js","sourceRoot":"","sources":["../src/auth-state.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers.d.ts
CHANGED
|
@@ -4,7 +4,14 @@ import type { AssetsFetcher, AuthHooks, BaseProps, ServerInfo } from "./types";
|
|
|
4
4
|
export interface AuthAppEnv {
|
|
5
5
|
Bindings: {
|
|
6
6
|
OAUTH_PROVIDER: OAuthHelpers;
|
|
7
|
+
/** Same KV namespace the OAuth provider uses; also holds in-flight auth state. */
|
|
8
|
+
OAUTH_KV: KVNamespace;
|
|
7
9
|
ASSETS?: AssetsFetcher;
|
|
10
|
+
/**
|
|
11
|
+
* Local development only (e.g. in `.dev.vars`): "true" lets plain-HTTP
|
|
12
|
+
* requests use a binding cookie without `Secure`. Never set in production.
|
|
13
|
+
*/
|
|
14
|
+
OAUTH_ALLOW_INSECURE_DEV_COOKIE?: string;
|
|
8
15
|
} & Record<string, unknown>;
|
|
9
16
|
}
|
|
10
17
|
export interface CreateAuthAppOptions {
|
package/dist/handlers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,YAAY,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqB5B,OAAO,KAAK,EACX,aAAa,EACb,SAAS,EAET,SAAS,EACT,UAAU,EACV,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE;QACT,cAAc,EAAE,YAAY,CAAC;QAC7B,kFAAkF;QAClF,QAAQ,EAAE,WAAW,CAAC;QACtB,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB;;;WAGG;QACH,+BAA+B,CAAC,EAAE,MAAM,CAAC;KACzC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5B;AA2DD,MAAM,WAAW,oBAAoB;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CAC9C;AAyBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC,UAAU,CAAC,CAoc7E"}
|
package/dist/handlers.js
CHANGED
|
@@ -1,9 +1,52 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import {
|
|
2
|
+
import { consumeAuthState, createAuthState, getOrCreateBrowserBinding, loadAuthState, setAuthStateInstanceUrl, } from "./auth-state";
|
|
3
3
|
import { McpServerError } from "./errors";
|
|
4
|
-
import { buildSamlRedirectUrl, isValidRedirectUri, MAX_CLIENT_REDIRECT_URIS, parseRedirectApproval, renderApprovalDialog, verifyClientSecret, } from "./oauth-utils";
|
|
4
|
+
import { buildCallbackUrl, buildSamlRedirectUrl, isValidRedirectUri, MAX_CLIENT_REDIRECT_URIS, parseRedirectApproval, renderApprovalDialog, verifyClientSecret, } from "./oauth-utils";
|
|
5
5
|
import { renderTokenCallback } from "./token-utils";
|
|
6
6
|
import { PUBLIC_ROUTES } from "./routes";
|
|
7
|
+
function bindingCookieOptions(env) {
|
|
8
|
+
return {
|
|
9
|
+
allowInsecureDevCookie: env.OAUTH_ALLOW_INSECURE_DEV_COOKIE === "true",
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Workaround for https://thoughtspot.atlassian.net/browse/SCAL-258056 */
|
|
13
|
+
const SAML_TARGET_PATH_SUFFIX = "/10023.html";
|
|
14
|
+
const FREE_TRIAL_INSTANCE_PATTERN = /^https:\/\/(?:team|my)\d+\.thoughtspot\.cloud\/?$/;
|
|
15
|
+
const NO_STORE_HEADERS = { "Cache-Control": "no-store" };
|
|
16
|
+
/**
|
|
17
|
+
* Re-checks a stored auth request against its client before minting a grant.
|
|
18
|
+
* completeAuthorization() does not repeat parseAuthRequest()'s checks, so this
|
|
19
|
+
* guards against a record that was never validated (or a library change).
|
|
20
|
+
*/
|
|
21
|
+
function assertGrantableAuthRequest(oauthReqInfo, client) {
|
|
22
|
+
if (!client ||
|
|
23
|
+
oauthReqInfo.responseType !== "code" ||
|
|
24
|
+
oauthReqInfo.codeChallengeMethod !== "S256" ||
|
|
25
|
+
!oauthReqInfo.codeChallenge ||
|
|
26
|
+
!client.redirectUris.includes(oauthReqInfo.redirectUri)) {
|
|
27
|
+
throw new McpServerError({ message: "Invalid OAuth request" }, 400);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Responds with McpServerError's safe user message, or a generic 500. */
|
|
31
|
+
function authErrorResponse(error) {
|
|
32
|
+
if (error instanceof McpServerError && error.statusCode < 500) {
|
|
33
|
+
return new Response(error.getUserMessage(), {
|
|
34
|
+
status: error.statusCode,
|
|
35
|
+
headers: {
|
|
36
|
+
"Content-Type": "text/plain; charset=utf-8",
|
|
37
|
+
...NO_STORE_HEADERS,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
console.error("OAuth flow error:", error);
|
|
42
|
+
return new Response("Internal server error", {
|
|
43
|
+
status: 500,
|
|
44
|
+
headers: {
|
|
45
|
+
"Content-Type": "text/plain; charset=utf-8",
|
|
46
|
+
...NO_STORE_HEADERS,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
7
50
|
function recordAuthMetric(hooks, name, status, c) {
|
|
8
51
|
if (!hooks?.onAuthMetric)
|
|
9
52
|
return;
|
|
@@ -23,12 +66,15 @@ export function createAuthApp(options) {
|
|
|
23
66
|
const { serverInfo, hooks, assetsFetcher, extraRoutes } = options;
|
|
24
67
|
const app = new Hono();
|
|
25
68
|
const handler = {
|
|
26
|
-
async getAuthorize(request, oauthProvider) {
|
|
69
|
+
async getAuthorize(request, oauthProvider, kv, cookieOptions) {
|
|
27
70
|
const oauthReqInfo = await oauthProvider.parseAuthRequest(request);
|
|
28
71
|
const { clientId } = oauthReqInfo;
|
|
29
72
|
if (!clientId) {
|
|
30
73
|
throw new McpServerError({ message: "Missing client ID" }, 400);
|
|
31
74
|
}
|
|
75
|
+
if (oauthReqInfo.responseType !== "code") {
|
|
76
|
+
throw new McpServerError({ message: "Unsupported response type: only 'code' is allowed" }, 400);
|
|
77
|
+
}
|
|
32
78
|
if (!oauthReqInfo.codeChallenge) {
|
|
33
79
|
throw new McpServerError({ message: "PKCE is required: missing code challenge" }, 400);
|
|
34
80
|
}
|
|
@@ -36,31 +82,33 @@ export function createAuthApp(options) {
|
|
|
36
82
|
throw new McpServerError({ message: "PKCE code challenge method must be S256" }, 400);
|
|
37
83
|
}
|
|
38
84
|
const client = await oauthProvider.lookupClient(clientId);
|
|
39
|
-
|
|
85
|
+
// Keep the validated request server-side; only the opaque state ID and
|
|
86
|
+
// a browser-binding cookie go to the browser.
|
|
87
|
+
const { bindingId, setCookieHeader } = getOrCreateBrowserBinding(request, cookieOptions);
|
|
88
|
+
const stateId = await createAuthState(kv, oauthReqInfo, bindingId);
|
|
89
|
+
const response = renderApprovalDialog(request, {
|
|
40
90
|
client,
|
|
41
91
|
serverInfo,
|
|
42
|
-
|
|
92
|
+
stateId,
|
|
43
93
|
});
|
|
94
|
+
response.headers.append("Set-Cookie", setCookieHeader);
|
|
95
|
+
response.headers.set("Cache-Control", "no-store");
|
|
96
|
+
return response;
|
|
44
97
|
},
|
|
45
|
-
async postAuthorize(request, requestUrl) {
|
|
98
|
+
async postAuthorize(request, requestUrl, kv, cookieOptions) {
|
|
46
99
|
try {
|
|
47
|
-
const {
|
|
48
|
-
if (!state.oauthReqInfo) {
|
|
49
|
-
throw new McpServerError({ message: "Missing OAuth request info" }, 400);
|
|
50
|
-
}
|
|
100
|
+
const { stateId, instanceUrl } = await parseRedirectApproval(request);
|
|
51
101
|
if (!instanceUrl) {
|
|
52
102
|
throw new McpServerError({ message: "Missing instance URL" }, 400);
|
|
53
103
|
}
|
|
104
|
+
const record = await loadAuthState(kv, stateId, request, cookieOptions);
|
|
105
|
+
await setAuthStateInstanceUrl(kv, stateId, record, instanceUrl);
|
|
54
106
|
const origin = new URL(requestUrl).origin;
|
|
55
107
|
// Free-trial shortcut: skip SAML, assume logged in.
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
callbackUrl.searchParams.set("instanceUrl", instanceUrl);
|
|
59
|
-
callbackUrl.searchParams.set("oauthReqInfo", encodeBase64Url(new TextEncoder().encode(JSON.stringify(state.oauthReqInfo))
|
|
60
|
-
.buffer));
|
|
61
|
-
return callbackUrl.toString();
|
|
108
|
+
if (FREE_TRIAL_INSTANCE_PATTERN.test(instanceUrl)) {
|
|
109
|
+
return buildCallbackUrl(stateId, origin);
|
|
62
110
|
}
|
|
63
|
-
return buildSamlRedirectUrl(instanceUrl,
|
|
111
|
+
return buildSamlRedirectUrl(instanceUrl, stateId, origin);
|
|
64
112
|
}
|
|
65
113
|
catch (error) {
|
|
66
114
|
if (error instanceof McpServerError)
|
|
@@ -68,62 +116,58 @@ export function createAuthApp(options) {
|
|
|
68
116
|
throw new McpServerError(error, 500);
|
|
69
117
|
}
|
|
70
118
|
},
|
|
71
|
-
async handleCallback(request, assets, requestUrl) {
|
|
119
|
+
async handleCallback(request, assets, requestUrl, kv, cookieOptions) {
|
|
72
120
|
const url = new URL(request.url);
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
121
|
+
const stateId = url.searchParams
|
|
122
|
+
.get("state")
|
|
123
|
+
?.replace(SAML_TARGET_PATH_SUFFIX, "");
|
|
124
|
+
// Any instanceUrl / oauthReqInfo in the query is ignored: both come
|
|
125
|
+
// from the server-side record. The state is not consumed here so the
|
|
126
|
+
// page can be reloaded (free-trial login, manual token paste).
|
|
127
|
+
const record = await loadAuthState(kv, stateId, request, cookieOptions);
|
|
128
|
+
if (!stateId || !record.instanceUrl) {
|
|
79
129
|
throw new McpServerError({ message: "Missing instance URL" }, 400);
|
|
80
130
|
}
|
|
81
|
-
if (!encodedOauthReqInfo) {
|
|
82
|
-
throw new McpServerError({ message: "Missing OAuth request info" }, 400);
|
|
83
|
-
}
|
|
84
|
-
let decodedOAuthReqInfo;
|
|
85
|
-
try {
|
|
86
|
-
decodedOAuthReqInfo = JSON.parse(new TextDecoder().decode(decodeBase64Url(encodedOauthReqInfo)));
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
throw new McpServerError({ message: "Invalid OAuth request info format", details: error }, 400);
|
|
90
|
-
}
|
|
91
131
|
const origin = new URL(requestUrl).origin;
|
|
92
132
|
try {
|
|
93
|
-
return await renderTokenCallback(
|
|
133
|
+
return await renderTokenCallback({ state: stateId, instanceUrl: record.instanceUrl }, assets, origin);
|
|
94
134
|
}
|
|
95
135
|
catch (error) {
|
|
96
136
|
throw new McpServerError({ message: "Error rendering token callback", details: error }, 500);
|
|
97
137
|
}
|
|
98
138
|
},
|
|
99
|
-
async storeToken(request, oauthProvider) {
|
|
139
|
+
async storeToken(request, oauthProvider, kv, cookieOptions) {
|
|
100
140
|
// biome-ignore lint/suspicious/noExplicitAny: payload shape is consumer-defined
|
|
101
141
|
let token;
|
|
102
|
-
|
|
103
|
-
let oauthReqInfo;
|
|
104
|
-
let instanceUrl;
|
|
142
|
+
let stateId;
|
|
105
143
|
try {
|
|
106
144
|
// biome-ignore lint/suspicious/noExplicitAny: free-form body
|
|
107
145
|
const body = (await request.json());
|
|
108
|
-
token = body
|
|
109
|
-
|
|
110
|
-
instanceUrl = body.instanceUrl;
|
|
146
|
+
token = body?.token;
|
|
147
|
+
stateId = body?.state;
|
|
111
148
|
}
|
|
112
149
|
catch (error) {
|
|
113
150
|
throw new McpServerError({ message: "Invalid JSON format", details: error }, 400);
|
|
114
151
|
}
|
|
115
|
-
if (
|
|
116
|
-
|
|
152
|
+
if (typeof token?.data?.token !== "string" ||
|
|
153
|
+
!token.data.token ||
|
|
154
|
+
typeof stateId !== "string" ||
|
|
155
|
+
!stateId) {
|
|
156
|
+
throw new McpServerError({ message: "Missing token or OAuth state" }, 400);
|
|
117
157
|
}
|
|
118
|
-
const
|
|
119
|
-
if (!
|
|
120
|
-
throw new McpServerError({ message: "Missing
|
|
158
|
+
const record = await loadAuthState(kv, stateId, request, cookieOptions);
|
|
159
|
+
if (!record.instanceUrl) {
|
|
160
|
+
throw new McpServerError({ message: "Missing instance URL" }, 400);
|
|
121
161
|
}
|
|
122
|
-
|
|
162
|
+
// Single use: delete before minting so a replay finds nothing.
|
|
163
|
+
await consumeAuthState(kv, stateId);
|
|
164
|
+
const { oauthReqInfo, instanceUrl } = record;
|
|
165
|
+
const client = await oauthProvider.lookupClient(oauthReqInfo.clientId);
|
|
166
|
+
assertGrantableAuthRequest(oauthReqInfo, client);
|
|
123
167
|
const baseProps = {
|
|
124
168
|
accessToken: token.data.token,
|
|
125
169
|
instanceUrl: instanceUrl,
|
|
126
|
-
clientName:
|
|
170
|
+
clientName: client,
|
|
127
171
|
};
|
|
128
172
|
// Let the consumer fold token-exchange-only fields (e.g. refresh token,
|
|
129
173
|
// expiry) into the grant, so they persist onto every later request.
|
|
@@ -205,7 +249,7 @@ export function createAuthApp(options) {
|
|
|
205
249
|
};
|
|
206
250
|
app.get(PUBLIC_ROUTES.authorize, async (c) => {
|
|
207
251
|
try {
|
|
208
|
-
const response = await wrap(hooks, "authorize-get", () => handler.getAuthorize(c.req.raw, c.env.OAUTH_PROVIDER));
|
|
252
|
+
const response = await wrap(hooks, "authorize-get", () => handler.getAuthorize(c.req.raw, c.env.OAUTH_PROVIDER, c.env.OAUTH_KV, bindingCookieOptions(c.env)));
|
|
209
253
|
recordAuthMetric(hooks, "oauth_authorize_requests_total", response.status, c);
|
|
210
254
|
return response;
|
|
211
255
|
}
|
|
@@ -217,7 +261,7 @@ export function createAuthApp(options) {
|
|
|
217
261
|
});
|
|
218
262
|
app.post(PUBLIC_ROUTES.authorize, async (c) => {
|
|
219
263
|
try {
|
|
220
|
-
const redirectUrl = await wrap(hooks, "authorize-post", () => handler.postAuthorize(c.req.raw, c.req.url));
|
|
264
|
+
const redirectUrl = await wrap(hooks, "authorize-post", () => handler.postAuthorize(c.req.raw, c.req.url, c.env.OAUTH_KV, bindingCookieOptions(c.env)));
|
|
221
265
|
const response = Response.redirect(redirectUrl);
|
|
222
266
|
recordAuthMetric(hooks, "oauth_authorize_submit_total", response.status, c);
|
|
223
267
|
return response;
|
|
@@ -229,9 +273,7 @@ export function createAuthApp(options) {
|
|
|
229
273
|
recordAuthMetric(hooks, "oauth_authorize_submit_total", response.status, c);
|
|
230
274
|
return response;
|
|
231
275
|
}
|
|
232
|
-
const response =
|
|
233
|
-
status: 500,
|
|
234
|
-
});
|
|
276
|
+
const response = authErrorResponse(error);
|
|
235
277
|
recordAuthMetric(hooks, "oauth_authorize_submit_total", response.status, c);
|
|
236
278
|
return response;
|
|
237
279
|
}
|
|
@@ -244,60 +286,31 @@ export function createAuthApp(options) {
|
|
|
244
286
|
return response;
|
|
245
287
|
}
|
|
246
288
|
try {
|
|
247
|
-
const htmlContent = await wrap(hooks, "oauth-callback", () => handler.handleCallback(c.req.raw, assets, c.req.url));
|
|
289
|
+
const htmlContent = await wrap(hooks, "oauth-callback", () => handler.handleCallback(c.req.raw, assets, c.req.url, c.env.OAUTH_KV, bindingCookieOptions(c.env)));
|
|
248
290
|
const response = new Response(htmlContent, {
|
|
249
|
-
headers: { "Content-Type": "text/html" },
|
|
291
|
+
headers: { "Content-Type": "text/html", ...NO_STORE_HEADERS },
|
|
250
292
|
});
|
|
251
293
|
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
252
294
|
return response;
|
|
253
295
|
}
|
|
254
296
|
catch (error) {
|
|
255
|
-
|
|
256
|
-
if (error.message.includes("Missing instance URL")) {
|
|
257
|
-
const response = c.text(`Missing instance URL ${error}`, 400);
|
|
258
|
-
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
259
|
-
return response;
|
|
260
|
-
}
|
|
261
|
-
if (error.message.includes("Missing OAuth request info")) {
|
|
262
|
-
const response = c.text(`Missing OAuth request info ${error}`, 400);
|
|
263
|
-
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
264
|
-
return response;
|
|
265
|
-
}
|
|
266
|
-
if (error.message.includes("Invalid OAuth request info format")) {
|
|
267
|
-
const response = c.text(`Invalid OAuth request info format ${error}`, 400);
|
|
268
|
-
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
269
|
-
return response;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
const response = c.text(`Internal server error ${error}`, 500);
|
|
297
|
+
const response = authErrorResponse(error);
|
|
273
298
|
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
274
299
|
return response;
|
|
275
300
|
}
|
|
276
301
|
});
|
|
277
302
|
app.post(PUBLIC_ROUTES.storeToken, async (c) => {
|
|
278
303
|
try {
|
|
279
|
-
const result = await wrap(hooks, "store-token", () => handler.storeToken(c.req.raw, c.env.OAUTH_PROVIDER));
|
|
304
|
+
const result = await wrap(hooks, "store-token", () => handler.storeToken(c.req.raw, c.env.OAUTH_PROVIDER, c.env.OAUTH_KV, bindingCookieOptions(c.env)));
|
|
280
305
|
const response = new Response(JSON.stringify(result), {
|
|
281
306
|
status: 200,
|
|
282
|
-
headers: { "Content-Type": "application/json" },
|
|
307
|
+
headers: { "Content-Type": "application/json", ...NO_STORE_HEADERS },
|
|
283
308
|
});
|
|
284
309
|
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
285
310
|
return response;
|
|
286
311
|
}
|
|
287
312
|
catch (error) {
|
|
288
|
-
|
|
289
|
-
if (error.message.includes("Invalid JSON format")) {
|
|
290
|
-
const response = c.text(`Invalid JSON format ${error}`, 400);
|
|
291
|
-
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
292
|
-
return response;
|
|
293
|
-
}
|
|
294
|
-
if (error.message.includes("Missing token or OAuth request info or instanceUrl")) {
|
|
295
|
-
const response = c.text(`Missing token or OAuth request info or instanceUrl ${error}`, 400);
|
|
296
|
-
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
297
|
-
return response;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
const response = c.text(`Internal server error ${error}`, 500);
|
|
313
|
+
const response = authErrorResponse(error);
|
|
301
314
|
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
302
315
|
return response;
|
|
303
316
|
}
|
package/dist/handlers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { PUBLIC_ROUTES, PUBLIC_ROUTE_PREFIXES, type PublicRoutes, type PublicRoutePrefixes, } from "./routes";
|
|
2
2
|
export { McpServerError } from "./errors";
|
|
3
3
|
export type { BaseProps, ServerInfo, AuthHooks, AuthMetricName, BearerAuthRouteGroup, AssetsFetcher, } from "./types";
|
|
4
|
-
export { renderApprovalDialog, parseRedirectApproval, buildSamlRedirectUrl, validateAndSanitizeUrl, isValidRedirectUri, MAX_CLIENT_REDIRECT_URIS, type ApprovalDialogOptions, type ParsedApprovalResult, } from "./oauth-utils";
|
|
5
|
-
export { renderTokenCallback } from "./token-utils";
|
|
4
|
+
export { renderApprovalDialog, parseRedirectApproval, buildSamlRedirectUrl, buildCallbackUrl, validateAndSanitizeUrl, isValidRedirectUri, MAX_CLIENT_REDIRECT_URIS, type ApprovalDialogOptions, type ParsedApprovalResult, } from "./oauth-utils";
|
|
5
|
+
export { renderTokenCallback, type TokenCallbackFlow } from "./token-utils";
|
|
6
6
|
export { createAuthApp, type CreateAuthAppOptions, type AuthAppEnv, } from "./handlers";
|
|
7
7
|
export { withBearerHandler, type WithBearerHandlerOptions, type BearerMCPServer, } from "./bearer";
|
|
8
8
|
export { createOAuthHandler, type CreateOAuthHandlerOptions, type MCPServerForOAuth, } from "./oauth-provider";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EACX,SAAS,EACT,UAAU,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EACX,SAAS,EACT,UAAU,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,UAAU,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,GACtB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { PUBLIC_ROUTES, PUBLIC_ROUTE_PREFIXES, } from "./routes";
|
|
2
2
|
export { McpServerError } from "./errors";
|
|
3
|
-
export { renderApprovalDialog, parseRedirectApproval, buildSamlRedirectUrl, validateAndSanitizeUrl, isValidRedirectUri, MAX_CLIENT_REDIRECT_URIS, } from "./oauth-utils";
|
|
3
|
+
export { renderApprovalDialog, parseRedirectApproval, buildSamlRedirectUrl, buildCallbackUrl, validateAndSanitizeUrl, isValidRedirectUri, MAX_CLIENT_REDIRECT_URIS, } from "./oauth-utils";
|
|
4
4
|
export { renderTokenCallback } from "./token-utils";
|
|
5
5
|
export { createAuthApp, } from "./handlers";
|
|
6
6
|
export { withBearerHandler, } from "./bearer";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,qBAAqB,GAGrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C,OAAO,EACN,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,GAGxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,qBAAqB,GAGrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C,OAAO,EACN,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,GAGxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAA0B,MAAM,eAAe,CAAC;AAC5E,OAAO,EACN,aAAa,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,iBAAiB,GAGjB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,GAGlB,MAAM,kBAAkB,CAAC"}
|
package/dist/oauth-utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ClientInfo } from "@cloudflare/workers-oauth-provider";
|
|
2
2
|
import type { ServerInfo } from "./types";
|
|
3
3
|
/**
|
|
4
4
|
* Maximum number of redirect URIs a single client may accumulate. Bounds the
|
|
@@ -8,13 +8,12 @@ export declare const MAX_CLIENT_REDIRECT_URIS = 10;
|
|
|
8
8
|
export interface ApprovalDialogOptions {
|
|
9
9
|
client: ClientInfo | null;
|
|
10
10
|
serverInfo: ServerInfo;
|
|
11
|
-
state
|
|
11
|
+
/** Opaque ID of the server-side auth state record (see auth-state.ts). */
|
|
12
|
+
stateId: string;
|
|
12
13
|
}
|
|
13
14
|
export declare function renderApprovalDialog(request: Request, options: ApprovalDialogOptions): Response;
|
|
14
15
|
export interface ParsedApprovalResult {
|
|
15
|
-
|
|
16
|
-
oauthReqInfo?: AuthRequest;
|
|
17
|
-
} & Record<string, unknown>;
|
|
16
|
+
stateId: string;
|
|
18
17
|
instanceUrl: string;
|
|
19
18
|
}
|
|
20
19
|
export declare function validateAndSanitizeUrl(url: string): string;
|
|
@@ -36,5 +35,10 @@ export declare function isValidRedirectUri(uri: string): boolean;
|
|
|
36
35
|
declare function verifyClientSecret(candidate: string, storedHash: string | null | undefined): Promise<boolean>;
|
|
37
36
|
export { verifyClientSecret };
|
|
38
37
|
export declare function parseRedirectApproval(request: Request): Promise<ParsedApprovalResult>;
|
|
39
|
-
|
|
38
|
+
/**
|
|
39
|
+
* The /callback URL carries only the opaque state ID; the instance URL and
|
|
40
|
+
* auth request are looked up server-side.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildCallbackUrl(stateId: string, callbackOrigin: string): string;
|
|
43
|
+
export declare function buildSamlRedirectUrl(instanceUrl: string, stateId: string, callbackOrigin: string): string;
|
|
40
44
|
//# sourceMappingURL=oauth-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-utils.d.ts","sourceRoot":"","sources":["../src/oauth-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"oauth-utils.d.ts","sourceRoot":"","sources":["../src/oauth-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAmB3C,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,qBAAqB,GAC5B,QAAQ,CAqNV;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAuB1D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiBvD;AAeD;;;;;GAKG;AACH,iBAAe,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,oBAAoB,CAAC,CA8B/B;AAWD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACpB,MAAM,CAIR;AAED,wBAAgB,oBAAoB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACpB,MAAM,CAOR"}
|
package/dist/oauth-utils.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { timingSafeEqual } from "node:crypto";
|
|
2
|
-
import { encodeBase64Url } from "hono/utils/encode";
|
|
3
2
|
/**
|
|
4
3
|
* Maximum number of redirect URIs a single client may accumulate. Bounds the
|
|
5
4
|
* growth of an individual client's `redirectUris` list.
|
|
@@ -17,8 +16,8 @@ const DEFAULT_TERMS_URL = "https://www.thoughtspot.com/legal/thoughtspot-for-app
|
|
|
17
16
|
const DEFAULT_PRIVACY_URL = "https://www.thoughtspot.com/privacy-statement";
|
|
18
17
|
const DEFAULT_SIGNUP_URL = "https://www.thoughtspot.com/trial?utm_source=mcp&utm_medium=consent&tsref=MCP";
|
|
19
18
|
export function renderApprovalDialog(request, options) {
|
|
20
|
-
const { serverInfo,
|
|
21
|
-
const encodedState =
|
|
19
|
+
const { serverInfo, stateId, client } = options;
|
|
20
|
+
const encodedState = sanitizeHtml(stateId);
|
|
22
21
|
const serverName = sanitizeHtml(serverInfo.name);
|
|
23
22
|
const mcpLogoUrl = serverInfo.mcpLogoUrl ?? DEFAULT_MCP_LOGO_URL;
|
|
24
23
|
const instanceLogoUrl = serverInfo.instanceLogoUrl ?? DEFAULT_INSTANCE_LOGO_URL;
|
|
@@ -226,16 +225,6 @@ export function renderApprovalDialog(request, options) {
|
|
|
226
225
|
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
227
226
|
});
|
|
228
227
|
}
|
|
229
|
-
function decodeState(encodedState) {
|
|
230
|
-
try {
|
|
231
|
-
const decoded = atob(encodedState);
|
|
232
|
-
return JSON.parse(decoded);
|
|
233
|
-
}
|
|
234
|
-
catch (e) {
|
|
235
|
-
console.error("Error decoding state:", e);
|
|
236
|
-
throw new Error("Invalid state format");
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
228
|
export function validateAndSanitizeUrl(url) {
|
|
240
229
|
try {
|
|
241
230
|
const trimmedUrl = url.trim();
|
|
@@ -319,21 +308,16 @@ export async function parseRedirectApproval(request) {
|
|
|
319
308
|
if (request.method !== "POST") {
|
|
320
309
|
throw new Error("Invalid request method. Expected POST.");
|
|
321
310
|
}
|
|
322
|
-
let
|
|
323
|
-
let clientId;
|
|
311
|
+
let stateId;
|
|
324
312
|
let instanceUrl;
|
|
325
313
|
try {
|
|
326
314
|
const formData = await request.formData();
|
|
327
|
-
const
|
|
315
|
+
const rawStateId = formData.get("state");
|
|
328
316
|
const rawInstanceUrl = formData.get("instanceUrl");
|
|
329
|
-
if (typeof
|
|
317
|
+
if (typeof rawStateId !== "string" || !rawStateId) {
|
|
330
318
|
throw new Error("Missing or invalid 'state' in form data.");
|
|
331
319
|
}
|
|
332
|
-
|
|
333
|
-
clientId = state?.oauthReqInfo?.clientId;
|
|
334
|
-
if (!clientId) {
|
|
335
|
-
throw new Error("Could not extract clientId from state object.");
|
|
336
|
-
}
|
|
320
|
+
stateId = rawStateId;
|
|
337
321
|
if (!rawInstanceUrl) {
|
|
338
322
|
throw new Error("Missing instance URL");
|
|
339
323
|
}
|
|
@@ -343,7 +327,7 @@ export async function parseRedirectApproval(request) {
|
|
|
343
327
|
console.error("Error processing form submission:", e);
|
|
344
328
|
throw new Error(`Failed to parse approval form: ${e instanceof Error ? e.message : String(e)}`);
|
|
345
329
|
}
|
|
346
|
-
return {
|
|
330
|
+
return { stateId, instanceUrl };
|
|
347
331
|
}
|
|
348
332
|
function sanitizeHtml(unsafe) {
|
|
349
333
|
return unsafe
|
|
@@ -353,14 +337,18 @@ function sanitizeHtml(unsafe) {
|
|
|
353
337
|
.replace(/"/g, """)
|
|
354
338
|
.replace(/'/g, "'");
|
|
355
339
|
}
|
|
356
|
-
|
|
340
|
+
/**
|
|
341
|
+
* The /callback URL carries only the opaque state ID; the instance URL and
|
|
342
|
+
* auth request are looked up server-side.
|
|
343
|
+
*/
|
|
344
|
+
export function buildCallbackUrl(stateId, callbackOrigin) {
|
|
345
|
+
const callbackUrl = new URL("/callback", callbackOrigin);
|
|
346
|
+
callbackUrl.searchParams.set("state", stateId);
|
|
347
|
+
return callbackUrl.toString();
|
|
348
|
+
}
|
|
349
|
+
export function buildSamlRedirectUrl(instanceUrl, stateId, callbackOrigin) {
|
|
357
350
|
const redirectUrl = new URL("callosum/v1/saml/login", instanceUrl);
|
|
358
|
-
|
|
359
|
-
targetURLPath.searchParams.append("instanceUrl", instanceUrl);
|
|
360
|
-
const encodedState = encodeBase64Url(new TextEncoder().encode(JSON.stringify(oauthReqInfo))
|
|
361
|
-
.buffer);
|
|
362
|
-
targetURLPath.searchParams.append("oauthReqInfo", encodedState);
|
|
363
|
-
redirectUrl.searchParams.append("targetURLPath", targetURLPath.href);
|
|
351
|
+
redirectUrl.searchParams.append("targetURLPath", buildCallbackUrl(stateId, callbackOrigin));
|
|
364
352
|
return redirectUrl.toString();
|
|
365
353
|
}
|
|
366
354
|
//# sourceMappingURL=oauth-utils.js.map
|
package/dist/oauth-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-utils.js","sourceRoot":"","sources":["../src/oauth-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-utils.js","sourceRoot":"","sources":["../src/oauth-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEhD,MAAM,oBAAoB,GACzB,yGAAyG,CAAC;AAC3G,MAAM,yBAAyB,GAC9B,2DAA2D,CAAC;AAC7D,MAAM,iBAAiB,GACtB,wDAAwD,CAAC;AAC1D,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAC5E,MAAM,kBAAkB,GACvB,+EAA+E,CAAC;AASjF,MAAM,UAAU,oBAAoB,CACnC,OAAgB,EAChB,OAA8B;IAE9B,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAChD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,oBAAoB,CAAC;IACjE,MAAM,eAAe,GACpB,UAAU,CAAC,eAAe,IAAI,yBAAyB,CAAC;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAChE,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC7D,MAAM,aAAa,GAClB,UAAU,CAAC,aAAa;QACxB,GAAG,UAAU,+CAA+C,CAAC;IAE9D,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAC;IACpC,MAAM,kBAAkB,GAAG,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7E,MAAM,WAAW,GAAG;;;;;;mBAMF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAgGH,UAAU;;;;;;;;;;;0BAWV,eAAe;;0CAEC,aAAa;gEACS,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;;;gFAGb,aAAa;2DAClC,YAAY;;;6BAG1C,SAAS;;;+CAGS,UAAU;;;;;;;;;6BAS5B,QAAQ;iCACJ,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuDtC,CAAC;IACL,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE;QAChC,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;KACvD,CAAC,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,sBAAsB,CAAC,GAAW;IACjD,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,eAAe,GACpB,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;YACpE,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,WAAW,UAAU,EAAE,CAAC;QAE5B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;QAE3C,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACd,0CAA0C,SAAS,CAAC,QAAQ,EAAE,CAC9D,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC,MAAM,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvC,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC7C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;IAC3E,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAChC,SAAiB,EACjB,UAAqC;IAErC,MAAM,QAAQ,GACb,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QACtD,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,wBAAwB,CAAC;IAC7B,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEzD,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,yDAAyD;IACzD,IAAI,cAAc,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,OAAgB;IAEhB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAW,CAAC;QAE7D,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,UAAU,CAAC;QAErB,IAAI,CAAC,cAAc,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzC,CAAC;QAED,WAAW,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CACd,kCAAkC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC9E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IACnC,OAAO,MAAM;SACX,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC/B,OAAe,EACf,cAAsB;IAEtB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACzD,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,WAAmB,EACnB,OAAe,EACf,cAAsB;IAEtB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;IACnE,WAAW,CAAC,YAAY,CAAC,MAAM,CAC9B,eAAe,EACf,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CACzC,CAAC;IACF,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/token-utils.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import type { AssetsFetcher } from "./types";
|
|
2
|
-
|
|
2
|
+
/** Values the callback page needs; injected as JSON into `{{OAUTH_FLOW}}`. */
|
|
3
|
+
export interface TokenCallbackFlow {
|
|
4
|
+
/** Opaque auth state ID, posted back to /store-token. */
|
|
5
|
+
state: string;
|
|
6
|
+
/** ThoughtSpot instance to fetch the session token from. */
|
|
7
|
+
instanceUrl: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function renderTokenCallback(flow: TokenCallbackFlow, assets: AssetsFetcher, origin: string): Promise<string>;
|
|
3
10
|
//# sourceMappingURL=token-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,
|
|
1
|
+
{"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IACjC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;CACpB;AAgBD,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAuEjB"}
|
package/dist/token-utils.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* JSON.stringify output is not safe inside a <script> element: a "</script>"
|
|
3
|
+
* in any string would close it. Escape the characters that matter in HTML and
|
|
4
|
+
* the line separators that are invalid in pre-ES2019 JavaScript.
|
|
5
|
+
*/
|
|
6
|
+
function toScriptSafeJson(value) {
|
|
7
|
+
return JSON.stringify(value)
|
|
8
|
+
.replace(/</g, "\\u003c")
|
|
9
|
+
.replace(/>/g, "\\u003e")
|
|
10
|
+
.replace(/&/g, "\\u0026")
|
|
11
|
+
.replace(/\u2028/g, "\\u2028")
|
|
12
|
+
.replace(/\u2029/g, "\\u2029");
|
|
13
|
+
}
|
|
14
|
+
export async function renderTokenCallback(flow, assets, origin) {
|
|
15
|
+
const flowJson = toScriptSafeJson({
|
|
16
|
+
state: flow.state,
|
|
17
|
+
instanceUrl: flow.instanceUrl,
|
|
18
|
+
});
|
|
4
19
|
try {
|
|
5
20
|
const htmlResponse = await assets.fetch(`${origin}/oauth-callback.html`);
|
|
6
21
|
if (!htmlResponse.ok) {
|
|
@@ -17,9 +32,11 @@ export async function renderTokenCallback(instanceUrl, oauthReqInfo, assets, ori
|
|
|
17
32
|
throw new Error("Failed to load oauth-callback.js");
|
|
18
33
|
}
|
|
19
34
|
const js = await jsResponse.text();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
htmlContent = htmlContent.replace(
|
|
35
|
+
// Function replacers so "$&"-style sequences in the inserted text are not
|
|
36
|
+
// interpreted as replacement patterns.
|
|
37
|
+
htmlContent = htmlContent.replace("{{OAUTH_FLOW}}", () => flowJson);
|
|
38
|
+
htmlContent = htmlContent.replace('<link rel="stylesheet" href="oauth-callback.css">', () => `<style>${css}</style>`);
|
|
39
|
+
htmlContent = htmlContent.replace('<script src="oauth-callback.js"></script>', () => `<script>${js}</script>`);
|
|
23
40
|
return htmlContent;
|
|
24
41
|
}
|
|
25
42
|
catch (error) {
|
package/dist/token-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAc;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC1B,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,IAAuB,EACvB,MAAqB,EACrB,MAAc;IAEd,MAAM,QAAQ,GAAG,gBAAgB,CAAC;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,sBAAsB,CAAC,CAAC;QACzE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAE5C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAErC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,oBAAoB,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QAEnC,0EAA0E;QAC1E,uCAAuC;QACvC,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEpE,WAAW,GAAG,WAAW,CAAC,OAAO,CAChC,mDAAmD,EACnD,GAAG,EAAE,CAAC,UAAU,GAAG,UAAU,CAC7B,CAAC;QAEF,WAAW,GAAG,WAAW,CAAC,OAAO,CAChC,2CAA2C,EAC3C,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,CAC9B,CAAC;QAEF,OAAO,WAAW,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;4BAuBmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;;;;SAI3E,CAAC;IACT,CAAC;AACF,CAAC"}
|