@thoughtspot/mcp-auth 2.1.0 → 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 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).
@@ -58,7 +58,7 @@
58
58
  </div>
59
59
  </div>
60
60
  </div>
61
- <script type="application/json" id="oauth-req-info">{{OAUTH_REQ_INFO}}</script>
61
+ <script type="application/json" id="oauth-flow">{{OAUTH_FLOW}}</script>
62
62
  <script src="oauth-callback.js"></script>
63
63
  </body>
64
64
  </html>
@@ -1,7 +1,19 @@
1
1
  // Immediately invoke the async function
2
2
  (async () => {
3
- const oauthReqInfo = JSON.parse(document.getElementById('oauth-req-info').textContent);
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
- // Check if INSTANCE_URL is available and valid
13
- if (!window.INSTANCE_URL) {
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(window.INSTANCE_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
- oauthReqInfo: oauthReqInfo,
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
- const errorText = await storeResponse.text();
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
- oauthReqInfo: oauthReqInfo,
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
- const errorText = await storeResponse.text();
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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"}
@@ -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 {
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAa5B,OAAO,KAAK,EACX,aAAa,EACb,SAAS,EAET,SAAS,EACT,UAAU,EACV,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE;QAAE,cAAc,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE,GAAG,MAAM,CAC1E,MAAM,EACN,OAAO,CACP,CAAC;CACF;AAED,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,CAC5B,OAAO,EAAE,oBAAoB,GAC3B,IAAI,CAAC,UAAU,CAAC,CA8clB"}
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 { decodeBase64Url, encodeBase64Url } from "hono/utils/encode";
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
- return renderApprovalDialog(request, {
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
- state: { oauthReqInfo },
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 { state, instanceUrl } = await parseRedirectApproval(request);
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 (instanceUrl.match(/^https:\/\/(?:team|my)\d+\.thoughtspot\.cloud\/?$/)) {
57
- const callbackUrl = new URL("/callback", origin);
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, state.oauthReqInfo, origin);
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 instanceUrl = url.searchParams.get("instanceUrl");
74
- const encodedOauthReqInfo = url.searchParams
75
- .get("oauthReqInfo")
76
- // Workaround for https://thoughtspot.atlassian.net/browse/SCAL-258056
77
- ?.replace("/10023.html", "");
78
- if (!instanceUrl) {
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(instanceUrl, decodedOAuthReqInfo, assets, origin);
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
- // biome-ignore lint/suspicious/noExplicitAny: AuthRequest from oauth provider
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.token;
109
- oauthReqInfo = body.oauthReqInfo;
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 (!token || !oauthReqInfo || !instanceUrl) {
116
- throw new McpServerError({ message: "Missing token or OAuth request info or instanceUrl" }, 400);
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 { clientId } = oauthReqInfo;
119
- if (!clientId) {
120
- throw new McpServerError({ message: "Missing clientId" }, 400);
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
- const clientName = await oauthProvider.lookupClient(clientId);
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: 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 = new Response(`Internal Server Error ${error}`, {
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
- if (error instanceof Error) {
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
- if (error instanceof Error) {
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
  }
@@ -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";
@@ -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;AACpD,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"}
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,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,aAAa,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,iBAAiB,GAGjB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,GAGlB,MAAM,kBAAkB,CAAC"}
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"}
@@ -1,4 +1,4 @@
1
- import type { AuthRequest, ClientInfo } from "@cloudflare/workers-oauth-provider";
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: Record<string, unknown>;
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
- state: {
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
- export declare function buildSamlRedirectUrl(instanceUrl: string, oauthReqInfo: unknown, callbackOrigin: string): string;
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,EACX,WAAW,EACX,UAAU,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAkB3C,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,qBAAqB,GAC5B,QAAQ,CA+MV;AAYD,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE;QAAE,YAAY,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,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,CAqC/B;AAWD,wBAAgB,oBAAoB,CACnC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EACrB,cAAc,EAAE,MAAM,GACpB,MAAM,CAUR"}
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"}
@@ -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.
@@ -15,10 +14,10 @@ const DEFAULT_MCP_LOGO_URL = "https://raw.githubusercontent.com/thoughtspot/mcp-
15
14
  const DEFAULT_INSTANCE_LOGO_URL = "https://avatars.githubusercontent.com/u/8906680?s=200&v=4";
16
15
  const DEFAULT_TERMS_URL = "https://www.thoughtspot.com/legal/thoughtspot-for-apps";
17
16
  const DEFAULT_PRIVACY_URL = "https://www.thoughtspot.com/privacy-statement";
18
- const DEFAULT_SIGNUP_URL = "https://www.thoughtspot.com/trial";
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, state, client } = options;
21
- const encodedState = btoa(JSON.stringify(state));
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;
@@ -94,7 +93,7 @@ export function renderApprovalDialog(request, options) {
94
93
  line-height: 1.3;
95
94
  }
96
95
  .approval-form { width: 100%; display: flex; flex-direction: column; align-items: stretch; }
97
- .form-group { margin-bottom: 28px; }
96
+ .form-group { margin-bottom: 32px; }
98
97
  .form-group label { display: block; margin-bottom: 8px; font-weight: 400; font-size: 0.94rem; color: #111827; transition: color 0.2s; }
99
98
  .form-group label.label-blue { color: #2563eb; }
100
99
  .form-group label.label-red { color: #dc2626; }
@@ -102,9 +101,9 @@ export function renderApprovalDialog(request, options) {
102
101
  .form-group input.input-blue { border-color: #2563eb; }
103
102
  .form-group input.input-red { border-color: #dc2626; }
104
103
  .approval-subtitle { font-weight: 600; font-size: 0.94rem; margin-bottom: 8px; margin-top: 0; }
105
- .approval-permissions { margin: 0 0 32px 0; padding: 0 0 0 18px; list-style: disc; color: #111827; font-size: 0.94rem; }
104
+ .approval-permissions { margin: 0 0 24px 0; padding: 0 0 0 18px; list-style: disc; color: #111827; font-size: 0.94rem; }
106
105
  .approval-permissions li { margin-bottom: 8px; line-height: 1.6; }
107
- .approval-actions { display: flex; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
106
+ .approval-actions { display: flex; justify-content: space-between; gap: 16px; margin-bottom: 8px; }
108
107
  .terms-checkbox { margin-bottom: 24px; display: flex; align-items: flex-start; gap: 8px; }
109
108
  .terms-checkbox input[type="checkbox"] { margin-top: 3px; }
110
109
  .terms-checkbox label { font-size: 0.94rem; line-height: 1.4; color: #111827; }
@@ -116,9 +115,12 @@ export function renderApprovalDialog(request, options) {
116
115
  .button-allow { background: #2563eb; color: #fff; border: none; }
117
116
  .button-allow:hover { background: #1a56db; }
118
117
  .button-allow:disabled { background: #93c5fd; cursor: not-allowed; }
119
- .approval-footer { text-align: center; font-size: 0.88rem; color: #111827; margin-top: 8px; }
120
- .approval-footer a { color: #2563eb; text-decoration: none; margin-left: 0.25em; font-weight: 500; }
121
- .approval-footer a:hover { text-decoration: underline; }
118
+ .button-allow.is-loading { display: inline-flex; align-items: center; justify-content: center; gap: 8px; }
119
+ .button-spinner { width: 12px; height: 12px; border: 2px solid rgba(255,255,255,0.5); border-top-color: #fff; border-radius: 50%; animation: button-spin 0.7s linear infinite; }
120
+ @keyframes button-spin { to { transform: rotate(360deg); } }
121
+ .free-trial-footer { text-align: center; font-size: 0.88rem; color: #111827; margin-top: 8px; }
122
+ .free-trial-footer a { color: #2563eb; text-decoration: none; margin-left: 0.25em; font-weight: 500; }
123
+ .free-trial-footer a:hover { text-decoration: underline; }
122
124
  @media (max-width: 600px) {
123
125
  .approval-card { padding: 18px 4vw 18px 4vw; max-width: 98vw; }
124
126
  .approval-logos { gap: 18px; margin-bottom: 18px; }
@@ -148,6 +150,10 @@ export function renderApprovalDialog(request, options) {
148
150
  <label for="instanceUrl" id="instanceUrlLabel">ThoughtSpot instance URL</label>
149
151
  <input type="text" id="instanceUrl" name="instanceUrl" value="${tsInstanceUrl}" placeholder="https://your-instance.thoughtspot.cloud" autocomplete="off">
150
152
  <input type="hidden" name="state" value="${encodedState}">
153
+ <div class="free-trial-footer">
154
+ Don't have a ThoughtSpot instance yet?
155
+ <a href="${signupUrl}" target="_blank" rel="noopener noreferrer">Start a free 14-day trial</a>
156
+ </div>
151
157
  </div>
152
158
  <div class="approval-subtitle">${serverName} will be able to:</div>
153
159
  <ul class="approval-permissions">
@@ -167,10 +173,6 @@ export function renderApprovalDialog(request, options) {
167
173
  <button type="submit" class="button button-allow" id="allowButton" disabled>Allow</button>
168
174
  </div>
169
175
  </form>
170
- <div class="approval-footer">
171
- Don't have an account?
172
- <a href="${signupUrl}" target="_blank" rel="noopener noreferrer">Sign up</a>
173
- </div>
174
176
  </div>
175
177
  <script>
176
178
  const input = document.getElementById('instanceUrl');
@@ -210,6 +212,9 @@ export function renderApprovalDialog(request, options) {
210
212
  e.preventDefault(); termsCheckbox.focus();
211
213
  } else {
212
214
  setBlue();
215
+ allowButton.disabled = true;
216
+ allowButton.classList.add('is-loading');
217
+ allowButton.innerHTML = '<span class="button-spinner"></span>Authorizing...';
213
218
  }
214
219
  });
215
220
  </script>
@@ -220,16 +225,6 @@ export function renderApprovalDialog(request, options) {
220
225
  headers: { "Content-Type": "text/html; charset=utf-8" },
221
226
  });
222
227
  }
223
- function decodeState(encodedState) {
224
- try {
225
- const decoded = atob(encodedState);
226
- return JSON.parse(decoded);
227
- }
228
- catch (e) {
229
- console.error("Error decoding state:", e);
230
- throw new Error("Invalid state format");
231
- }
232
- }
233
228
  export function validateAndSanitizeUrl(url) {
234
229
  try {
235
230
  const trimmedUrl = url.trim();
@@ -313,21 +308,16 @@ export async function parseRedirectApproval(request) {
313
308
  if (request.method !== "POST") {
314
309
  throw new Error("Invalid request method. Expected POST.");
315
310
  }
316
- let state;
317
- let clientId;
311
+ let stateId;
318
312
  let instanceUrl;
319
313
  try {
320
314
  const formData = await request.formData();
321
- const encodedState = formData.get("state");
315
+ const rawStateId = formData.get("state");
322
316
  const rawInstanceUrl = formData.get("instanceUrl");
323
- if (typeof encodedState !== "string" || !encodedState) {
317
+ if (typeof rawStateId !== "string" || !rawStateId) {
324
318
  throw new Error("Missing or invalid 'state' in form data.");
325
319
  }
326
- state = decodeState(encodedState);
327
- clientId = state?.oauthReqInfo?.clientId;
328
- if (!clientId) {
329
- throw new Error("Could not extract clientId from state object.");
330
- }
320
+ stateId = rawStateId;
331
321
  if (!rawInstanceUrl) {
332
322
  throw new Error("Missing instance URL");
333
323
  }
@@ -337,7 +327,7 @@ export async function parseRedirectApproval(request) {
337
327
  console.error("Error processing form submission:", e);
338
328
  throw new Error(`Failed to parse approval form: ${e instanceof Error ? e.message : String(e)}`);
339
329
  }
340
- return { state, instanceUrl };
330
+ return { stateId, instanceUrl };
341
331
  }
342
332
  function sanitizeHtml(unsafe) {
343
333
  return unsafe
@@ -347,13 +337,18 @@ function sanitizeHtml(unsafe) {
347
337
  .replace(/"/g, "&quot;")
348
338
  .replace(/'/g, "&#039;");
349
339
  }
350
- export function buildSamlRedirectUrl(instanceUrl, oauthReqInfo, callbackOrigin) {
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) {
351
350
  const redirectUrl = new URL("callosum/v1/saml/login", instanceUrl);
352
- const targetURLPath = new URL("/callback", callbackOrigin);
353
- targetURLPath.searchParams.append("instanceUrl", instanceUrl);
354
- const encodedState = encodeBase64Url(new TextEncoder().encode(JSON.stringify(oauthReqInfo)).buffer);
355
- targetURLPath.searchParams.append("oauthReqInfo", encodedState);
356
- redirectUrl.searchParams.append("targetURLPath", targetURLPath.href);
351
+ redirectUrl.searchParams.append("targetURLPath", buildCallbackUrl(stateId, callbackOrigin));
357
352
  return redirectUrl.toString();
358
353
  }
359
354
  //# sourceMappingURL=oauth-utils.js.map
@@ -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;AAK9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;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,GAAG,mCAAmC,CAAC;AAQ/D,MAAM,UAAU,oBAAoB,CACnC,OAAgB,EAChB,OAA8B;IAE9B,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA6FH,UAAU;;;;;;;;;;;0BAWV,eAAe;;0CAEC,aAAa;gEACS,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;;;gFAGb,aAAa;2DAClC,YAAY;;+CAExB,UAAU;;;;;;;;;6BAS5B,QAAQ;iCACJ,UAAU;;;;;;;;;;yBAUlB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8C7B,CAAC;IACL,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE;QAChC,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;KACvD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAI,YAAoB;IAC3C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;AACF,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,KAA+D,CAAC;IACpE,IAAI,QAA4B,CAAC;IACjC,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAW,CAAC;QAE7D,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,GAAG,WAAW,CAAiC,YAAY,CAAC,CAAC;QAClE,QAAQ,GAAG,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC;QAEzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAClE,CAAC;QAED,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,KAAK,EAAE,WAAW,EAAE,CAAC;AAC/B,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,MAAM,UAAU,oBAAoB,CACnC,WAAmB,EACnB,YAAqB,EACrB,cAAsB;IAEtB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC3D,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,eAAe,CACnC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,MAAqB,CAC5E,CAAC;IACF,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAChE,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"oauth-utils.js","sourceRoot":"","sources":["../src/oauth-utils.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
1
  import type { AssetsFetcher } from "./types";
2
- export declare function renderTokenCallback(instanceUrl: string, oauthReqInfo: unknown, assets: AssetsFetcher, origin: string): Promise<string>;
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,wBAAsB,mBAAmB,CACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAoEjB"}
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"}
@@ -1,6 +1,21 @@
1
- export async function renderTokenCallback(instanceUrl, oauthReqInfo, assets, origin) {
2
- const parsedOAuthReqInfo = typeof oauthReqInfo === "string" ? JSON.parse(oauthReqInfo) : oauthReqInfo;
3
- const oauthReqInfoJson = JSON.stringify(parsedOAuthReqInfo);
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
- htmlContent = htmlContent.replace("{{OAUTH_REQ_INFO}}", oauthReqInfoJson);
21
- htmlContent = htmlContent.replace('<link rel="stylesheet" href="oauth-callback.css">', `<style>${css}</style>`);
22
- htmlContent = htmlContent.replace('<script src="oauth-callback.js"></script>', `<script>window.INSTANCE_URL = '${instanceUrl}';</script>\n <script>${js}</script>`);
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,WAAmB,EACnB,YAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,MAAM,kBAAkB,GACvB,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC5E,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAE5D,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,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;QAE1E,WAAW,GAAG,WAAW,CAAC,OAAO,CAChC,mDAAmD,EACnD,UAAU,GAAG,UAAU,CACvB,CAAC;QAEF,WAAW,GAAG,WAAW,CAAC,OAAO,CAChC,2CAA2C,EAC3C,kCAAkC,WAAW,4BAA4B,EAAE,WAAW,CACtF,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"}
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"}
package/package.json CHANGED
@@ -1,58 +1,47 @@
1
1
  {
2
- "name": "@thoughtspot/mcp-auth",
3
- "version": "2.1.0",
4
- "description": "Reusable ThoughtSpot OAuth + bearer auth layer for Cloudflare Workers MCP servers",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.js"
12
- },
13
- "./assets/*": "./assets/*"
14
- },
15
- "files": [
16
- "dist",
17
- "assets",
18
- "README.md",
19
- "LICENSE"
20
- ],
21
- "scripts": {
22
- "build": "tsc",
23
- "clean": "rm -rf dist",
24
- "test": "vitest run",
25
- "format": "biome format --write",
26
- "lint": "biome lint",
27
- "prepare": "npm run build"
28
- },
29
- "keywords": [
30
- "thoughtspot",
31
- "mcp",
32
- "oauth",
33
- "cloudflare",
34
- "workers"
35
- ],
36
- "author": "ThoughtSpot",
37
- "license": "ThoughtSpot End user license agreement",
38
- "repository": {
39
- "type": "git",
40
- "url": "git+https://github.com/thoughtspot/ts-mcp-auth.git"
41
- },
42
- "publishConfig": {
43
- "access": "public"
44
- },
45
- "peerDependencies": {
46
- "@cloudflare/workers-oauth-provider": "^0.0.5",
47
- "hono": "^4.12.21"
48
- },
49
- "devDependencies": {
50
- "@biomejs/biome": "^1.9.4",
51
- "@cloudflare/workers-oauth-provider": "^0.0.5",
52
- "@cloudflare/workers-types": "^4.20250612.0",
53
- "@types/node": "^22.15.3",
54
- "hono": "^4.12.21",
55
- "typescript": "^5.8.3",
56
- "vitest": "^3.1.2"
57
- }
2
+ "name": "@thoughtspot/mcp-auth",
3
+ "version": "3.0.0",
4
+ "description": "Reusable ThoughtSpot OAuth + bearer auth layer for Cloudflare Workers MCP servers",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./assets/*": "./assets/*"
14
+ },
15
+ "files": ["dist", "assets", "README.md", "LICENSE"],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "clean": "rm -rf dist",
19
+ "test": "vitest run",
20
+ "format": "biome format --write",
21
+ "lint": "biome lint",
22
+ "prepare": "npm run build"
23
+ },
24
+ "keywords": ["thoughtspot", "mcp", "oauth", "cloudflare", "workers"],
25
+ "author": "ThoughtSpot",
26
+ "license": "ThoughtSpot End user license agreement",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/thoughtspot/ts-mcp-auth.git"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "peerDependencies": {
35
+ "@cloudflare/workers-oauth-provider": "^0.0.5",
36
+ "hono": "^4.12.21"
37
+ },
38
+ "devDependencies": {
39
+ "@biomejs/biome": "^1.9.4",
40
+ "@cloudflare/workers-oauth-provider": "^0.0.5",
41
+ "@cloudflare/workers-types": "^4.20250612.0",
42
+ "@types/node": "^22.15.3",
43
+ "hono": "^4.12.21",
44
+ "typescript": "^5.8.3",
45
+ "vitest": "^3.1.2"
46
+ }
58
47
  }