A community based topic aggregation platform built on atproto

docs(config): add HS256_ISSUERS configuration for JWT auth

Document the dual JWT verification methods (HS256 + ES256) in environment
configuration files:

- HS256: For your own PDS (fast, shared secret, no network calls)
- ES256: For federated users (DID resolution, works with any PDS)

Updates:
- .env.dev: Add HS256_ISSUERS for local development
- .env.prod.example: Add JWT Authentication section with documentation
- docker-compose.prod.yml: Pass PDS_JWT_SECRET and HS256_ISSUERS to appview

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

+5
.env.dev
···
# When false, verifies JWT signature against issuer's JWKS
AUTH_SKIP_VERIFY=true
+
# HS256 Issuers: PDSes allowed to use HS256 (shared secret) authentication
+
# Must share PDS_JWT_SECRET with Coves instance. External PDSes use ES256 via DID resolution.
+
# For local dev, allow the local PDS or turn AUTH_SKIP_VERIFY = true
+
HS256_ISSUERS=http://localhost:3001
+
# Logging
LOG_LEVEL=debug
LOG_ENABLED=true
+28
.env.prod.example
···
# PDS_EMAIL_FROM_ADDRESS=noreply@coves.me
# =============================================================================
+
# JWT Authentication
+
# =============================================================================
+
# Coves supports two JWT verification methods:
+
#
+
# 1. HS256 (shared secret) - For your own PDS
+
# - Fast, no network calls needed
+
# - Requires shared PDS_JWT_SECRET
+
# - Only for PDSes you control
+
#
+
# 2. ES256 (DID resolution) - For federated users
+
# - Works with any PDS (bsky.social, etc.)
+
# - Resolves user's DID document to get public key
+
# - No shared secret needed
+
#
+
# HS256_ISSUERS: Comma-separated list of PDS URLs allowed to use HS256
+
# These PDSes MUST share the same PDS_JWT_SECRET with Coves
+
# Example: HS256_ISSUERS=https://pds.coves.social,https://pds.example.com
+
HS256_ISSUERS=https://pds.coves.me
+
+
# PLC Directory URL for DID resolution (optional)
+
# Defaults to https://plc.directory if not set
+
# PLC_DIRECTORY_URL=https://plc.directory
+
+
# Skip JWT signature verification (DEVELOPMENT ONLY!)
+
# Set to false in production for proper security
+
AUTH_SKIP_VERIFY=false
+
+
# =============================================================================
# AppView OAuth (for mobile app authentication)
# =============================================================================
OAUTH_CLIENT_ID=https://coves.social/client-metadata.json
+6
docker-compose.prod.yml
···
# Cursor encryption for pagination
CURSOR_SECRET: ${CURSOR_SECRET}
+
# PDS JWT secret for verifying HS256 tokens from the PDS
+
# Must match the PDS_JWT_SECRET configured on the PDS
+
PDS_JWT_SECRET: ${PDS_JWT_SECRET}
+
# Whitelist PDS issuer(s) allowed to use HS256 (no kid)
+
HS256_ISSUERS: ${HS256_ISSUERS}
+
# Restrict community creation to instance DID only
COMMUNITY_CREATORS: did:web:coves.social
networks: