- Identity provider
- Authentication is delegated to Google Firebase Authentication. The application stores no credential material and holds no long-lived secret. Sign-in returns a Firebase-issued ID token — an RS256-signed JWT with a ~1 hour TTL, signed by Google's rotating key set. Refresh tokens are held and rotated by the Firebase SDK.
- Token verification
- Every inbound API request is authenticated at the backend edge before it reaches application logic. The JWT signature is verified against Google's published public keys, and the
iss, aud and exp claims are validated. Requests failing verification are rejected at that boundary; no unverified request reaches business code.
- Single client choke point
- All outbound API traffic is routed through one client. Authentication is opt-out rather than opt-in and is enabled on every endpoint, so a call cannot accidentally be issued unauthenticated. Each request carries a bearer token and an
X-Request-Id built from a timestamp plus 64 CSPRNG bits for end-to-end correlation.
- Token lifecycle
- The token is requested per call, so SDK-managed caching and silent renewal handle expiry. On a 401 the client performs a single forced refresh and replays the request exactly once. There is no refresh loop and no unbounded retry on authentication failure.
- Verb-aware retries
- Idempotent reads retry up to twice on 429, 5xx, timeout and socket errors, using exponential backoff (300 / 800 / 1500 ms) with randomised jitter. State-mutating operations — create, update, delete, submit — are explicitly non-retryable and never automatically replayed, which eliminates duplicate writes caused by network instability.
- Error handling
- A single typed exception model separates diagnostic data (status code, request ID, cause) from the user-facing message. Response bodies and internal detail are never rendered to the user, and verbose logging is compiled out of release builds.
- Authorization
- The authoritative subject identity is the verified token's
sub claim. Role, organisation and tenant scope are resolved server-side per request; client-supplied context is not treated as authoritative. Endpoint-level permission is enforced independently of the client's navigation state.
- File transfer
- Uploads and downloads use short-lived, backend-issued signed URLs requested over an authenticated channel. Object data never transits the application server.
- Encryption in transit
- All backend communication is over HTTPS using TLS 1.3. Earlier TLS versions (1.0, 1.1, 1.2) are disabled at the edge and plaintext HTTP is not served. Authenticated responses are marked non-cacheable so credentials-bearing content is not retained by intermediaries.
- Encryption at rest
- The platform is hosted on Google Cloud Platform. All customer data at rest is encrypted by default at the storage layer using AES-256, with key management by Google Cloud KMS and automatic key rotation. This applies uniformly across our managed data stores and object storage; no data is written to unencrypted media. Customer-managed encryption keys (CMEK) can be discussed where your policy requires key custody.
- Multi-factor authentication
- Supported, and can be enabled per tenant on request.
- Availability & recovery
- The database runs in a high-availability configuration on Google Cloud Platform, with recovery procedures designed to restore service in minutes.