Mercurial > prosody-modules
view mod_auth_oauth_external/README.md @ 6319:04c3273cb81f
mod_auth_cyrus: Add empty 'profile' table to SASL handler objects
This is for compatibility with Prosody's built-in util.sasl objects.
A SASL profile table usually includes methods supported by the backend, which
can be used by SASL mechanism handlers to perform operations (such as testing
the password). It also optionally contains a 'cb' field with channel binding
method handlers.
The Cyrus backend doesn't support channel binding, and doesn't have the same
concept of auth backend methods (it handles all that internally, and Prosody
has no insight or control over it).
Thus, we create an empty profile which informs Prosody that the SASL handler
does not support any of the auth or channel binding methods. Some features
will not work, but they didn't work anyway. This just makes it explicit.
This fixes a traceback in mod_sasl2_fast, which expected SASL handlers to
always contain a 'profile' field.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 04 Sep 2025 10:14:46 +0100 |
| parents | cce76628c83a |
| children | 8f65b23a5fd2 |
line wrap: on
line source
--- summary: Authenticate against an external OAuth 2 IdP labels: - Stage-Alpha --- This module provides external authentication via an external [OAuth 2](https://datatracker.ietf.org/doc/html/rfc7628) authorization server and supports the [SASL OAUTHBEARER authentication][rfc7628] mechanism as well as PLAIN for legacy clients (this is all of them). # How it works Using OAuth 2.0 in XMPP is explained in [XEP-0493: OAuth Client Login]. Clients pass tokens from the Authorization Server to Prosody, which attempts to validate the tokens using the configured validation endpoint. Legacy clients have to use SASL PLAIN, where Prosody receives the users username and password and attempts to validate this using the OAuth 2 resource owner password grant. # Configuration ## Example ```lua -- authentication = "oauth_external" oauth_external_discovery_url = "https//auth.example.com/auth/realms/TheRealm/.well-known/openid-configuration" oauth_external_token_endpoint = "https//auth.example.com/auth/realms/TheRealm/protocol/openid-connect/token" oauth_external_validation_endpoint = "https//auth.example.com/auth/realms/TheRealm/protocol/openid-connect/userinfo" oauth_external_username_field = "xmpp_username" ``` ## Common `oauth_external_issuer` : Optional URL string representing the Authorization server identity. `oauth_external_discovery_url` : Optional URL string pointing to [OAuth 2.0 Authorization Server Metadata](https://oauth.net/2/authorization-server-metadata/). Lets clients discover where they should retrieve access tokens from if they don't have one yet. Default based on `oauth_external_issuer` is set, otherwise empty. `oauth_external_validation_endpoint` : URL string. The token validation endpoint, should validate the token and return a JSON structure containing the username of the user logging in the field specified by `oauth_external_username_field`. Commonly the [OpenID `UserInfo` endpoint](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) If left unset, only `SASL PLAIN` is supported and the username provided there is assumed correct. `oauth_external_username_field` : String. Default is `"preferred_username"`. Field in the JSON structure returned by the validation endpoint that contains the XMPP localpart. ## For SASL PLAIN `oauth_external_resource_owner_password` : Boolean. Defaults to `true`. Whether to allow the *insecure* [resource owner password grant](https://oauth.net/2/grant-types/password/) and SASL PLAIN. `oauth_external_token_endpoint` : URL string. OAuth 2 [Token Endpoint](https://www.rfc-editor.org/rfc/rfc6749#section-3.2) used to retrieve token in order to then retrieve the username. `oauth_external_client_id` : String. Client ID used to identify Prosody during the resource owner password grant. `oauth_external_client_secret` : String. Client secret used to identify Prosody during the resource owner password grant. `oauth_external_scope` : String. Defaults to `"openid"`. Included in request for resource owner password grant. # Compatibility ## Prosody Version Status --------- ----------------------------------------------- trunk works 0.12.x OAUTHBEARER will not work, otherwise untested 0.11.x OAUTHBEARER will not work, otherwise untested ## Identity Provider Tested with - [KeyCloak](https://www.keycloak.org/) - [Mastodon](https://joinmastodon.org/) # Future work - Automatically discover endpoints from Discovery URL - Configurable input username mapping (e.g. user → user@host). - [SCRAM over HTTP?!][rfc7804]
