Package org.keycloak.broker.oidc
Class OIDCIdentityProvider
java.lang.Object
org.keycloak.broker.provider.AbstractIdentityProvider<C>
org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
org.keycloak.broker.oidc.OIDCIdentityProvider
- All Implemented Interfaces:
org.keycloak.broker.provider.ClientAssertionIdentityProvider<OIDCIdentityProviderConfig>,org.keycloak.broker.provider.ExchangeExternalToken,org.keycloak.broker.provider.ExchangeTokenToIdentityProviderToken,org.keycloak.broker.provider.IdentityProvider<OIDCIdentityProviderConfig>,org.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>,org.keycloak.broker.provider.TrustMaterialIdentityProvider<OIDCIdentityProviderConfig>,org.keycloak.broker.provider.UserAuthenticationIdentityProvider<OIDCIdentityProviderConfig>,org.keycloak.provider.Provider
- Direct Known Subclasses:
GitLabIdentityProvider,GoogleIdentityProvider,KeycloakOIDCIdentityProvider,LinkedInOIDCIdentityProvider
public class OIDCIdentityProvider
extends AbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
implements org.keycloak.broker.provider.ExchangeExternalToken, org.keycloak.broker.provider.ClientAssertionIdentityProvider<OIDCIdentityProviderConfig>, org.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>, org.keycloak.broker.provider.TrustMaterialIdentityProvider<OIDCIdentityProviderConfig>
- Author:
- Pedro Igor
-
Nested Class Summary
Nested ClassesNested classes/interfaces inherited from class org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider
AbstractOAuth2IdentityProvider.Endpoint, AbstractOAuth2IdentityProvider.OAuthResponseNested 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 Stringprotected static final org.jboss.logging.Loggerstatic final Stringstatic final Stringstatic final Stringstatic final StringFields inherited from class org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider
ACCESS_DENIED, ACCESS_TOKEN_EXPIRATION, FEDERATED_REFRESH_TOKEN, FEDERATED_TOKEN_EXPIRATION, mapper, OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE, OAUTH2_GRANT_TYPE_REFRESH_TOKEN, OAUTH2_PARAMETER_ACCESS_TOKEN, OAUTH2_PARAMETER_CLIENT_ID, OAUTH2_PARAMETER_CLIENT_SECRET, OAUTH2_PARAMETER_CODE, OAUTH2_PARAMETER_GRANT_TYPE, OAUTH2_PARAMETER_REDIRECT_URI, OAUTH2_PARAMETER_RESPONSE_TYPE, OAUTH2_PARAMETER_SCOPE, OAUTH2_PARAMETER_STATEFields 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
ConstructorsConstructorDescriptionOIDCIdentityProvider(org.keycloak.models.KeycloakSession session, OIDCIdentityProviderConfig config) -
Method Summary
Modifier and TypeMethodDescriptionvoidauthenticationFinished(org.keycloak.sessions.AuthenticationSessionModel authSession, org.keycloak.broker.provider.BrokeredIdentityContext context) voidbackchannelLogout(org.keycloak.models.KeycloakSession session, org.keycloak.models.UserSessionModel userSession, jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.models.RealmModel realm) protected voidbackchannelLogout(org.keycloak.models.UserSessionModel userSession, String idToken) 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.BrokeredIdentityContextexchangeExternalImpl(org.keycloak.events.EventBuilder event, jakarta.ws.rs.core.MultivaluedMap<String, String> params) Usage with external-internal token-exchangeprotected 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.BrokeredIdentityContextextractIdentity(org.keycloak.representations.AccessTokenResponse tokenResponse, String accessToken, org.keycloak.representations.JsonWebToken idToken) protected org.keycloak.broker.provider.BrokeredIdentityContextextractIdentityFromProfile(org.keycloak.events.EventBuilder event, com.fasterxml.jackson.databind.JsonNode userInfo) intprotected Stringorg.keycloak.broker.provider.BrokeredIdentityContextgetFederatedIdentity(String response) protected org.keycloak.crypto.KeyWrappergetIdentityProviderKeyWrapper(org.keycloak.jose.jws.JWSInput jws) intprotected StringgetProfileEndpointForValidation(org.keycloak.events.EventBuilder event) protected Stringprotected Stringprotected StringgetUsernameFromUserInfo(com.fasterxml.jackson.databind.JsonNode userInfo) booleanprotected booleanisAuthTimeExpired(org.keycloak.representations.JsonWebToken idToken, org.keycloak.sessions.AuthenticationSessionModel authSession) booleanbooleanprotected booleanisTokenTypeSupported(org.keycloak.representations.JsonWebToken parsedToken) booleanisType(org.keycloak.models.KeycloakSession session, org.keycloak.models.IdentityProviderType type) jakarta.ws.rs.core.ResponsekeycloakInitiatedBrowserLogout(org.keycloak.models.KeycloakSession session, org.keycloak.models.UserSessionModel userSession, jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.models.RealmModel realm) protected StringparseTokenInput(String encodedToken, boolean shouldBeSigned) Parses a JWT token that can be a JWE, JWS or JWE/JWS.voidpreprocessFederatedIdentity(org.keycloak.models.KeycloakSession session, org.keycloak.models.RealmModel realm, org.keycloak.broker.provider.BrokeredIdentityContext context) protected voidprocessAccessTokenResponse(org.keycloak.broker.provider.BrokeredIdentityContext context, org.keycloak.representations.AccessTokenResponse response) refreshTokenForLogout(org.keycloak.models.KeycloakSession session, org.keycloak.models.UserSessionModel userSession) Returns access token response as a string from a refresh token invocation on the remote OIDC brokerbooleanStream<org.keycloak.jose.jwk.JWK>resolveKeys(org.keycloak.broker.provider.TrustMaterialRequest request) protected voidsetEmailVerified(org.keycloak.models.UserModel user, org.keycloak.broker.provider.BrokeredIdentityContext context) protected booleanorg.keycloak.broker.provider.BrokeredIdentityContextvalidateAuthorizationGrantAssertion(org.keycloak.protocol.oidc.JWTAuthorizationGrantValidationContext context) protected org.keycloak.broker.provider.BrokeredIdentityContextvalidateExternalTokenThroughUserInfo(org.keycloak.events.EventBuilder event, String subjectToken, String subjectTokenType) protected final org.keycloak.broker.provider.BrokeredIdentityContextvalidateJwt(org.keycloak.events.EventBuilder event, String subjectToken, String subjectTokenType) org.keycloak.representations.JsonWebTokenvalidateToken(String encodedToken) protected org.keycloak.representations.JsonWebTokenvalidateToken(String encodedToken, boolean ignoreAudience) protected booleanverify(org.keycloak.jose.jws.JWSInput jws) booleanverifyClientAssertion(org.keycloak.authentication.ClientAuthenticationFlowContext context) protected booleanverifySignature(org.keycloak.jose.jws.JWSInput jws) Verify signature on given JWSMethods inherited from class org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider
asJsonNode, authenticateTokenRequest, buildUserInfoRequest, doGetFederatedIdentity, exchangeExternal, exchangeExternalComplete, exchangeExternalUserInfoValidationOnly, exchangeFromToken, extractTokenFromResponse, generateToken, getAccessTokenResponseParameter, getConfig, getJsonProperty, getRefreshTokenRequest, getSignatureContext, hasExternalExchangeToken, performLogin, retrieveToken, retrieveToken, sendTokenIntrospectionRequest, supportsLongStateParameter, validateExternalTokenWithIntrospectionEndpointMethods inherited from class org.keycloak.broker.provider.AbstractIdentityProvider
buildTokenResponse, close, exchangeErrorResponse, exchangeNotLinked, exchangeNotLinkedNoStore, exchangeNotSupported, exchangeTokenExpired, exchangeUnsupportedRequiredType, getFederatedAccessToken, getLinkingUrl, getMarshaller, importNewUser, 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.ExchangeExternalToken
exchangeExternal, exchangeExternalCompleteMethods inherited from interface org.keycloak.broker.provider.IdentityProvider
export, getConfig, isMapperSupportedMethods inherited from interface org.keycloak.provider.Provider
close
-
Field Details
-
logger
protected static final org.jboss.logging.Logger logger -
SCOPE_OPENID
- See Also:
-
FEDERATED_ID_TOKEN
- See Also:
-
USER_INFO
- See Also:
-
FEDERATED_ACCESS_TOKEN_RESPONSE
- See Also:
-
VALIDATED_ID_TOKEN
- See Also:
-
EXCHANGE_PROVIDER
- See Also:
-
VALIDATED_ACCESS_TOKEN
- See Also:
-
-
Constructor Details
-
OIDCIdentityProvider
public OIDCIdentityProvider(org.keycloak.models.KeycloakSession session, OIDCIdentityProviderConfig config)
-
-
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<OIDCIdentityProviderConfig>- Overrides:
callbackin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
isType
public boolean isType(org.keycloak.models.KeycloakSession session, org.keycloak.models.IdentityProviderType type) - Specified by:
isTypein interfaceorg.keycloak.broker.provider.IdentityProvider<OIDCIdentityProviderConfig>
-
refreshTokenForLogout
public String refreshTokenForLogout(org.keycloak.models.KeycloakSession session, org.keycloak.models.UserSessionModel userSession) Returns access token response as a string from a refresh token invocation on the remote OIDC broker- Parameters:
session-userSession-- Returns:
-
backchannelLogout
public void backchannelLogout(org.keycloak.models.KeycloakSession session, org.keycloak.models.UserSessionModel userSession, jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.models.RealmModel realm) - Specified by:
backchannelLogoutin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<OIDCIdentityProviderConfig>- Overrides:
backchannelLogoutin classorg.keycloak.broker.provider.AbstractIdentityProvider<OIDCIdentityProviderConfig>
-
backchannelLogout
-
keycloakInitiatedBrowserLogout
public jakarta.ws.rs.core.Response keycloakInitiatedBrowserLogout(org.keycloak.models.KeycloakSession session, org.keycloak.models.UserSessionModel userSession, jakarta.ws.rs.core.UriInfo uriInfo, org.keycloak.models.RealmModel realm) - Specified by:
keycloakInitiatedBrowserLogoutin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<OIDCIdentityProviderConfig>- Overrides:
keycloakInitiatedBrowserLogoutin classorg.keycloak.broker.provider.AbstractIdentityProvider<OIDCIdentityProviderConfig>
-
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) - Overrides:
exchangeStoredTokenin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
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) - Overrides:
exchangeSessionTokenin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
validateExternalTokenThroughUserInfo
protected org.keycloak.broker.provider.BrokeredIdentityContext validateExternalTokenThroughUserInfo(org.keycloak.events.EventBuilder event, String subjectToken, String subjectTokenType) - Overrides:
validateExternalTokenThroughUserInfoin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
processAccessTokenResponse
protected void processAccessTokenResponse(org.keycloak.broker.provider.BrokeredIdentityContext context, org.keycloak.representations.AccessTokenResponse response) -
getFederatedIdentity
- Overrides:
getFederatedIdentityin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
isAuthTimeExpired
protected boolean isAuthTimeExpired(org.keycloak.representations.JsonWebToken idToken, org.keycloak.sessions.AuthenticationSessionModel authSession) -
extractIdentity
protected org.keycloak.broker.provider.BrokeredIdentityContext extractIdentity(org.keycloak.representations.AccessTokenResponse tokenResponse, String accessToken, org.keycloak.representations.JsonWebToken idToken) throws IOException - Throws:
IOException
-
getusernameClaimNameForIdToken
-
getUserInfoUrl
-
getIdentityProviderKeyWrapper
protected org.keycloak.crypto.KeyWrapper getIdentityProviderKeyWrapper(org.keycloak.jose.jws.JWSInput jws) -
verify
protected boolean verify(org.keycloak.jose.jws.JWSInput jws) -
verifySignature
protected boolean verifySignature(org.keycloak.jose.jws.JWSInput jws) Verify signature on given JWS- Returns:
- true if signature was successfully verified with the keys available to identity provider
-
parseTokenInput
Parses a JWT token that can be a JWE, JWS or JWE/JWS. It returns the content as a string. If JWS is involved the signature is also validated. A IdentityBrokerException is thrown on any error.- Parameters:
encodedToken- The token in the encoded string format.shouldBeSigned- true if the token should be signed (id token), false if the token can be only encrypted and not signed (user info).- Returns:
- The content in string format.
-
validateToken
-
validateToken
protected org.keycloak.representations.JsonWebToken validateToken(String encodedToken, boolean ignoreAudience) -
authenticationFinished
public void authenticationFinished(org.keycloak.sessions.AuthenticationSessionModel authSession, org.keycloak.broker.provider.BrokeredIdentityContext context) - Specified by:
authenticationFinishedin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<OIDCIdentityProviderConfig>- Overrides:
authenticationFinishedin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
getDefaultScopes
- Specified by:
getDefaultScopesin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
isIssuer
- Specified by:
isIssuerin interfaceorg.keycloak.broker.provider.ExchangeExternalToken- Overrides:
isIssuerin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
supportsExternalExchange
protected boolean supportsExternalExchange()- Overrides:
supportsExternalExchangein classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
getProfileEndpointForValidation
- Overrides:
getProfileEndpointForValidationin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
extractIdentityFromProfile
protected org.keycloak.broker.provider.BrokeredIdentityContext extractIdentityFromProfile(org.keycloak.events.EventBuilder event, com.fasterxml.jackson.databind.JsonNode userInfo) - Overrides:
extractIdentityFromProfilein classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
getUsernameFromUserInfo
-
validateJwt
-
isTokenTypeSupported
protected boolean isTokenTypeSupported(org.keycloak.representations.JsonWebToken parsedToken) -
exchangeExternalImpl
protected org.keycloak.broker.provider.BrokeredIdentityContext exchangeExternalImpl(org.keycloak.events.EventBuilder event, jakarta.ws.rs.core.MultivaluedMap<String, String> params) Description copied from class:AbstractOAuth2IdentityProviderUsage with external-internal token-exchange- Overrides:
exchangeExternalImplin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>- Parameters:
event- event builderparams- parameters of the token-exchange request- Returns:
- brokered identity context with the details about user from the IDP
-
createAuthorizationUrl
protected jakarta.ws.rs.core.UriBuilder createAuthorizationUrl(org.keycloak.broker.provider.AuthenticationRequest request) - Overrides:
createAuthorizationUrlin classAbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig>
-
preprocessFederatedIdentity
public void preprocessFederatedIdentity(org.keycloak.models.KeycloakSession session, org.keycloak.models.RealmModel realm, org.keycloak.broker.provider.BrokeredIdentityContext context) - Specified by:
preprocessFederatedIdentityin interfaceorg.keycloak.broker.provider.UserAuthenticationIdentityProvider<OIDCIdentityProviderConfig>- Overrides:
preprocessFederatedIdentityin classorg.keycloak.broker.provider.AbstractIdentityProvider<OIDCIdentityProviderConfig>
-
reloadKeys
public boolean reloadKeys()- Specified by:
reloadKeysin interfaceorg.keycloak.broker.provider.IdentityProvider<OIDCIdentityProviderConfig>
-
resolveKeys
public Stream<org.keycloak.jose.jwk.JWK> resolveKeys(org.keycloak.broker.provider.TrustMaterialRequest request) - Specified by:
resolveKeysin interfaceorg.keycloak.broker.provider.TrustMaterialIdentityProvider<OIDCIdentityProviderConfig>
-
setEmailVerified
protected void setEmailVerified(org.keycloak.models.UserModel user, org.keycloak.broker.provider.BrokeredIdentityContext context) - Overrides:
setEmailVerifiedin classorg.keycloak.broker.provider.AbstractIdentityProvider<OIDCIdentityProviderConfig>
-
verifyClientAssertion
public boolean verifyClientAssertion(org.keycloak.authentication.ClientAuthenticationFlowContext context) throws Exception - Specified by:
verifyClientAssertionin interfaceorg.keycloak.broker.provider.ClientAssertionIdentityProvider<OIDCIdentityProviderConfig>- Throws:
Exception
-
validateAuthorizationGrantAssertion
public org.keycloak.broker.provider.BrokeredIdentityContext validateAuthorizationGrantAssertion(org.keycloak.protocol.oidc.JWTAuthorizationGrantValidationContext context) throws org.keycloak.broker.provider.IdentityBrokerException - Specified by:
validateAuthorizationGrantAssertionin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>- Throws:
org.keycloak.broker.provider.IdentityBrokerException
-
getAllowedClockSkew
public int getAllowedClockSkew()- Specified by:
getAllowedClockSkewin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>
-
isAssertionReuseAllowed
public boolean isAssertionReuseAllowed()- Specified by:
isAssertionReuseAllowedin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>
-
getAllowedAudienceForJWTGrant
- Specified by:
getAllowedAudienceForJWTGrantin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>
-
getMaxAllowedExpiration
public int getMaxAllowedExpiration()- Specified by:
getMaxAllowedExpirationin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>
-
getAssertionSignatureAlg
- Specified by:
getAssertionSignatureAlgin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>
-
isLimitAccessTokenExpiration
public boolean isLimitAccessTokenExpiration()- Specified by:
isLimitAccessTokenExpirationin interfaceorg.keycloak.broker.provider.JWTAuthorizationGrantProvider<OIDCIdentityProviderConfig>
-