signed / verified badge on every row. That’s nice, but the UI is the thing under test — you shouldn’t trust it to grade its own homework. This chapter does two things:
- Walks you through curl commands that prove the auth is real.
- Explains which of the three auth layers rejects which class of attack, so you know what each one is actually buying you.
Prove it from your terminal
Open a new shell tab. Keep the inbox running.1 · Find the personal-agent port
2 · Confirm unauthed callers are rejected
-32009 is bindufy’s auth middleware saying “no token, no signature, go away.” Same response a hostile peer would get.
3 · Confirm the inbox can get through
/api/compose, which mints a Hydra token and signs the body before forwarding. The peer accepts it because it can verify both layers.
4 · Verify from inside the UI
Open any thread and click Verify in the top-right of the right rail. Each row should reportsigned / verified against the peer’s published publicKeyBase58. The detail rail’s Verify tab shows:
- The DID match (claimed DID resolves to the same public key the signature verifies against).
- The signature bytes.
- The timestamp nonce (rejects replays older than the configured window).
What “auth on” means
There are three independent auth layers in play. The inbox uses all three.
The first is non-negotiable once your personal agent is alive — it’s how every bindufy peer in the world recognizes legitimate callers.
The other two are belt-and-suspenders for multi-user or exposed deployments. Leave them off until you actually share the URL with a teammate or put the inbox behind a tunnel.
Why three layers, not one
Each layer fails safe in a way the others can’t:An attacker who steals a bearer token still can't impersonate a DID
An attacker who steals a bearer token still can't impersonate a DID
The Ed25519 signature won’t verify against the claimed key. Tokens are bearer credentials — anyone who has them can use them — but the signature ties the body to a specific private key the attacker doesn’t have.
An attacker who forges a signature still can't reach the agent without a token
An attacker who forges a signature still can't reach the agent without a token
Hydra rejects unauthed callers at the middleware layer before the signature is even checked. Stealing a key isn’t enough; you also need OAuth scope.
An attacker who breaks both still can't replay yesterday's request
An attacker who breaks both still can't replay yesterday's request
The timestamp nonce is part of the canonical body, so replaying a captured request gets rejected once it ages out of the window.
What you’ve verified
Peer rejects no-auth
-32009 on a raw curl. The middleware is actually running.Inbox can authenticate
Same peer, same body, accepted via
/api/compose. The signing path works.UI tells the truth
The Verify tab re-runs the same signature check. The badge is grounded, not decorative.