Docs
  • 0.1.0latest

What it is

An OAuth 2.1 and OpenID Connect server for your own applications: one issuer per tenant, an account portal, an admin console, and every piece of state in TessariDB.

TessariDB OAuth signs people in to your own applications. Each tenant, called a company in the console, has an issuer of its own at <PUBLIC_URL>/<company>, with its own signing keys, clients, users and audit trail.

Status. 0.1.0, the first release. Image tessaridb/oauth:0.1.0.

What it serves

  • The protocol. Discovery and the key set per company; authorization with pushed requests (PAR); the token endpoint for authorization codes, refresh tokens and client credentials; revocation; UserInfo; RP-initiated and back-channel logout. See Protocol.
  • Sign-in. Passwords, authenticator apps (TOTP), recovery codes and passkeys; password resets, enrolment links, address verification and changes of sign-in address by mail; self-registration when a company allows it. See Signing in.
  • The account portal. Users see and change their own profile, sign-in factors, sessions and the applications they gave access to. See The account portal.
  • The admin console. Companies, users, groups, clients, operators, sign-in policy, branding, mail wording, signing keys and the audit trail, on a listener of its own. See The admin console.
  • Regions. Each company lives in one home region; a request for it elsewhere is redirected there. See Regions.

The promises it keeps

Each of these is implemented and covered by tests in 0.1.0.

  • One browser flow. Authorization code with PKCE S256 (RFC 7636). The implicit flow, token-returning hybrid flows and the password grant are not offered.
  • Redirect URIs match exactly, with only the native-app loopback port exception (RFC 8252 §7.3).
  • A code redeems once. Of any number of simultaneous redemptions exactly one succeeds; a code presented again revokes the refresh family it started.
  • A reused refresh token revokes its family.
  • Tokens bound to a key when the client asks: DPoP (RFC 9449), keys named by their JWK thumbprint (RFC 7638).
  • No shared secrets. A confidential client authenticates with private_key_jwt; the console offers no way to make a client secret.
  • Nothing secret in a log. A message never carries a token, code, verifier, assertion or proof.
  • Every issuance is on the record, and one that cannot be recorded is not answered.
  • A second factor that stays. Passkeys, authenticator apps and recovery codes, chosen by the user or required by the company, and never removed by a mail link alone.

Where its state lives

Everything the server keeps is a record in TessariDB: companies, users, credentials, clients, codes, grants, consents, refresh families, sessions, signing keys sealed under a key-encryption key, queued mail, replay and throttle counters, and the audit trail. There is no second store beside it, so a backup of the TessariDB node is a backup of the server, apart from two key files kept outside it (see Backup and restore).

The server needs TessariDB 0.38.2 or later.

What it leaves out

  • Shared client secrets and the grants OAuth 2.1 removes.
  • Federation. It does not sign users in through another identity provider.
  • Contact claims. UserInfo releases a user's names and groups, not their address or phone number.
  • A second approval for company-wide changes in the console: one operator makes them.

Licence

TessariDB OAuth is licensed under the Business Source License 1.1. Production use is free, including use by and within a commercial company. Offering it to others as a hosted or managed identity, authentication or authorization service, or selling, renting or sublicensing it, needs a commercial licence. Each version converts to the Apache License 2.0 on the change date in its LICENSE. Write to licensing@tessaridb.com for other arrangements.