Package org.keycloak.broker.oidc
Class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityProviderConfig>
java.lang.Object
org.keycloak.broker.provider.AbstractIdentityProvider<C>
org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider<C>
- All Implemented Interfaces:
org.keycloak.broker.provider.ExchangeExternalToken,org.keycloak.broker.provider.ExchangeTokenToIdentityProviderToken,org.keycloak.broker.provider.IdentityProvider<C>,org.keycloak.broker.provider.UserAuthenticationIdentityProvider<C>,org.keycloak.provider.Provider
- Direct Known Subclasses:
BitbucketIdentityProvider,FacebookIdentityProvider,GitHubIdentityProvider,InstagramIdentityProvider,MicrosoftIdentityProvider,OAuth2IdentityProvider,OIDCIdentityProvider,OpenshiftV4IdentityProvider,PayPalIdentityProvider,StackoverflowIdentityProvider
public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityProviderConfig>
extends org.keycloak.broker.provider.AbstractIdentityProvider<C>
implements org.keycloak.broker.provider.ExchangeTokenToIdentityProviderToken, org.keycloak.broker.provider.ExchangeExternalToken
- Author:
- Pedro Igor
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static classstatic classThis is a custom variant ofAccessTokenResponsewhich avoid primitives that would auto-add zero values to the original responses.Nested classes/interfaces inherited from interface org.keycloak.broker.provider.UserAuthenticationIdentityProvider
org.keycloak.broker.provider.UserAuthenticationIdentityProvider.AuthenticationCallback -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final Stringstatic final Stringstatic final Stringstatic final Stringprotected static final org.jboss.logging.Loggerprotected static com.fasterxml.jackson.databind.ObjectMapperstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final StringFields inherited from class org.keycloak.broker.provider.AbstractIdentityProvider
ACCOUNT_LINK_URL, BROKER_REGISTERED_NEW_USER, session, UPDATE_PROFILE_EMAIL_CHANGED, UPDATE_PROFILE_USERNAME_CHANGEDFields inherited from interface org.keycloak.broker.provider.UserAuthenticationIdentityProvider
EXTERNAL_IDENTITY_PROVIDER, FEDERATED_ACCESS_TOKEN -
Constructor Summary
ConstructorsConstructorDescriptionAbstractOAuth2IdentityProvider(org.keycloak.models.KeycloakSession session, C config) -
Method Summary
Modifier and TypeMethodDescriptioncom.fasterxml.jackson.databind.JsonNodeasJsonNode(String json) org.keycloak.http.simple.SimpleHttpRequestauthenticateTokenRequest(org.keycloak.http.simple.SimpleHttpRequest tokenRequest) voidauthenticationFinished(org.keycloak.sessions.AuthenticationSessionModel authSession, org.keycloak.broker.provider.BrokeredIdentityContext context) protected org.keycloak.http.simple.SimpleHttpRequestbuildUserInfoRequest(String subjectToken, String userInfoUrl) callback(org.keycloak.models.RealmModel realm, org.keycloak.broker.provider.UserAuthenticationIdentityProvider.AuthenticationCallback callback, org.keycloak.events.EventBuilder event) protected jakarta.ws.rs.core.UriBuildercreateAuthorizationUrl(org.keycloak.broker.provider.AuthenticationRequest request) protected org.keycloak.broker.provider.BrokeredIdentityContextdoGetFederatedIdentity(String accessToken) final org.keycloak.broker.provider.BrokeredIdentityContextexchangeExternal(org.keycloak.protocol.oidc.TokenExchangeProvider tokenExchangeProvider, org.keycloak.protocol.oidc.TokenExchangeContext tokenExchangeContext) voidexchangeExternalComplete(org.keycloak.models.UserSessionModel userSession, org.keycloak.broker.provider.BrokeredIdentityContext context, jakarta.ws.rs.core.MultivaluedMap<String, String> params) protected org.keycloak.broker.provider.BrokeredIdentityContextexchangeExternalImpl(org.keycloak.events.EventBuilder event, jakarta.ws.rs.core.MultivaluedMap<String, String> params) Usage with external-internal token-exchangeprotected org.keycloak.broker.provider.BrokeredIdentityContextexchangeExternalUserInfoValidationOnly(org.keycloak.events.EventBuilder event, jakarta.ws.rs.core.MultivaluedMap<String, String> params) jakarta.ws.rs.core.ResponseexchangeFromToken(jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.events.EventBuilder event, org.keycloak.models.ClientModel authorizedClient, org.keycloak.models.UserSessionModel tokenUserSession, org.keycloak.models.UserModel tokenSubject, jakarta.ws.rs.core.MultivaluedMap<String, String> params) protected jakarta.ws.rs.core.ResponseexchangeSessionToken(jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.events.EventBuilder event, org.keycloak.models.ClientModel authorizedClient, org.keycloak.models.UserSessionModel tokenUserSession, org.keycloak.models.UserModel tokenSubject) protected jakarta.ws.rs.core.ResponseexchangeStoredToken(jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.events.EventBuilder event, org.keycloak.models.ClientModel authorizedClient, org.keycloak.models.UserSessionModel tokenUserSession, org.keycloak.models.UserModel tokenSubject) protected org.keycloak.broker.provider.BrokeredIdentityContextextractIdentityFromProfile(org.keycloak.events.EventBuilder event, com.fasterxml.jackson.databind.JsonNode node) protected StringextractTokenFromResponse(String response, String tokenName) protected org.keycloak.representations.JsonWebTokenprotected Stringprotected abstract Stringorg.keycloak.broker.provider.BrokeredIdentityContextgetFederatedIdentity(String response) getJsonProperty(com.fasterxml.jackson.databind.JsonNode jsonNode, String name) Get JSON property as text.protected StringgetProfileEndpointForValidation(org.keycloak.events.EventBuilder event) protected org.keycloak.http.simple.SimpleHttpRequestgetRefreshTokenRequest(org.keycloak.models.KeycloakSession session, String refreshToken, String clientId, String clientSecret) protected org.keycloak.crypto.SignatureSignerContextprotected jakarta.ws.rs.core.ResponsehasExternalExchangeToken(org.keycloak.events.EventBuilder event, org.keycloak.models.UserSessionModel tokenUserSession, jakarta.ws.rs.core.MultivaluedMap<String, String> params) check to see if we have a token exchange in session in other words check to see if this session was created by an external exchangebooleanjakarta.ws.rs.core.ResponseperformLogin(org.keycloak.broker.provider.AuthenticationRequest request) jakarta.ws.rs.core.ResponseretrieveToken(org.keycloak.models.KeycloakSession session, org.keycloak.models.FederatedIdentityModel identity) jakarta.ws.rs.core.ResponseretrieveToken(org.keycloak.models.KeycloakSession session, org.keycloak.models.FederatedIdentityModel identity, org.keycloak.models.UserSessionModel userSession, org.keycloak.models.UserModel user) protected org.keycloak.representations.oidc.TokenMetadataRepresentationsendTokenIntrospectionRequest(String idpAccessToken, org.keycloak.events.EventBuilder event) Send introspection request as specified in the OAuth2 token introspection specification.protected booleanbooleanprotected org.keycloak.broker.provider.BrokeredIdentityContextvalidateExternalTokenThroughUserInfo(org.keycloak.events.EventBuilder event, String subjectToken, String subjectTokenType) protected voidvalidateExternalTokenWithIntrospectionEndpoint(org.keycloak.protocol.oidc.TokenExchangeContext tokenExchangeContext) Called usually during external-internal token exchange for validation of external token, which is the token issued by the IDP.Methods inherited from class org.keycloak.broker.provider.AbstractIdentityProvider
backchannelLogout, buildTokenResponse, close, exchangeErrorResponse, exchangeNotLinked, exchangeNotLinkedNoStore, exchangeNotSupported, exchangeTokenExpired, exchangeUnsupportedRequiredType, getFederatedAccessToken, getLinkingUrl, getMarshaller, importNewUser, keycloakInitiatedBrowserLogout, preprocessFederatedIdentity, setEmailVerified, updateBrokeredUser, updateEmailMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.keycloak.broker.provider.IdentityProvider
export, isMapperSupported, isType, reloadKeys
-
Field Details
-
logger
protected static final org.jboss.logging.Logger logger -
OAUTH2_GRANT_TYPE_REFRESH_TOKEN
- See Also:
-
OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE
- See Also:
-
FEDERATED_REFRESH_TOKEN
- See Also:
-
FEDERATED_TOKEN_EXPIRATION
- See Also:
-
ACCESS_DENIED
- See Also:
-
mapper
protected static com.fasterxml.jackson.databind.ObjectMapper mapper -
OAUTH2_PARAMETER_ACCESS_TOKEN
- See Also:
-
OAUTH2_PARAMETER_SCOPE
- See Also:
-
OAUTH2_PARAMETER_STATE
- See Also:
-
OAUTH2_PARAMETER_RESPONSE_TYPE
- See Also:
-
OAUTH2_PARAMETER_REDIRECT_URI
- See Also:
-
OAUTH2_PARAMETER_CODE
- See Also:
-
OAUTH2_PARAMETER_CLIENT_ID
- See Also:
-
OAUTH2_PARAMETER_CLIENT_SECRET
- See Also:
-
OAUTH2_PARAMETER_GRANT_TYPE
- See Also:
-
ACCESS_TOKEN_EXPIRATION
- See Also:
-
-
Constructor Details
-
AbstractOAuth2IdentityProvider
-
-
Method Details
-
callback
public Object callback(org.keycloak.models.RealmModel realm, org.keycloak.broker.provider.UserAuthenticationIdentityProvider.AuthenticationCallback callback, org.keycloak.events.EventBuilder event) - Specified by:
callbackin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<C extends OAuth2IdentityProviderConfig>- Overrides:
callbackin classorg.keycloak.broker.provider.AbstractIdentityProvider<C extends OAuth2IdentityProviderConfig>
-
performLogin
public jakarta.ws.rs.core.Response performLogin(org.keycloak.broker.provider.AuthenticationRequest request) - Specified by:
performLoginin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<C extends OAuth2IdentityProviderConfig>- Overrides:
performLoginin classorg.keycloak.broker.provider.AbstractIdentityProvider<C extends OAuth2IdentityProviderConfig>
-
retrieveToken
public jakarta.ws.rs.core.Response retrieveToken(org.keycloak.models.KeycloakSession session, org.keycloak.models.FederatedIdentityModel identity) - Specified by:
retrieveTokenin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<C extends OAuth2IdentityProviderConfig>
-
retrieveToken
public jakarta.ws.rs.core.Response retrieveToken(org.keycloak.models.KeycloakSession session, org.keycloak.models.FederatedIdentityModel identity, org.keycloak.models.UserSessionModel userSession, org.keycloak.models.UserModel user) - Specified by:
retrieveTokenin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<C extends OAuth2IdentityProviderConfig>
-
getRefreshTokenRequest
-
getConfig
- Specified by:
getConfigin interfaceorg.keycloak.broker.provider.IdentityProvider<C extends OAuth2IdentityProviderConfig>- Overrides:
getConfigin classorg.keycloak.broker.provider.AbstractIdentityProvider<C extends OAuth2IdentityProviderConfig>
-
extractTokenFromResponse
-
exchangeFromToken
public jakarta.ws.rs.core.Response exchangeFromToken(jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.events.EventBuilder event, org.keycloak.models.ClientModel authorizedClient, org.keycloak.models.UserSessionModel tokenUserSession, org.keycloak.models.UserModel tokenSubject, jakarta.ws.rs.core.MultivaluedMap<String, String> params) - Specified by:
exchangeFromTokenin interfaceorg.keycloak.broker.provider.ExchangeTokenToIdentityProviderToken
-
hasExternalExchangeToken
protected jakarta.ws.rs.core.Response hasExternalExchangeToken(org.keycloak.events.EventBuilder event, org.keycloak.models.UserSessionModel tokenUserSession, jakarta.ws.rs.core.MultivaluedMap<String, String> params) check to see if we have a token exchange in session in other words check to see if this session was created by an external exchange- Parameters:
tokenUserSession-params-- Returns:
-
exchangeStoredToken
protected jakarta.ws.rs.core.Response exchangeStoredToken(jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.events.EventBuilder event, org.keycloak.models.ClientModel authorizedClient, org.keycloak.models.UserSessionModel tokenUserSession, org.keycloak.models.UserModel tokenSubject) -
exchangeSessionToken
protected jakarta.ws.rs.core.Response exchangeSessionToken(jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.events.EventBuilder event, org.keycloak.models.ClientModel authorizedClient, org.keycloak.models.UserSessionModel tokenUserSession, org.keycloak.models.UserModel tokenSubject) -
getFederatedIdentity
-
getAccessTokenResponseParameter
-
doGetFederatedIdentity
protected org.keycloak.broker.provider.BrokeredIdentityContext doGetFederatedIdentity(String accessToken) -
createAuthorizationUrl
protected jakarta.ws.rs.core.UriBuilder createAuthorizationUrl(org.keycloak.broker.provider.AuthenticationRequest request) -
getJsonProperty
Get JSON property as text.Supports literal keys containing dots and nested lookup via dot-notation (e.g. "data.id" resolves json.data.id). Use backslash escaping for literal dots in nested paths (e.g. "data\.id" matches key "data.id"). See
JsonUtils.splitClaimPath(String).Resolution order: 1) Exact key match (literal) 2) Nested path lookup
JSON numbers and booleans are converted to text. Empty string is converted to null.
- Parameters:
jsonNode- to get property fromname- of property to get (supports dot-notation for nested paths, backslash-escaped dots for literal keys)- Returns:
- string value of the property or null.
-
asJsonNode
- Throws:
IOException
-
getDefaultScopes
-
authenticationFinished
public void authenticationFinished(org.keycloak.sessions.AuthenticationSessionModel authSession, org.keycloak.broker.provider.BrokeredIdentityContext context) - Specified by:
authenticationFinishedin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<C extends OAuth2IdentityProviderConfig>- Overrides:
authenticationFinishedin classorg.keycloak.broker.provider.AbstractIdentityProvider<C extends OAuth2IdentityProviderConfig>
-
authenticateTokenRequest
public org.keycloak.http.simple.SimpleHttpRequest authenticateTokenRequest(org.keycloak.http.simple.SimpleHttpRequest tokenRequest) -
generateToken
protected org.keycloak.representations.JsonWebToken generateToken() -
getSignatureContext
protected org.keycloak.crypto.SignatureSignerContext getSignatureContext() -
getProfileEndpointForValidation
-
extractIdentityFromProfile
protected org.keycloak.broker.provider.BrokeredIdentityContext extractIdentityFromProfile(org.keycloak.events.EventBuilder event, com.fasterxml.jackson.databind.JsonNode node) -
validateExternalTokenThroughUserInfo
-
buildUserInfoRequest
-
supportsExternalExchange
protected boolean supportsExternalExchange() -
isIssuer
- Specified by:
isIssuerin interfaceorg.keycloak.broker.provider.ExchangeExternalToken
-
exchangeExternal
public final org.keycloak.broker.provider.BrokeredIdentityContext exchangeExternal(org.keycloak.protocol.oidc.TokenExchangeProvider tokenExchangeProvider, org.keycloak.protocol.oidc.TokenExchangeContext tokenExchangeContext) - Specified by:
exchangeExternalin interfaceorg.keycloak.broker.provider.ExchangeExternalToken
-
exchangeExternalImpl
protected org.keycloak.broker.provider.BrokeredIdentityContext exchangeExternalImpl(org.keycloak.events.EventBuilder event, jakarta.ws.rs.core.MultivaluedMap<String, String> params) Usage with external-internal token-exchange- Parameters:
event- event builderparams- parameters of the token-exchange request- Returns:
- brokered identity context with the details about user from the IDP
-
validateExternalTokenWithIntrospectionEndpoint
protected void validateExternalTokenWithIntrospectionEndpoint(org.keycloak.protocol.oidc.TokenExchangeContext tokenExchangeContext) Called usually during external-internal token exchange for validation of external token, which is the token issued by the IDP. The validation of external token is done by calling OAuth2 introspection endpoint on the IDP side and validate if the response contains all the necessary claims and token is authorized for the token exchange (including validating of claims like aud from introspection response)- Parameters:
tokenExchangeContext- token exchange context with the external token (subject token) and other details related to token exchange- Throws:
ErrorResponseException- in case that validation failed for any reason
-
sendTokenIntrospectionRequest
protected org.keycloak.representations.oidc.TokenMetadataRepresentation sendTokenIntrospectionRequest(String idpAccessToken, org.keycloak.events.EventBuilder event) Send introspection request as specified in the OAuth2 token introspection specification. It requires- Parameters:
idpAccessToken- access token issued by the IDPevent- event builder- Returns:
- token metadata in case that token introspection was successful and token is valid and active
- Throws:
ErrorResponseException- in case that introspection response was not correct for any reason (other status than 200) or the token was not active
-
exchangeExternalUserInfoValidationOnly
-
exchangeExternalComplete
public void exchangeExternalComplete(org.keycloak.models.UserSessionModel userSession, org.keycloak.broker.provider.BrokeredIdentityContext context, jakarta.ws.rs.core.MultivaluedMap<String, String> params) - Specified by:
exchangeExternalCompletein interfaceorg.keycloak.broker.provider.ExchangeExternalToken
-
supportsLongStateParameter
public boolean supportsLongStateParameter()- Specified by:
supportsLongStateParameterin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<C extends OAuth2IdentityProviderConfig>
-