Skip to content

feat: add revokeToken() to OAuth2Client (RFC 7009)#4

Merged
ralflang merged 1 commit into
horde:FRAMEWORK_6_0from
jcdelepine:feat/OidcIntegration
Jun 14, 2026
Merged

feat: add revokeToken() to OAuth2Client (RFC 7009)#4
ralflang merged 1 commit into
horde:FRAMEWORK_6_0from
jcdelepine:feat/OidcIntegration

Conversation

@jcdelepine

@jcdelepine jcdelepine commented Jun 13, 2026

Copy link
Copy Markdown

Implements token revocation per RFC 7009 as a new revokeToken() method
on OAuth2Client.

The method sends a POST to the provider's revocation_endpoint with the
token, its type hint, and the client credentials. If no revocation endpoint
is configured, it throws OAuthException. HTTP 4xx responses from the
provider are also surfaced as OAuthException.

Intended to be used by OIDC pre-logout handlers to revoke access and
refresh tokens at the IdP before clearing the local session.

Includes unit tests covering: POST to correct endpoint, body contents,
default hint, absent client secret, missing endpoint, and error response.

@ralflang My OIDC login implementation is ready. This is PR 1 of 3 required to
continue the implementation.

@ralflang ralflang self-requested a review June 14, 2026 16:35
@ralflang

Copy link
Copy Markdown
Member

Required for horde/base#109


$body = $this->streamFactory->createStream(http_build_query($params));

$request = $this->requestFactory->createRequest('POST', $this->provider->revocationEndpoint)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a bug but:

RFC 7009 §2.1 only says "the client also includes its authentication credentials" without prescribing the method, so this is spec-compliant.

Providers that advertise basic only on the revocation endpoint will reject the request.

Should we check tokenEndpointAuthMethodsSupported?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, I should have reused the same logic as tokenRequest().
The revocation endpoint often shares the same auth method as the token
endpoint. I'll apply the same tokenEndpointAuthMethodsSupported check:
use HTTP Basic when client_secret_basic is advertised exclusively,
falling back to client_secret_post otherwise.

@ralflang ralflang merged commit d9199f4 into horde:FRAMEWORK_6_0 Jun 14, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in Service Integrations Jun 14, 2026
@ralflang

Copy link
Copy Markdown
Member

Thank you for providing this!

ralflang pushed a commit that referenced this pull request Jun 15, 2026
Follows up on #4.

RFC 7009 §2.1 does not prescribe the client authentication method for
the revocation endpoint. Providers that advertise client_secret_basic
only will reject a request that sends credentials in the POST body.

Apply the same tokenEndpointAuthMethodsSupported check as tokenRequest():
use HTTP Basic when client_secret_basic is advertised exclusively,
fall back to client_secret_post otherwise.

Adds two tests covering the Basic and mixed-methods cases.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Development

Successfully merging this pull request may close these issues.

2 participants