Browse documentation

Pharos / Docs / v1.0.1

Users, SSO and two-factor

Updated 2026-10-22 · Pharos 1.0.1

There are two kinds of account. Admin manages users, updates, API tokens, branding, mail templates and the audit log on every page; user works on the pages assigned to them, with a role per page. The first account is an admin. Login is throttled at five attempts per email and IP with a five-minute lockout. Passwords are at least twelve characters.

You cannot delete the account you are signed in with, and you cannot delete the last account: locking everyone out of a self-hosted install is not recoverable through the interface. Forgot password? on the sign in screen mails a link to set a new password, which needs working mail settings. Without mail, recover from the shell:

php artisan pharos:user [email protected] --password='a-new-long-password'

Roles per status page

Administrators see every page. Everyone else gets a role on each page they need: Read only views the page's screens and delivery history without check targets or integration credentials; Editor manages components, services, incidents, maintenance, subscribers and destinations; Page admin adds that page's branding, email, mail templates and API tokens. Installation settings, licences, users and creating or archiving pages stay with administrators. Lowering or removing a role takes effect at once, also in open sessions.

The Users screen: four accounts with counters for accounts, two factor and recent activity, and per account its page roles such as Page admin, Editor and Read only, two factor state and last seen
Installation → Users. Every account with its role per page, two factor state and when it was last seen. Filter by administrators or page users, or search by name or email.

Two-factor

Each user turns on TOTP two-factor for their own account under Profile: scan the QR code with any authenticator app, confirm one code, and it is on. It is asked for at every sign-in afterwards, including a sign-in through single sign-on, so a second door never skips the gate. Lost the device? Turn it off for that account from the shell with php artisan pharos:2fa:disable [email protected].

Switching it on also gives you ten recovery codes, shown once. Each one signs you in a single time when the authenticator app is not to hand.

A code from the app works once. Enter the same code a second time, for example because you signed out and straight back in, and Pharos answers: That code has already been used. Wait for the next one. Nothing is wrong with your app or your clock. Wait until the app shows a new code, at most 30 seconds, and enter that one. A code that is simply wrong gets a different answer: That code did not match.

Passkeys are a separate way to sign in. They do not replace two factor: an account with two factor on is asked for its code after a passkey too.

Single sign-on (OpenID Connect)

Under Settings → Single sign on you can point Pharos at any OIDC provider: Authentik, Keycloak, Google Workspace, Entra ID. Fill in the issuer URL, client id and secret, register the redirect URI it shows you, and a Sign in with … button appears on the login screen.

People sign in, they do not appear. Someone signing in through your provider needs an account here already, matched on their verified e-mail address; an address nobody here uses is refused, not turned into a new account. Password sign-in keeps working, so a provider that is down never locks you out. The switch is tested the moment you save it; a provider that cannot be reached will not switch on.