Skip to content

feat(go-api): API key middleware and per-key rate limiting#31

Open
Depo-dev wants to merge 4 commits into
devfrom
feat/issue-16-auth-middleware
Open

feat(go-api): API key middleware and per-key rate limiting#31
Depo-dev wants to merge 4 commits into
devfrom
feat/issue-16-auth-middleware

Conversation

@Depo-dev

@Depo-dev Depo-dev commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds authentication and rate limiting middleware to the Go API.

API Key middleware (middleware/auth.go)

  • Reads X-API-Key header; HMAC-SHA256 hashes it with API_KEY_SALT env var
  • Compares hash against API_KEY_HASHES (comma-separated pre-hashed keys)
  • Returns 401 if header missing or key unrecognised
  • GET /v1/health is exempt from auth

Rate limiting (middleware/ratelimit.go)

  • Per-API-key token bucket via golang.org/x/time/rate
  • Default: 100 req/s sustained, burst 200 (overridden by RATE_LIMIT_RPS + RATE_LIMIT_BURST)
  • Returns 429 with Retry-After: 1 on limit exceeded

Tests (all pass, go vet clean)

Test Assertion
TestAPIKey_validKeyPasses 200 on correct key
TestAPIKey_missingHeader_returns401 401
TestAPIKey_invalidKey_returns401 401
TestAPIKey_healthSkipsAuth 200 on /v1/health with no key
TestRateLimit_exceedBurst_returns429 429 + Retry-After after burst=2 exceeded

Closes #16

Depo-dev added 4 commits June 3, 2026 16:20
APIKey middleware reads X-API-Key, HMAC-SHA256 hashes it with
API_KEY_SALT, and checks against comma-separated API_KEY_HASHES env var.
GET /v1/health is exempt from auth. Returns 401 on missing or invalid key.

RateLimit middleware uses golang.org/x/time/rate token bucket per API
key (100 req/s sustained, burst 200; configurable via RATE_LIMIT_RPS and
RATE_LIMIT_BURST). Returns 429 with Retry-After: 1 on limit exceeded.

5 tests: valid key passes, missing key 401, invalid key 401, health
bypass, burst exceeded 429.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant