Skip to content
Authentication & Authorization

OAuth2 & OpenID Connect identity and access management

With multi-realm tenancy and declarative, isomorphic permissions you can share between API, UI, and microservices.

Terminal

npx authup@latest start

  • API:http://localhost:3000/
  • Admin console:http://localhost:3000/console/admin

The fastest way to try Authup β€” no database required, SQLite storage only. Not for production. See the deployment guide

Features

What you get

A complete identity and access toolkit you can deploy as a service or embed as libraries.

Identity & Access

Manage users, clients, roles and permissions through one declarative API. Multi-tenant by design with realms.

OAuth2 & OIDC

Standards-compliant authorization, refresh, password and client-credentials grants with PKCE enforcement for public clients out of the box.

Multi-Realm Tenancy

Isolate users, clients and policies per realm. Mount any controller under /realms/:realmId for nested routing.

Isomorphic Permissions

Serialize policy bindings between server, browser and microservices. The same evaluator runs in API, UI and edge functions.

Identity Brokering

Federate via LDAP and OpenID Connect upstream providers. Map external attributes onto Authup users automatically.

Declarative Provisioning

Seed realms, roles, users and permissions from JSON, YAML or TypeScript files. Idempotent on every startup.

Quick Start

From zero to issuing tokens in three steps

Pull the image, point it at your database, and issue your first access token.

# .env
# Point these at your own PostgreSQL, Redis and public address.
USER_ADMIN_PASSWORD=start123

DB_TYPE=postgres
DB_HOST=postgres.example.com
DB_PORT=5432
DB_USERNAME=authup
DB_PASSWORD=secret
DB_DATABASE=authup

REDIS=redis://cache.example.com:6379
PUBLIC_URL=https://auth.example.com
Flagship deployment

One docker-compose.yml, full stack ready

The reference deployment wires the server, the consent UI, PostgreSQL and Redis into a single compose file. Bring it up locally, point a reverse proxy at it in production.

  • One Authup container serves the API, the login pages and both consoles
  • PostgreSQL or MySQL persisted in a named volume, Redis for session caching
  • Configured via environment variables, a mounted authup.yml file, or both
Read the Docker Compose guide
docker-compose.yml
services:
  server-core:
    image: authup/authup:latest
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - PUBLIC_URL=http://localhost:3000
      - DB_TYPE=postgres
      - DB_HOST=postgres
      - DB_USERNAME=authup
      - DB_PASSWORD=secret
      - DB_DATABASE=authup
      - REDIS=redis://redis:6379
    command: start
    depends_on: [postgres, redis]

  postgres:
    image: postgres:16
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=authup
      - POSTGRES_USER=authup
      - POSTGRES_PASSWORD=secret

  redis:
    image: redis:7

volumes:
  postgres_data: