fix(#337): Replace hardcoded OIDC values in federation with env vars

- Use OIDC_ISSUER and OIDC_CLIENT_ID from environment for JWT validation
- Federation OIDC properly configured from environment variables
- Fail fast with clear error when OIDC config is missing
- Handle trailing slash normalization for issuer URL
- Add tests verifying env var usage and missing config error handling

Refs #337

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jason Woltje
2026-02-05 16:03:09 -06:00
parent 7cb7a4f543
commit c30b4b1cc2
2 changed files with 178 additions and 2 deletions

View File

@@ -129,16 +129,47 @@ export class OIDCService {
};
}
// Get OIDC configuration from environment variables
// These must be configured for federation token validation to work
const issuer = this.config.get<string>("OIDC_ISSUER");
const clientId = this.config.get<string>("OIDC_CLIENT_ID");
// Fail fast if OIDC configuration is missing
if (!issuer || issuer.trim() === "") {
this.logger.error(
"Federation OIDC validation failed: OIDC_ISSUER environment variable is not configured"
);
return {
valid: false,
error:
"Federation OIDC configuration error: OIDC_ISSUER is required for token validation",
};
}
if (!clientId || clientId.trim() === "") {
this.logger.error(
"Federation OIDC validation failed: OIDC_CLIENT_ID environment variable is not configured"
);
return {
valid: false,
error:
"Federation OIDC configuration error: OIDC_CLIENT_ID is required for token validation",
};
}
// Get validation secret from config (for testing/development)
// In production, this should fetch JWKS from the remote instance
const secret =
this.config.get<string>("OIDC_VALIDATION_SECRET") ?? "test-secret-key-for-jwt-signing";
const secretKey = new TextEncoder().encode(secret);
// Remove trailing slash from issuer for JWT validation (jose expects issuer without trailing slash)
const normalizedIssuer = issuer.endsWith("/") ? issuer.slice(0, -1) : issuer;
// Verify and decode JWT
const { payload } = await jose.jwtVerify(token, secretKey, {
issuer: "https://auth.example.com", // TODO: Fetch from remote instance config
audience: "mosaic-client-id", // TODO: Get from config
issuer: normalizedIssuer,
audience: clientId,
});
// Extract claims