Skip to content

Webhook External User Library

If you already have a user library (e.g. LDAP), you can use a Webhook to forward login validation to it, so employees can log in directly with their existing accounts. This page explains how an administrator prepares and enables the Webhook user library.

This Is Not Single Sign-On (SSO)

Users still enter their username and password on the Kuboard login page; only the password validation is forwarded to the external user library. For single sign-on, see OIDC single sign-on.

How It Works

Once enabled, Kuboard calls your webhook URL at only two moments: when a user logs in, the username and password are sent to that address as a POST for authentication; when User Management is opened, a GET request fetches the paged user list in real time. The password of an external user library user exists only in your user library — Kuboard neither stores it nor can know it. After a user's first successful login, Kuboard automatically creates a local record (without the password) to hold local state such as MFA bindings and user group bindings; the authorization system (user groups, roles) applies to these users as well, see User Groups and MFA multi-factor authentication.

Step 1: Prepare a Webhook User Service

You only need to provide one HTTP address and implement two kinds of requests on the same address: a POST for authentication and a GET for the user list. This address is the "External User Webhook" URL you fill in later in Kuboard.

Authentication request (POST): sent at login; returns code = 0 on success:

json
// Request: POST {url}
{
  "username": "user01",
  "password": "password1"
}

// Response: authentication succeeded
{
  "code": 0,
  "message": "ok"
}

User list request (GET): sent when the User Management page is opened; supports an optional username filter, e.g. GET {url}?pageNum=1&pageSize=10&username=. On success it returns the paged user list:

json
// Response: success
{
  "code": 0,
  "message": "ok",
  "data": {
    "list": [
      {
        "username": "user01",
        "fullName": "User One",
        "email": "user01@example.com",
        "groups": ["developers"],
        "createTime": "2026-01-01T08:00:00.000+08:00"
      }
    ],
    "pageNum": 1,
    "pageSize": 10,
    "total": 1
  }
}

List item fields:

FieldRequiredDescription
usernameYesUsername (login name), the identifier Kuboard uses to recognize the user
fullNameNoFull name, displayed in the "Full Name" column
emailNoEmail address, displayed in the "Email" column
groupsNoExternal groups the user belongs to, displayed in "External Groups" of the expanded row
createTimeNoUser creation time

Return codes (the code field of the POST / GET responses):

codeMeaning and handling
0Success: authentication passed / list returned normally
1Authentication failed: login rejected, prompts that the username or password is incorrect
2User not found: login rejected with a unified "incorrect username or password" prompt, avoiding exposure of whether the account exists
3Internal error: returns a gateway error and displays message / details

The official project provides a complete LDAP integration example, eip-work/kuboard-v4-ldap-example (GitHub). After cloning, run docker compose up -d to get a configurable webhook user service.

Webhook URL Security

Kuboard calls the URL you fill in directly over HTTP, without attaching any signature or authentication request header. Please use HTTPS and validate the source on your service yourself (for example, restrict by IP or check a custom request header); the message / details fields appear in error messages — do not return sensitive information in them.

Step 2: Enable and Configure in Kuboard

Go to System Settings → User Authentication Settings; in the "External User Library" section, turn on the "Enable External User Webhook" toggle, fill in the "External User Webhook" service address, then click "Save".

URL Reachability

This URL is accessed by the Kuboard server (not the browser), so fill in an address resolvable inside the cluster; do not use localhost.

Step 3: Verify Login

Log out and return to the login page, select the "Webhook User Library" radio option, enter the external user's username and password, and log in. A return of code = 0 means the login succeeded.

Step 4: View and Manage External Users

  1. Go to System Management → Users & Permissions → Users, open the "Source" dropdown at the top-left, and select "Webhook User Library" — the table then shows the external user list.
ColumnDescription
SourceFixed as webhook
IDIdentifier of the local record; users who have never logged in show a "Never Logged In" tag
Full Name / EmailFrom the fullName / email returned by the webhook
MFAThe user's MFA binding status in Kuboard's local storage
Create TimeCreation time of the local record (i.e. the time of first login)

Click the expand arrow at the start of a row to view External Groups, Login & Security, and MFA details. The list fetches data from the webhook in real time every time it is opened — refresh the page to see account changes made in the external user library.

Available Operations

  • Bind to User Groups: add the external user to a local user group to grant permissions (the local record is created automatically if it does not exist yet)
  • Reset MFA: disenroll the user's MFA binding in Kuboard

Deletion Only Clears the Local Record

Deleting does not affect the account in the external user library, but clears the user's local state (MFA bindings, user group bindings); the record is recreated automatically on the next login or when queried again.

Comparison with the Built-in User Library

AspectBuilt-in user library (dao)Webhook user library (webhook)
Password storageKuboard local databaseOnly in the external user library; Kuboard does not store it
Account creationCreated by administrators in KuboardMaintained by the external user library; the local record is created automatically on first login
Password managementKuboard can reset / unlockKuboard does not manage passwords; these operations do not apply
Permission grantingUser groups + rolesAlso via user groups + roles, see User Groups
DeletionDeletes the local accountClears only the local record; does not affect the external account

API Documentation

The APIs involved in this section are described in the Swagger UI "Authentication APIs" group.