Skip to content

Authentication API

The Authentication API provides endpoints for user management, login, token handling, and authentication configuration.


Overview

All authentication endpoints are prefixed with /api/auth. When authentication is enabled, most other API endpoints require a valid JWT token in the Authorization: Bearer <token> header.


Endpoints

GET /api/auth/status

Returns the current authentication status.

Response

{
  "enabled": true,
  "has_users": true,
  "setup_skipped": false
}
Field Type Description
enabled boolean Whether authentication is currently required
has_users boolean Whether any user accounts exist
setup_skipped boolean Whether initial setup was skipped

POST /api/auth/login

Authenticates a user and returns JWT tokens.

Request body

{
  "username": "admin",
  "password": "yourpassword"
}

Response

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer"
}

Error responses

Status Description
401 Invalid credentials
403 User account is disabled

Example

curl -X POST http://localhost:8000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username": "admin", "password": "yourpassword"}'

POST /api/auth/refresh

Exchanges a refresh token for new access and refresh tokens.

Request body

{
  "refresh_token": "eyJhbGciOiJIUzI1NiIs..."
}

Response

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer"
}

Error responses

Status Description
401 Invalid or expired refresh token

POST /api/auth/verify

Verifies that an access token is valid.

Request body

{
  "token": "eyJhbGciOiJIUzI1NiIs..."
}

Response

{
  "valid": true,
  "username": "admin"
}

POST /api/auth/setup

Creates the first user account and enables authentication. Only works when no users exist.

Request body

{
  "username": "admin",
  "password": "yourpassword"
}

Response

{
  "message": "User created successfully",
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIs..."
}

Error responses

Status Description
400 Users already exist
422 Invalid username or password format

POST /api/auth/skip-setup

Skips the initial setup wizard, leaving authentication disabled.

Response

{
  "message": "Setup skipped, authentication disabled"
}

POST /api/auth/enable

Enables authentication. Requires at least one user to exist.

Response

{
  "message": "Authentication enabled"
}

Error responses

Status Description
400 No users exist - create a user first

POST /api/auth/disable

Disables authentication, allowing unauthenticated access to all endpoints.

Security warning

Disabling authentication exposes all DUMB functionality without any access control.

Response

{
  "message": "Authentication disabled"
}

User management endpoints

These endpoints require authentication when auth is enabled.

GET /api/auth/users

Lists all user accounts.

Response

{
  "users": [
    {
      "username": "admin",
      "disabled": false
    },
    {
      "username": "readonly",
      "disabled": true
    }
  ]
}

POST /api/auth/users

Creates a new user account.

Request body

{
  "username": "newuser",
  "password": "userpassword"
}

Response

{
  "message": "User created successfully",
  "username": "newuser"
}

Error responses

Status Description
400 Username already exists
422 Invalid username or password format

PUT /api/auth/users/{username}

Updates a user account (enable/disable).

Path parameters

Parameter Type Description
username string The username to update

Request body

{
  "disabled": true
}

Response

{
  "message": "User updated successfully",
  "username": "readonly",
  "disabled": true
}

Error responses

Status Description
400 Cannot disable the last active user
404 User not found

DELETE /api/auth/users/{username}

Deletes a user account.

Path parameters

Parameter Type Description
username string The username to delete

Response

{
  "message": "User deleted successfully"
}

Error responses

Status Description
400 Cannot delete the last active user
404 User not found

Token structure

JWT tokens contain the following claims:

{
  "sub": "admin",
  "exp": 1704067200,
  "type": "access"
}
Claim Description
sub Username (subject)
exp Expiration timestamp (Unix epoch)
type Token type: access or refresh

Token lifetimes

Token Type Default Lifetime
Access Token 60 minutes
Refresh Token 30 days

Using authentication with other endpoints

When authentication is enabled, include the access token in the Authorization header:

curl -X GET http://localhost:8000/api/process/processes \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

WebSocket authentication

For WebSocket connections, pass the token as a query parameter:

ws://localhost:8000/ws/status?token=eyJhbGciOiJIUzI1NiIs...

Error handling

Common error responses

Status Error Description
401 Unauthorized Missing or invalid token
401 Token expired Access token has expired
403 Forbidden User account is disabled
422 Validation Error Invalid request body

Token refresh flow

When receiving a 401 response:

  1. Send the refresh token to POST /api/auth/refresh
  2. If successful, retry the original request with the new access token
  3. If refresh fails, redirect the user to login