# proxy_server_auth_rfc1929

{{since('2026.03.04-bb93ecb1')}}

```lua
kumo.on(
  'proxy_server_auth_rfc1929',
  function(username, password, conn_meta) end
)
```

Called by the proxy server when a client attempts RFC 1929 username/password
authentication.

!!! note
    This event is only available to the `proxy-server` executable.

This event is triggered when [require_auth](../proxy/start_proxy_listener/require_auth.md)
is enabled on the proxy listener, or when a client offers username/password
authentication even if not required.

The event handler receives the following parameters:

* *username* - the username provided by the client
* *password* - the password provided by the client
* *conn_meta* - a table containing connection metadata:
    * `peer_address` - the client's socket address (IP and port)
    * `local_address` - the server's socket address (IP and port)

The proxy server expects the event handler to return either a bool value or
an `AuthInfo` value.

If it returns `true` then it considers the credentials to be valid and will
allow the client to use the proxy. If it returns `false` then the
authentication attempt is considered to have failed and the connection will
be closed.

This example shows how to implement a simple inline password database:

```lua
kumo.on('proxy_server_auth_rfc1929', function(username, password, conn_meta)
  -- This is just an example of how to populate the return value,
  -- not a recommended way to handle passwords in production!
  local password_database = {
    ['proxyuser'] = 'secretpassword',
  }
  if password == '' then
    return false
  end
  return password_database[username] == password
end)
```

## Returning Group and Identity Information

Rather than just returning a boolean to indicate whether authentication was
successful, you may return an [AuthInfo](../kumo.aaa/auth_info.md) object
holding additional information. Here's an expanded version of the example
above that shows how you can return group membership:

```lua
local password_database = {
  ['proxyuser'] = {
    password = 'secretpassword',
    groups = { 'proxy-users', 'premium-tier' },
  },
}

kumo.on('proxy_server_auth_rfc1929', function(username, password, conn_meta)
  local entry = password_database[username]
  if not entry then
    return false
  end
  if entry.password ~= password then
    return false
  end

  -- Return an AuthInfo that lists the identity and group membership
  return {
    identities = {
      { identity = username, context = 'ProxyAuthRfc1929' },
    },
    groups = entry.groups,
  }
end)
```

