Description
Expected Behavior
Be able to extend the AbstractWebClientReactiveOAuth2AccessTokenResponseClient
for custom AuthorizationGrantType
implementations not just the four default ones implemented in the spring security framework.
Current Behavior
The current implementation of the oauth2 AbstractWebClientReactiveOAuth2AccessTokenResponseClient
uses the type T extends AbstractOAuth2AuthorizationGrantRequest
which implies the ability to extend the AbstractOAuth2AuthorizationGrantRequest
and extend the AbstractWebClientReactiveOAuth2AccessTokenResponseClient
to implement a custom authorization grant. The AbstractWebClientReactiveOAuth2AccessTokenResponseClient
however has a package private constructor which restricts the ability to extend the mentioned class unless one puts the class in the org.springframework.security.oauth2.client.endpoint
in their codebase.
Context
The OAuth2 spec allows for custom implementations of the OAuth2 grants by defining a grant type as specified in
OAuth2 RFC 6749 Section 4.5: Extension Grants.
Current implementation of the AuthorizationGrantType allows for custom grant types to be defined and the extension of AbstractOAuth2AuthorizationGrantRequest allows that as well.
However the inability to extend the AbstractWebClientReactiveOAuth2AccessTokenResponseClient
leaves one with only one choice is to either duplicate the implementation in the afformentioned class, or write ones own implementation. Which is quite annoying when the base is already present in the framework code.
The request to allow for extension of this class has be done before i.e. #10836 but with a failed mention to provide for customisation it was declined. However there was no mention or thought of custom grant type support.
It would be great to be able to create a custom extension of the said class in our own package structure rather than having to either reimplement the internals of the AbstractWebClientReactiveOAuth2AccessTokenResponseClient
or place the new client into the org.springframework.security.oauth2.client.endpoint
package.