fix(auth): harden logout proxy traps from review feedback

- get() now returns undefined for logged-out providers instead of
  delegating to target.get() which could bypass the guard
- getCredential() in provider-auth returns undefined for logged-out
  providers instead of falling through to authStorage.get()
- getAll() skips logged-out providers at top of loop
- list() filters modelsJsonApiKeys against loggedOutProviders
- Added remove() trap in provider-auth for clearApiKey flow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Timothy Laurent
2026-05-05 21:21:33 -07:00
parent 148b2e8f4c
commit 7724cadaf4
2 changed files with 19 additions and 4 deletions

View File

@@ -202,7 +202,7 @@ export function createFusionAuthStorage(): AuthStorage {
if (prop === "get") {
return (provider: string) => {
if (loggedOutProviders.has(provider)) {
return target.get(provider);
return undefined;
}
return choosePreferredStoredCredential(
target.get(provider) as StoredCredential | undefined,
@@ -239,9 +239,12 @@ export function createFusionAuthStorage(): AuthStorage {
]);
const merged: Record<string, StoredCredential> = {};
for (const providerId of providerIds) {
if (loggedOutProviders.has(providerId)) {
continue;
}
const credential = choosePreferredStoredCredential(
(target.get(providerId) as StoredCredential | undefined),
loggedOutProviders.has(providerId) ? undefined : supplementalCredentials[providerId],
supplementalCredentials[providerId],
);
if (credential) {
merged[providerId] = credential;
@@ -253,7 +256,12 @@ export function createFusionAuthStorage(): AuthStorage {
if (prop === "list") {
return () => {
const providers = new Set([...target.list(), ...modelsJsonApiKeys.keys()]);
const providers = new Set([...target.list()]);
for (const p of modelsJsonApiKeys.keys()) {
if (!loggedOutProviders.has(p)) {
providers.add(p);
}
}
for (const p of Object.keys(supplementalCredentials)) {
if (!loggedOutProviders.has(p)) {
providers.add(p);