Skip to content

Basic Auth Configuration ​

HTTP Basic Authentication support with Authorization: Basic base64(username:password) header.

Overview ​

json
json
{
  "NpgsqlRest": {
    "AuthenticationOptions": {
      "BasicAuth": {
        "Enabled": false,
        "Realm": null,
        "Users": {},
        "SslRequirement": "Required",
        "UseDefaultPasswordHasher": true,
        "ChallengeCommand": null
      }
    }
  }
}

Settings ​

SettingTypeDefaultDescription
EnabledboolfalseEnable Basic Authentication support.
RealmstringnullAuthentication realm. Uses "NpgsqlRest" if null.
Usersobject{}Username/password dictionary. Value is password or hash depending on UseDefaultPasswordHasher.
SslRequirementstring"Required"SSL requirement: "Ignore", "Warning", or "Required".
UseDefaultPasswordHasherbooltrueExpect hashed passwords in configuration.
ChallengeCommandstringnullPostgreSQL command for authentication challenge.

SSL Requirement Values ​

ValueDescription
IgnoreAllow Basic Auth without SSL (debug log warning).
WarningIssue log warning when connection is not secure.
RequiredEnforce SSL/TLS connection.

Challenge Command Parameters ​

ParameterTypeDescription
$1textUsername from Basic Auth header.
$2textPassword from Basic Auth header.
$3boolPassword validation result (true/false/null if no password defined).
$4textBasic Auth realm.
$5textEndpoint path.

Static Users Example ​

Configure users directly in the configuration file:

json
json
{
  "NpgsqlRest": {
    "AuthenticationOptions": {
      "BasicAuth": {
        "Enabled": true,
        "Realm": "MyAPI",
        "SslRequirement": "Required",
        "UseDefaultPasswordHasher": false,
        "Users": {
          "admin": "secret123",
          "user1": "password456"
        }
      }
    }
  }
}

WARNING

When UseDefaultPasswordHasher is false, passwords are stored in plain text. Use hashed passwords in production.

Database Authentication Example ​

Use a PostgreSQL function for authentication challenge:

json
json
{
  "NpgsqlRest": {
    "AuthenticationOptions": {
      "BasicAuth": {
        "Enabled": true,
        "Realm": "MyAPI",
        "SslRequirement": "Required",
        "UseDefaultPasswordHasher": true,
        "ChallengeCommand": "select * from basic_auth_login($1, $2, $3)"
      }
    }
  }
}

Challenge Function Example ​

sql
sql
create function basic_auth_login(
    _username text,
    _password text,
    _validated bool
)
returns table (
    status bool,
    user_id int,
    user_name text,
    user_roles text[]
)
language plpgsql as $$
begin
    -- Check if password was validated by static users
    if _validated = true then
        return query
        select true, 1, _username, array['admin']::text[];
        return;
    end if;

    -- Validate against database
    return query
    select
        u.password_hash = crypt(_password, u.password_hash),
        u.id,
        u.username,
        array_agg(r.role_name)
    from users u
    left join user_roles r on r.user_id = u.id
    where u.username = _username
    group by u.id, u.username, u.password_hash;
end;
$$;

Equivalent as inline SQL:

ChallengeCommand is executed directly, so it does not have to call a function — any statement using $1–$5 works:

json
json
{
  "NpgsqlRest": {
    "AuthenticationOptions": {
      "BasicAuth": {
        "Enabled": true,
        "ChallengeCommand": "select u.password_hash = crypt($2, u.password_hash) as status, u.id as user_id, u.username as user_name, array_agg(r.role_name) as user_roles from users u left join user_roles r on r.user_id = u.id where u.username = $1 group by u.id, u.username, u.password_hash"
      }
    }
  }
}

Complete Example ​

Production configuration with Basic Authentication:

json
json
{
  "NpgsqlRest": {
    "AuthenticationOptions": {
      "BasicAuth": {
        "Enabled": true,
        "Realm": "MyAPI",
        "SslRequirement": "Required",
        "UseDefaultPasswordHasher": true,
        "ChallengeCommand": "select * from basic_auth_login($1, $2, $3)"
      }
    }
  }
}

Next Steps ​

See Also ​

Comments