Problem
Backend routes are publicly accessible — any caller can read/write messages for any Stellar address.
Solution
Stellar challenge-response authentication:
- `GET /auth/challenge?address=G...` — return signed nonce + expiry
- Client signs with Stellar wallet (Freighter / WalletsKit)
- `POST /auth/verify` — backend verifies signature, returns JWT
- Protected routes require `Authorization: Bearer `
Protected routes
- `POST /messages` — only sender
- `GET /inbox/:address` — only that address
- `GET /notifications/:address` — only that address
Acceptance criteria
Problem
Backend routes are publicly accessible — any caller can read/write messages for any Stellar address.
Solution
Stellar challenge-response authentication:
Protected routes
Acceptance criteria