Security standard: authentication/authorization and credential-handling code must fail closed and must not leak secrets.
1) Auth callback state/nonce enforcement (fail-closed)
state doesn’t match the expected value, do not proceed. Only proceed after an explicit, deliberate allow-list decision.Example pattern:
// Fail-closed: state mismatch must not store attacker-provided tokens.
if (authService.authNonce !== state) {
const choice = await vscode.window.showWarningMessage(
"Authentication response could not be verified. Store the token?",
{ modal: true },
"Store",
);
if (choice !== "Store") return;
}
// Safe to continue only after verification.
if (token) authService.storeToken(token);
2) Production-safe logging: never log secrets
origin at minimum; never include path/query/fragment where OAuth codes, tokens, or API keys may appear.Example logging policy:
function redactUrlForLog(url: string): string {
try {
const u = new URL(url);
if (u.origin === "null") return `${u.protocol}<redacted>`;
return u.origin; // drop pathname/query/fragment
} catch {
return "<invalid url>";
}
}
// In production logger: treat extra args as potentially secret; drop most.
3) Identity-safe boundaries when “loosening” security
Adopting these rules prevents attacker-controlled auth bindings (fail-open) and prevents credential exfiltration through logs, telemetry, and error messages.