Hookfish encrypts stored credentials and enforces broker scopes, but the host
application still owns identity, network exposure, key custody, backups, and
tenant authorization.
Production checklist
- Generate independent high-entropy
OAUTH_ENCRYPTION_KEY and
HOOKFISH_API_KEY values.
- Store every secret in the runtime’s secret manager.
- Set
OAUTH_REDIRECT_BASE_URL to the public HTTPS broker origin.
- Register callback URLs returned by
/api/oauth/providers.
- Keep authenticated raw
/api/* operations behind a trusted service
boundary while leaving the provider callback publicly reachable.
- Authenticate users on your application API before calling Hookfish.
- Select a scoped broker token for the current user or tenant in server code.
- Give services scoped, expiring broker tokens instead of the root key.
- Keep provider-token retrieval and vault-value operations server-only.
- Export lifecycle events to an audit or telemetry system.
- Back up the database and encryption key through separate controlled systems.
- Test restoration, scoped-token revocation, and provider reauthorization.
Stored credentials
Provider access tokens, refresh tokens, dynamic-provider client secrets, and
vault values are encrypted with AES-GCM before database storage. Provider and
connection metadata exclude access tokens, refresh tokens, ID tokens, and
client secrets.
OAuth state is stored only as a SHA-256 hash and expires after ten minutes. A
state record is claimed before code exchange so a completed callback cannot be
replayed concurrently.
Broker credentials
Scoped tokens are HMAC-signed with HOOKFISH_API_KEY. Hookfish stores only a
SHA-256 hash of each token’s random identifier and checks the authoritative
database record on every request. This enables immediate revocation and scope
narrowing.
The root key remains a high-impact credential. Keep it out of browser code,
operator screenshots, logs, and shared shell history.
Application boundary
The browser should call your authenticated application API. After checking the
session and permissions, your server calls Hookfish with the tenant’s scoped
broker token. Do not forward that token, provider tokens, or vault values to
the browser.
The optional /api/client facade has a restricted route allowlist, but its
application authorizer does not select tenant-specific broker credentials.
Prefer app-owned routes for user-facing, multi-tenant access.
Database and key recovery
Database backups without OAUTH_ENCRYPTION_KEY cannot restore encrypted
credentials. An encryption-key change without re-encrypting existing rows makes
those rows unreadable. Document recovery ownership and keep tested, access-
controlled copies of both inputs.
On Cloudflare Workers, use PostgreSQL through Hyperdrive for production. The
SQLite Durable Objects adapter is experimental.
Never log provider-token responses, vault-value responses, authorization
headers, callback codes, or encryption keys.