The inbox shows aDocumentation Index
Fetch the complete documentation index at: https://docs.getbindu.com/llms.txt
Use this file to discover all available pages before exploring further.
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.| Layer | Who enforces it | How to turn it on | Default |
|---|---|---|---|
| Peer A2A auth — outbound calls must carry a JWT + DID signature | The peer’s bindufy middleware (-32009 if missing) | Set AUTH__ENABLED=true on the peer. Done automatically when the inbox spawns your personal agent or the demo peers. | On |
Operator gate — /api/* on the inbox requires a bearer token | inbox/server/index.ts | export BINDU_COMMS_TOKEN=$(openssl rand -hex 32) before npm run dev. UI needs ?token=<token> in the URL (SSE can’t send headers). | Off (single-user dev) |
Webhook gate — agents POSTing to /webhooks/bindu/:agentId must carry a bearer token | inbox/server/index.ts | export BINDU_WEBHOOK_TOKEN=<token> and configure the same value as global_webhook_token on the bindufy side. | Off |
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.