Watch-Auth gegen minerva: api_key in users.toml ist bcrypt-Hash, Server vergleicht Plaintext #1
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beobachtung
Watch-Requests gegen
http://minerva.lan:3000werden immer mit401 Unauthorizedabgewiesen, egal welcher Klartext-Wert alsX-API-Key-Header gesendet wird.Ursache
Server-Auth (
server/src/auth.rs:46-52) macht einen Plaintext-HashMap-Lookup:config.api_keysist einHashMap<plaintext_key, slug>, gebaut inserver/src/config.rs:238-255direkt aus dem Klartext-Wert inusers.toml. Es findet keinbcrypt::verifystatt.Auf minerva (
/opt/stacks/doctate-server/config/users.toml) stehen aber bcrypt-Hashes ($2b$12$…) imapi_key-Feld. Damit landet der Hash-String selbst als HashMap-Key. Die Watch sendet im Header den Klartext, der niemals matched.Der
hash-password-Helper (server/src/bin/hash-password.rs:149) patcht ausschliesslichweb_password;api_keywar nie für bcrypt vorgesehen.Reproduktion
Fix
/opt/stacks/doctate-server/config/users.tomleditieren:api_key-Felder durch frische Klartext-Werte ersetzen (z.B.openssl rand -base64 24), pro User ein eigener Wert.curl -H "X-API-Key: <klartext>" http://minerva.lan:3000/api/oneliners→200.Folge-Härtung im Server-Code: siehe das
idea-Issue zum Sanity-Check.Resolved 2026-05-20.
Fix angewendet
/opt/stacks/doctate-server/config/users.tomlauf minerva editiert:admin(Brummel): bcrypt-Hash → frischer Klartext-Wert (openssl rand -base64 24)krey(Dr. Krey): bcrypt-Hash → frischer Klartext-Wert (separat generiert)web_password-Felder unangetastet (bcrypt korrekt für Browser-Login)Backup unter
users.toml.pre-issue1.bak. Container viadocker compose restartneu gestartet.Verifikation
Klartext-Werte
Leben jetzt nur in lokal-gitignored Build-Profilen unter
clients/wearos/profiles.d/brummel-minerva.shundkrey-minerva.sh(gebaut im Rahmen von #3). Das Server-users.toml-Schema hat dieselbe Klartext-Erwartung — kein Schema-Drift mehr.Follow-up #4 (Server-Sanity-Check, der bcrypt-aussehende
api_keys beim Start rejected) bleibt offen — fängt künftige Konfigurationsfehler dieser Art ab, bevor sie wieder zwei Stunden Debugging kosten.