Client secrets hashed at rest
Auto-generated from the source archive. Do not edit by hand — rerun
catalyst-changelog-syncinstead.
What changed
Section titled “What changed”- Breaking:
OAuthApplication.secretis now persisted as a bcrypt hash and masked toundefinedon every read path; client authentication verifies the presentedclient_secretwithbcrypt.compareon every grant (password, authorization_code, refresh_token). - Breaking: the frontend
environment*.tsfiles must carry the plaintext secret asoAuth.applicationSecret— the old pre-computed hash literal no longer authenticates. - The bootstrap seeder now seeds a plaintext that is hashed on write, reconciles drift with
bcrypt.compareso reboots never double-hash, and heals a legacy unhashed bootstrap secret on boot.
Why it matters
Section titled “Why it matters”Secrets were stored as the literal value sent on the wire, so any database read, admin listing, or backup dump exposed every usable client_secret in the platform. The migration path: update your frontend environments to the plaintext secret, and for satellite apps provisioned before this change, follow the documented re-registration / detect-and-hash strategy — otherwise their logins fail the bcrypt comparison. The one-time credential bundle still returns the plaintext; only the at-rest representation changed.