ZeroPress Studio Documentation

Access Control

Authentication

Every Studio account must enroll a TOTP authenticator before gaining normal access. MFA cannot be disabled. A registered Passkey provides another sign-in method; Studio never falls back to password-only access.

Sign-in Methods

Method Required verification
Password and authenticator Password followed by a current TOTP code
Password and registered WebAuthn credential Password followed by the registered credential at the MFA step
Sign in with a Passkey A discoverable credential for the current hostname, with authenticator user verification required

Mandatory TOTP enrollment does not mean every later login must enter a TOTP code. The direct Passkey flow verifies the credential and the authenticator’s user-verification result before issuing a Studio session. See Passkeys for hostname scope and credential information.

Password Policy

New passwords must be at least 15 and at most 256 characters. Length is measured in UTF-16 code units, so some Unicode characters occupy more than one unit. The policy also rejects account-related values and passwords in Studio’s bundled common-password list.

Account checks use the email address and display name, including normalized matches and sufficiently long identity fragments. The acceptance policy does not require a fixed mixture of uppercase, lowercase, digits, and symbols. The strength indicator helps choose a password; the server applies the acceptance policy.

Passwords are stored as salted Argon2id hashes. TOTP secrets and external service credentials instead require reversible encryption under keys derived from STUDIO_AUTH_SECRET; that Worker Secret is not a user password.

Breach Checks

In deployed Workers, Studio checks HIBP Pwned Passwords in addition to its bundled list. It hashes the password in the Worker and sends only the first five hexadecimal SHA-1 characters to the range API, with response padding. The password and full digest are not sent. SHA-1 here is used for the lookup, not for storing the password.

Local development, tests, and local preview use the bundled list. If the remote breach service is unavailable, Studio reports the reduced check and allows a password that passes its local policy. A positive breach match is rejected.

Sensitive Account Changes

Password changes, MFA management, and protected account-management operations require reauthentication. Studio checks the current password and asks for an MFA step-up when the last accepted MFA verification is no longer fresh. The freshness window is five minutes; it does not extend the session’s absolute lifetime.

Authorization is scoped to the requested action and, where applicable, its target account or credential. A successful unrelated action does not grant general administrative access.

Attempt Limits

Cloudflare’s configured native authentication limiter runs before Studio’s own D1-backed limits:

Budget Limit
Password sign-in per normalized email 5 attempts in 2 minutes, including unknown accounts
Sign-in per client IP 20 attempts in 15 minutes, shared by password sign-in and direct Passkey options
Enrolled TOTP verification per account 10 attempts in 5 minutes, shared by sign-in and protected changes

Windows begin with the first attempt. Accepted, incorrect, and replayed TOTP codes consume the TOTP budget; success does not reset it. Rejected requests do not extend a window. Changing IP does not reset an account’s TOTP budget.

Rate-limit responses include Retry-After. Wait until the window ends, and restart sign-in if its continuation has expired. A separately permitted Passkey login remains available. A failed rate-limit database prevents authentication rather than bypassing the checks.

The client IP policy also applies to authentication. Counters store purpose-separated HMAC digests of their email or IP subject rather than those raw values.

For authenticator timing and replay behavior, read TOTP Verification. For lost factors, follow MFA Recovery; Studio does not issue recovery codes.