Skip to main content
Version: 2.1

Backend Plugins

Nauthilus allows you to implement custom authentication backends using Lua. This is particularly useful for integrating with custom databases or legacy systems. With the introduction of the native Identity Provider, the Backend API has been extended to support Multi-Factor Authentication (MFA) and WebAuthn.

Core Backend Functions​

To implement a custom backend, you need to define specific functions in your Lua scripts. These functions are called by Nauthilus during various phases of authentication and user management.

nauthilus_backend_verify_password​

This is the primary function for user authentication.

Syntax​

function nauthilus_backend_verify_password(request)
-- ... implementation ...
return result_code, result_object
end

Request Parameters (request table)​

  • username (string): The username provided by the user.
  • password (string): The password provided by the user (empty if no_auth is true).
  • protocol (string): The protocol being used (e.g., imap, smtp, oidc, saml).
  • no_auth (boolean): If true, only user lookup and attribute retrieval should be performed, skipping password verification.
  • oidc_cid (string): The OIDC Client ID (if applicable).
  • saml_entity_id (string): The SAML Entity ID (if applicable).

Returns​

  • result_code (number): One of the nauthilus_builtin.BACKEND_RESULT_* constants.
  • result_object (table): A nauthilus_backend_result object containing authentication status and user attributes.

nauthilus_backend_list_accounts​

Used to retrieve a list of all user accounts.

Syntax​

function nauthilus_backend_list_accounts()
-- ... implementation ...
return result_code, accounts_table
end

Returns​

  • result_code (number): Success or error code.
  • accounts_table (table): A simple list of strings containing usernames.

MFA & WebAuthn Support​

The following functions are used by the Identity Provider to manage secondary authentication factors.

TOTP Management​

nauthilus_backend_add_totp(request)​

Stores a new TOTP shared secret for a user.

  • request.username: The user's account name.
  • request.totp_secret: The encrypted or plain TOTP secret.

nauthilus_backend_delete_totp(request)​

Removes the TOTP shared secret for a user.

  • request.username: The user's account name.

Recovery Codes​

nauthilus_backend_add_totp_recovery_codes(request)​

Stores a list of recovery codes for a user.

  • request.username: The user's account name.
  • request.totp_recovery_codes: A table (list) of recovery code strings.

nauthilus_backend_delete_totp_recovery_codes(request)​

Removes all recovery codes for a user.

  • request.username: The user's account name.

WebAuthn (FIDO2) Management​

nauthilus_backend_get_webauthn_credentials(request)​

Retrieves all registered WebAuthn credentials for a user.

  • request.username: The user's account name.
  • Returns: result_code, credentials_table (list of JSON strings).

nauthilus_backend_save_webauthn_credential(request)​

Registers a new WebAuthn credential.

  • request.username: The user's account name.
  • request.webauthn_credential: The serialized JSON representation of the credential.

nauthilus_backend_delete_webauthn_credential(request)​

Deletes a specific WebAuthn credential.

  • request.username: The user's account name.
  • request.webauthn_credential: The exact JSON string of the credential to delete.

nauthilus_backend_update_webauthn_credential(request)​

Updates an existing WebAuthn credential (e.g., updating the sign count).

  • request.username: The user's account name.
  • request.webauthn_old_credential: The old JSON string.
  • request.webauthn_credential: The new JSON string.

Return Codes​

The following constants are available via the nauthilus_builtin module:

ConstantDescription
BACKEND_RESULT_OKOperation completed successfully.
BACKEND_RESULT_ERRORA generic error occurred.
BACKEND_RESULT_NOT_FOUNDThe user or resource was not found.
BACKEND_RESULT_DENIEDAccess was explicitly denied.

Example Backend Result​

local b = nauthilus_backend_result.new()
b:authenticated(true)
b:user_found(true)
b:account_field("account")
b:attributes({
mail = "user@example.com",
display_name = "John Doe"
})
return nauthilus_builtin.BACKEND_RESULT_OK, b