feat(web,core): enterprise-managed authorization (EMA) (#1509) (#1512)

Adds enterprise-managed authorization (EMA): browser-side IdP login + RFC 8693 token-exchange and JWT-bearer resource-token mint, per-server EMA opt-in in Server Settings, IdP config in Client Settings, and IdP clientSecret keychain storage. Includes the v2/main merge and review follow-ups (400 on malformed client config; normalizeIdpIssuer import consolidation).
This commit is contained in:
Bob Dickinson 2026-06-24 19:15:12 -07:00 • committed by GitHub
commit 5de4e911e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 7585 additions and 595 deletions

View file

@ -1,3 +1,3 @@
export { BrowserOAuthStorage } from "./storage.js";
export { BrowserOAuthStorage, getBrowserOAuthStorage } from "./storage.js";
export { BrowserNavigation, BrowserOAuthClientProvider } from "./providers.js";
export type { OAuthNavigationCallback } from "./providers.js";

View file

@ -3,7 +3,7 @@ import type {
OAuthNavigationCallback,
} from "../providers.js";
import { CallbackNavigation, BaseOAuthClientProvider } from "../providers.js";
import { BrowserOAuthStorage } from "./storage.js";
import { getBrowserOAuthStorage } from "./storage.js";
export type { OAuthNavigationCallback } from "../providers.js";
@ -49,12 +49,12 @@ export class BrowserOAuthClientProvider extends BaseOAuthClientProvider {
"BrowserOAuthClientProvider requires browser environment",
);
}
const storage = new BrowserOAuthStorage();
const storage = getBrowserOAuthStorage();
const redirectUrlProvider: RedirectUrlProvider = {
getRedirectUrl: () => `${window.location.origin}/oauth/callback`,
};
const navigation = new BrowserNavigation();
super(serverUrl, { storage, redirectUrlProvider, navigation }, "normal");
super(serverUrl, { storage, redirectUrlProvider, navigation }, "quick");
}
}

View file

@ -13,3 +13,13 @@ export class BrowserOAuthStorage extends OAuthStorageBase {
super(createOAuthStore(createJSONStorage(() => sessionStorage)));
}
}
let sharedBrowserOAuthStorage: BrowserOAuthStorage | undefined;
/** Shared sessionStorage-backed OAuth store for the web client (single in-memory view). */
export function getBrowserOAuthStorage(): BrowserOAuthStorage {
if (!sharedBrowserOAuthStorage) {
sharedBrowserOAuthStorage = new BrowserOAuthStorage();
}
return sharedBrowserOAuthStorage;
}