keycloak-service
クラス | 公開メンバ関数 | 静的公開メンバ関数 | 限定公開メンバ関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.services.resources.IdentityBrokerService クラス
org.keycloak.services.resources.IdentityBrokerService の継承関係図
Inheritance graph
org.keycloak.services.resources.IdentityBrokerService 連携図
Collaboration graph

クラス

class  ParsedCodeContext
 

公開メンバ関数

 IdentityBrokerService (RealmModel realmModel)
 
void init ()
 
Response clientIntiatedAccountLinkingPreflight (@PathParam("provider_id") String providerId)
 
Response clientInitiatedAccountLinking (@PathParam("provider_id") String providerId, @QueryParam("redirect_uri") String redirectUri, @QueryParam("client_id") String clientId, @QueryParam("nonce") String nonce, @QueryParam("hash") String hash)
 
Response performPostLogin (@PathParam("provider_id") String providerId, @QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
 
Response performLogin (@PathParam("provider_id") String providerId, @QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
 
Object getEndpoint (@PathParam("provider_id") String providerId)
 
Response retrieveTokenPreflight ()
 
Response retrieveToken (@PathParam("provider_id") String providerId)
 
Response authenticated (BrokeredIdentityContext context)
 
Response validateUser (AuthenticationSessionModel authSession, UserModel user, RealmModel realm)
 
Response afterFirstBrokerLogin (@QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
 
Response afterPostBrokerLoginFlow (@QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
 
Response cancelled (String code)
 
Response error (String code, String message)
 

静的公開メンバ関数

static IdentityProvider getIdentityProvider (KeycloakSession session, RealmModel realm, String alias)
 
static IdentityProviderFactory getIdentityProviderFactory (KeycloakSession session, IdentityProviderModel model)
 

限定公開メンバ関数

Response browserAuthentication (AuthenticationSessionModel authSession, String errorMessage)
 

非公開メンバ関数

void checkRealm ()
 
ClientModel checkClient (String clientId)
 
boolean canReadBrokerToken (AccessToken token)
 
Response getToken (String providerId, boolean forceRetrieval)
 
Response afterFirstBrokerLogin (ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
 
Response finishOrRedirectToPostBrokerLogin (AuthenticationSessionModel authSession, BrokeredIdentityContext context, boolean wasFirstBrokerLogin, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
 
Response afterPostBrokerLoginFlowSuccess (AuthenticationSessionModel authSession, BrokeredIdentityContext context, boolean wasFirstBrokerLogin, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
 
Response finishBrokerAuthentication (BrokeredIdentityContext context, UserModel federatedUser, AuthenticationSessionModel authSession, String providerId)
 
boolean shouldPerformAccountLinking (AuthenticationSessionModel authSession, UserSessionModel userSession, String providerId)
 
Response performAccountLinking (AuthenticationSessionModel authSession, UserSessionModel userSession, BrokeredIdentityContext context, FederatedIdentityModel newModel, UserModel federatedUser)
 
Response redirectToErrorWhenLinkingFailed (AuthenticationSessionModel authSession, String message, Object... parameters)
 
void updateFederatedIdentity (BrokeredIdentityContext context, UserModel federatedUser)
 
void updateToken (BrokeredIdentityContext context, UserModel federatedUser, FederatedIdentityModel federatedIdentityModel)
 
ParsedCodeContext parseEncodedSessionCode (String encodedCode)
 
ParsedCodeContext parseSessionCode (String code, String clientId, String tabId)
 
ParsedCodeContext samlIdpInitiatedSSO (final String clientUrlName)
 
Response checkAccountManagementFailedLinking (AuthenticationSessionModel authSession, String error, Object... parameters)
 
AuthenticationRequest createAuthenticationRequest (String providerId, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
 
String getRedirectUri (String providerId)
 
Response redirectToErrorPage (AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
 
Response redirectToErrorPage (Response.Status status, String message, Object ... parameters)
 
Response redirectToErrorPage (AuthenticationSessionModel authSession, Response.Status status, String message, Throwable throwable, Object ... parameters)
 
Response redirectToAccountErrorPage (AuthenticationSessionModel authSession, String message, Object ... parameters)
 
Response badRequest (String message)
 
Response forbidden (String message)
 
IdentityProviderModel getIdentityProviderConfig (String providerId)
 
Response corsResponse (Response response, ClientModel clientModel)
 
void fireErrorEvent (String message, Throwable throwable)
 
void fireErrorEvent (String message)
 
boolean isDebugEnabled ()
 
void rollback ()
 

非公開変数類

final RealmModel realmModel
 
KeycloakSession session
 
ClientConnection clientConnection
 
HttpRequest request
 
HttpHeaders headers
 
EventBuilder event
 

静的非公開変数類

static final String LINKING_IDENTITY_PROVIDER = "LINKING_IDENTITY_PROVIDER"
 
static final Logger logger = Logger.getLogger(IdentityBrokerService.class)
 

詳解

著者
Pedro Igor

構築子と解体子

◆ IdentityBrokerService()

org.keycloak.services.resources.IdentityBrokerService.IdentityBrokerService ( RealmModel  realmModel)
inline
144  {
145  if (realmModel == null) {
146  throw new IllegalArgumentException("Realm can not be null.");
147  }
148  this.realmModel = realmModel;
149  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127

関数詳解

◆ afterFirstBrokerLogin() [1/2]

Response org.keycloak.services.resources.IdentityBrokerService.afterFirstBrokerLogin ( @QueryParam(LoginActionsService.SESSION_CODE) String  code,
@QueryParam("client_id") String  clientId,
@QueryParam(Constants.TAB_ID) String  tabId 
)
inline
600  {
601  ParsedCodeContext parsedCode = parseSessionCode(code, clientId, tabId);
602  if (parsedCode.response != null) {
603  return parsedCode.response;
604  }
605  return afterFirstBrokerLogin(parsedCode.clientSessionCode);
606  }
ParsedCodeContext parseSessionCode(String code, String clientId, String tabId)
Definition: IdentityBrokerService.java:988
Response afterFirstBrokerLogin(@QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
Definition: IdentityBrokerService.java:598

◆ afterFirstBrokerLogin() [2/2]

Response org.keycloak.services.resources.IdentityBrokerService.afterFirstBrokerLogin ( ClientSessionCode< AuthenticationSessionModel >  clientSessionCode)
inlineprivate
608  {
609  AuthenticationSessionModel authSession = clientSessionCode.getClientSession();
610 
611  try {
612  this.event.detail(Details.CODE_ID, authSession.getParentSession().getId())
613  .removeDetail("auth_method");
614 
615  SerializedBrokeredIdentityContext serializedCtx = SerializedBrokeredIdentityContext.readFromAuthenticationSession(authSession, AbstractIdpAuthenticator.BROKERED_CONTEXT_NOTE);
616  if (serializedCtx == null) {
617  throw new IdentityBrokerException("Not found serialized context in clientSession");
618  }
619  BrokeredIdentityContext context = serializedCtx.deserialize(session, authSession);
620  String providerId = context.getIdpConfig().getAlias();
621 
622  event.detail(Details.IDENTITY_PROVIDER, providerId);
623  event.detail(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
624 
625  // Ensure the first-broker-login flow was successfully finished
626  String authProvider = authSession.getAuthNote(AbstractIdpAuthenticator.FIRST_BROKER_LOGIN_SUCCESS);
627  if (authProvider == null || !authProvider.equals(providerId)) {
628  throw new IdentityBrokerException("Invalid request. Not found the flag that first-broker-login flow was finished");
629  }
630 
631  // firstBrokerLogin workflow finished. Removing note now
632  authSession.removeAuthNote(AbstractIdpAuthenticator.BROKERED_CONTEXT_NOTE);
633 
634  UserModel federatedUser = authSession.getAuthenticatedUser();
635  if (federatedUser == null) {
636  throw new IdentityBrokerException("Couldn't found authenticated federatedUser in authentication session");
637  }
638 
639  event.user(federatedUser);
640  event.detail(Details.USERNAME, federatedUser.getUsername());
641 
642  if (context.getIdpConfig().isAddReadTokenRoleOnCreate()) {
643  ClientModel brokerClient = realmModel.getClientByClientId(Constants.BROKER_SERVICE_CLIENT_ID);
644  if (brokerClient == null) {
645  throw new IdentityBrokerException("Client 'broker' not available. Maybe realm has not migrated to support the broker token exchange service");
646  }
647  RoleModel readTokenRole = brokerClient.getRole(Constants.READ_TOKEN_ROLE);
648  federatedUser.grantRole(readTokenRole);
649  }
650 
651  // Add federated identity link here
652  FederatedIdentityModel federatedIdentityModel = new FederatedIdentityModel(context.getIdpConfig().getAlias(), context.getId(),
653  context.getUsername(), context.getToken());
654  session.users().addFederatedIdentity(realmModel, federatedUser, federatedIdentityModel);
655 
656 
657  String isRegisteredNewUser = authSession.getAuthNote(AbstractIdpAuthenticator.BROKER_REGISTERED_NEW_USER);
658  if (Boolean.parseBoolean(isRegisteredNewUser)) {
659 
660  logger.debugf("Registered new user '%s' after first login with identity provider '%s'. Identity provider username is '%s' . ", federatedUser.getUsername(), providerId, context.getUsername());
661 
662  context.getIdp().importNewUser(session, realmModel, federatedUser, context);
663  Set<IdentityProviderMapperModel> mappers = realmModel.getIdentityProviderMappersByAlias(providerId);
664  if (mappers != null) {
665  KeycloakSessionFactory sessionFactory = session.getKeycloakSessionFactory();
666  for (IdentityProviderMapperModel mapper : mappers) {
667  IdentityProviderMapper target = (IdentityProviderMapper)sessionFactory.getProviderFactory(IdentityProviderMapper.class, mapper.getIdentityProviderMapper());
668  target.importNewUser(session, realmModel, federatedUser, mapper, context);
669  }
670  }
671 
672  if (context.getIdpConfig().isTrustEmail() && !Validation.isBlank(federatedUser.getEmail()) && !Boolean.parseBoolean(authSession.getAuthNote(AbstractIdpAuthenticator.UPDATE_PROFILE_EMAIL_CHANGED))) {
673  logger.debugf("Email verified automatically after registration of user '%s' through Identity provider '%s' ", federatedUser.getUsername(), context.getIdpConfig().getAlias());
674  federatedUser.setEmailVerified(true);
675  }
676 
677  event.event(EventType.REGISTER)
678  .detail(Details.REGISTER_METHOD, "broker")
679  .detail(Details.EMAIL, federatedUser.getEmail())
680  .success();
681 
682  } else {
683  logger.debugf("Linked existing keycloak user '%s' with identity provider '%s' . Identity provider username is '%s' .", federatedUser.getUsername(), providerId, context.getUsername());
684 
685  event.event(EventType.FEDERATED_IDENTITY_LINK)
686  .success();
687 
688  updateFederatedIdentity(context, federatedUser);
689  }
690 
691  return finishOrRedirectToPostBrokerLogin(authSession, context, true, clientSessionCode);
692 
693  } catch (Exception e) {
694  return redirectToErrorPage(authSession, Response.Status.INTERNAL_SERVER_ERROR, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR, e);
695  }
696  }
static< CLIENT_SESSION extends CommonClientSessionModel > CLIENT_SESSION getClientSession(String code, String tabId, KeycloakSession session, RealmModel realm, ClientModel client, EventBuilder event, Class< CLIENT_SESSION > sessionClass)
Definition: ClientSessionCode.java:135
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
Response finishOrRedirectToPostBrokerLogin(AuthenticationSessionModel authSession, BrokeredIdentityContext context, boolean wasFirstBrokerLogin, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:699
void updateFederatedIdentity(BrokeredIdentityContext context, UserModel federatedUser)
Definition: IdentityBrokerService.java:951

◆ afterPostBrokerLoginFlow()

Response org.keycloak.services.resources.IdentityBrokerService.afterPostBrokerLoginFlow ( @QueryParam(LoginActionsService.SESSION_CODE) String  code,
@QueryParam("client_id") String  clientId,
@QueryParam(Constants.TAB_ID) String  tabId 
)
inline
731  {
732  ParsedCodeContext parsedCode = parseSessionCode(code, clientId, tabId);
733  if (parsedCode.response != null) {
734  return parsedCode.response;
735  }
736  AuthenticationSessionModel authenticationSession = parsedCode.clientSessionCode.getClientSession();
737 
738  try {
739  SerializedBrokeredIdentityContext serializedCtx = SerializedBrokeredIdentityContext.readFromAuthenticationSession(authenticationSession, PostBrokerLoginConstants.PBL_BROKERED_IDENTITY_CONTEXT);
740  if (serializedCtx == null) {
741  throw new IdentityBrokerException("Not found serialized context in clientSession. Note " + PostBrokerLoginConstants.PBL_BROKERED_IDENTITY_CONTEXT + " was null");
742  }
743  BrokeredIdentityContext context = serializedCtx.deserialize(session, authenticationSession);
744 
745  String wasFirstBrokerLoginNote = authenticationSession.getAuthNote(PostBrokerLoginConstants.PBL_AFTER_FIRST_BROKER_LOGIN);
746  boolean wasFirstBrokerLogin = Boolean.parseBoolean(wasFirstBrokerLoginNote);
747 
748  // Ensure the post-broker-login flow was successfully finished
749  String authStateNoteKey = PostBrokerLoginConstants.PBL_AUTH_STATE_PREFIX + context.getIdpConfig().getAlias();
750  String authState = authenticationSession.getAuthNote(authStateNoteKey);
751  if (!Boolean.parseBoolean(authState)) {
752  throw new IdentityBrokerException("Invalid request. Not found the flag that post-broker-login flow was finished");
753  }
754 
755  // remove notes
756  authenticationSession.removeAuthNote(PostBrokerLoginConstants.PBL_BROKERED_IDENTITY_CONTEXT);
757  authenticationSession.removeAuthNote(PostBrokerLoginConstants.PBL_AFTER_FIRST_BROKER_LOGIN);
758 
759  return afterPostBrokerLoginFlowSuccess(authenticationSession, context, wasFirstBrokerLogin, parsedCode.clientSessionCode);
760  } catch (IdentityBrokerException e) {
761  return redirectToErrorPage(authenticationSession, Response.Status.INTERNAL_SERVER_ERROR, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR, e);
762  }
763  }
Response afterPostBrokerLoginFlowSuccess(AuthenticationSessionModel authSession, BrokeredIdentityContext context, boolean wasFirstBrokerLogin, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:765
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
ParsedCodeContext parseSessionCode(String code, String clientId, String tabId)
Definition: IdentityBrokerService.java:988
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ afterPostBrokerLoginFlowSuccess()

Response org.keycloak.services.resources.IdentityBrokerService.afterPostBrokerLoginFlowSuccess ( AuthenticationSessionModel  authSession,
BrokeredIdentityContext  context,
boolean  wasFirstBrokerLogin,
ClientSessionCode< AuthenticationSessionModel >  clientSessionCode 
)
inlineprivate
765  {
766  String providerId = context.getIdpConfig().getAlias();
767  UserModel federatedUser = authSession.getAuthenticatedUser();
768 
769  if (wasFirstBrokerLogin) {
770  return finishBrokerAuthentication(context, federatedUser, authSession, providerId);
771  } else {
772 
773  boolean firstBrokerLoginInProgress = (authSession.getAuthNote(AbstractIdpAuthenticator.BROKERED_CONTEXT_NOTE) != null);
774  if (firstBrokerLoginInProgress) {
775  logger.debugf("Reauthenticated with broker '%s' when linking user '%s' with other broker", context.getIdpConfig().getAlias(), federatedUser.getUsername());
776 
777  UserModel linkingUser = AbstractIdpAuthenticator.getExistingUser(session, realmModel, authSession);
778  if (!linkingUser.getId().equals(federatedUser.getId())) {
779  return redirectToErrorPage(authSession, Response.Status.BAD_REQUEST, Messages.IDENTITY_PROVIDER_DIFFERENT_USER_MESSAGE, federatedUser.getUsername(), linkingUser.getUsername());
780  }
781 
782  SerializedBrokeredIdentityContext serializedCtx = SerializedBrokeredIdentityContext.readFromAuthenticationSession(authSession, AbstractIdpAuthenticator.BROKERED_CONTEXT_NOTE);
783  authSession.setAuthNote(AbstractIdpAuthenticator.FIRST_BROKER_LOGIN_SUCCESS, serializedCtx.getIdentityProviderId());
784 
785  return afterFirstBrokerLogin(clientSessionCode);
786  } else {
787  return finishBrokerAuthentication(context, federatedUser, authSession, providerId);
788  }
789  }
790  }
Response finishBrokerAuthentication(BrokeredIdentityContext context, UserModel federatedUser, AuthenticationSessionModel authSession, String providerId)
Definition: IdentityBrokerService.java:793
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
Response afterFirstBrokerLogin(@QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
Definition: IdentityBrokerService.java:598

◆ authenticated()

Response org.keycloak.services.resources.IdentityBrokerService.authenticated ( BrokeredIdentityContext  context)
inline
484  {
485  IdentityProviderModel identityProviderConfig = context.getIdpConfig();
486 
487  final ParsedCodeContext parsedCode;
488  if (context.getContextData().get(SAMLEndpoint.SAML_IDP_INITIATED_CLIENT_ID) != null) {
489  parsedCode = samlIdpInitiatedSSO((String) context.getContextData().get(SAMLEndpoint.SAML_IDP_INITIATED_CLIENT_ID));
490  } else {
491  parsedCode = parseEncodedSessionCode(context.getCode());
492  }
493  if (parsedCode.response != null) {
494  return parsedCode.response;
495  }
496  ClientSessionCode<AuthenticationSessionModel> clientCode = parsedCode.clientSessionCode;
497 
498  String providerId = identityProviderConfig.getAlias();
499  if (!identityProviderConfig.isStoreToken()) {
500  if (isDebugEnabled()) {
501  logger.debugf("Token will not be stored for identity provider [%s].", providerId);
502  }
503  context.setToken(null);
504  }
505 
506  AuthenticationSessionModel authenticationSession = clientCode.getClientSession();
507  context.setAuthenticationSession(authenticationSession);
508 
509  session.getContext().setClient(authenticationSession.getClient());
510 
511  context.getIdp().preprocessFederatedIdentity(session, realmModel, context);
512  Set<IdentityProviderMapperModel> mappers = realmModel.getIdentityProviderMappersByAlias(context.getIdpConfig().getAlias());
513  if (mappers != null) {
514  KeycloakSessionFactory sessionFactory = session.getKeycloakSessionFactory();
515  for (IdentityProviderMapperModel mapper : mappers) {
516  IdentityProviderMapper target = (IdentityProviderMapper)sessionFactory.getProviderFactory(IdentityProviderMapper.class, mapper.getIdentityProviderMapper());
517  target.preprocessFederatedIdentity(session, realmModel, mapper, context);
518  }
519  }
520 
521  FederatedIdentityModel federatedIdentityModel = new FederatedIdentityModel(providerId, context.getId(),
522  context.getUsername(), context.getToken());
523 
524  this.event.event(EventType.IDENTITY_PROVIDER_LOGIN)
525  .detail(Details.REDIRECT_URI, authenticationSession.getRedirectUri())
526  .detail(Details.IDENTITY_PROVIDER, providerId)
527  .detail(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
528 
529  UserModel federatedUser = this.session.users().getUserByFederatedIdentity(federatedIdentityModel, this.realmModel);
530 
531  // Check if federatedUser is already authenticated (this means linking social into existing federatedUser account)
532  UserSessionModel userSession = new AuthenticationSessionManager(session).getUserSession(authenticationSession);
533  if (shouldPerformAccountLinking(authenticationSession, userSession, providerId)) {
534  return performAccountLinking(authenticationSession, userSession, context, federatedIdentityModel, federatedUser);
535  }
536 
537  if (federatedUser == null) {
538 
539  logger.debugf("Federated user not found for provider '%s' and broker username '%s' . Redirecting to flow for firstBrokerLogin", providerId, context.getUsername());
540 
541  String username = context.getModelUsername();
542  if (username == null) {
543  if (this.realmModel.isRegistrationEmailAsUsername() && !Validation.isBlank(context.getEmail())) {
544  username = context.getEmail();
545  } else if (context.getUsername() == null) {
546  username = context.getIdpConfig().getAlias() + "." + context.getId();
547  } else {
548  username = context.getUsername();
549  }
550  }
551  username = username.trim();
552  context.setModelUsername(username);
553 
554  // Redirect to firstBrokerLogin after successful login and ensure that previous authentication state removed
555  AuthenticationProcessor.resetFlow(authenticationSession, LoginActionsService.FIRST_BROKER_LOGIN_PATH);
556 
557  SerializedBrokeredIdentityContext ctx = SerializedBrokeredIdentityContext.serialize(context);
558  ctx.saveToAuthenticationSession(authenticationSession, AbstractIdpAuthenticator.BROKERED_CONTEXT_NOTE);
559 
560  URI redirect = LoginActionsService.firstBrokerLoginProcessor(session.getContext().getUri())
561  .queryParam(Constants.CLIENT_ID, authenticationSession.getClient().getClientId())
562  .queryParam(Constants.TAB_ID, authenticationSession.getTabId())
563  .build(realmModel.getName());
564  return Response.status(302).location(redirect).build();
565 
566  } else {
567  Response response = validateUser(authenticationSession, federatedUser, realmModel);
568  if (response != null) {
569  return response;
570  }
571 
572  updateFederatedIdentity(context, federatedUser);
573  authenticationSession.setAuthenticatedUser(federatedUser);
574 
575  return finishOrRedirectToPostBrokerLogin(authenticationSession, context, false, parsedCode.clientSessionCode);
576  }
577  }
ParsedCodeContext parseEncodedSessionCode(String encodedCode)
Definition: IdentityBrokerService.java:980
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
Response response
Definition: IdentityBrokerService.java:1246
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
Response finishOrRedirectToPostBrokerLogin(AuthenticationSessionModel authSession, BrokeredIdentityContext context, boolean wasFirstBrokerLogin, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:699
boolean shouldPerformAccountLinking(AuthenticationSessionModel authSession, UserSessionModel userSession, String providerId)
Definition: IdentityBrokerService.java:855
Response performAccountLinking(AuthenticationSessionModel authSession, UserSessionModel userSession, BrokeredIdentityContext context, FederatedIdentityModel newModel, UserModel federatedUser)
Definition: IdentityBrokerService.java:878
Response validateUser(AuthenticationSessionModel authSession, UserModel user, RealmModel realm)
Definition: IdentityBrokerService.java:580
ParsedCodeContext samlIdpInitiatedSSO(final String clientUrlName)
Definition: IdentityBrokerService.java:1033
void updateFederatedIdentity(BrokeredIdentityContext context, UserModel federatedUser)
Definition: IdentityBrokerService.java:951

◆ badRequest()

Response org.keycloak.services.resources.IdentityBrokerService.badRequest ( String  message)
inlineprivate
1150  {
1151  fireErrorEvent(message);
1152  return ErrorResponse.error(message, Response.Status.BAD_REQUEST);
1153  }
void fireErrorEvent(String message, Throwable throwable)
Definition: IdentityBrokerService.java:1202

◆ browserAuthentication()

Response org.keycloak.services.resources.IdentityBrokerService.browserAuthentication ( AuthenticationSessionModel  authSession,
String  errorMessage 
)
inlineprotected
1124  {
1125  this.event.event(EventType.LOGIN);
1126  AuthenticationFlowModel flow = AuthenticationFlowResolver.resolveBrowserFlow(authSession);
1127  String flowId = flow.getId();
1128  AuthenticationProcessor processor = new AuthenticationProcessor();
1129  processor.setAuthenticationSession(authSession)
1130  .setFlowPath(LoginActionsService.AUTHENTICATE_PATH)
1131  .setFlowId(flowId)
1132  .setBrowserFlow(true)
1133  .setConnection(clientConnection)
1134  .setEventBuilder(event)
1135  .setRealm(realmModel)
1136  .setSession(session)
1137  .setUriInfo(session.getContext().getUri())
1138  .setRequest(request);
1139  if (errorMessage != null) processor.setForwardedErrorMessage(new FormMessage(null, errorMessage));
1140 
1141  try {
1142  CacheControlUtil.noBackButtonCacheControlHeader();
1143  return processor.authenticate();
1144  } catch (Exception e) {
1145  return processor.handleBrowserException(e);
1146  }
1147  }
HttpRequest request
Definition: IdentityBrokerService.java:136
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130
ClientConnection clientConnection
Definition: IdentityBrokerService.java:133
EventBuilder event
Definition: IdentityBrokerService.java:141

◆ cancelled()

Response org.keycloak.services.resources.IdentityBrokerService.cancelled ( String  code)
inline
823  {
824  ParsedCodeContext parsedCode = parseEncodedSessionCode(code);
825  if (parsedCode.response != null) {
826  return parsedCode.response;
827  }
828  ClientSessionCode<AuthenticationSessionModel> clientCode = parsedCode.clientSessionCode;
829 
830  Response accountManagementFailedLinking = checkAccountManagementFailedLinking(clientCode.getClientSession(), Messages.CONSENT_DENIED);
831  if (accountManagementFailedLinking != null) {
832  return accountManagementFailedLinking;
833  }
834 
835  return browserAuthentication(clientCode.getClientSession(), null);
836  }
Response checkAccountManagementFailedLinking(AuthenticationSessionModel authSession, String error, Object... parameters)
Definition: IdentityBrokerService.java:1053
ParsedCodeContext parseEncodedSessionCode(String encodedCode)
Definition: IdentityBrokerService.java:980
Response browserAuthentication(AuthenticationSessionModel authSession, String errorMessage)
Definition: IdentityBrokerService.java:1124

◆ canReadBrokerToken()

boolean org.keycloak.services.resources.IdentityBrokerService.canReadBrokerToken ( AccessToken  token)
inlineprivate
424  {
425  Map<String, AccessToken.Access> resourceAccess = token.getResourceAccess();
426  AccessToken.Access brokerRoles = resourceAccess == null ? null : resourceAccess.get(Constants.BROKER_SERVICE_CLIENT_ID);
427  return brokerRoles != null && brokerRoles.isUserInRole(Constants.READ_TOKEN_ROLE);
428  }

◆ checkAccountManagementFailedLinking()

Response org.keycloak.services.resources.IdentityBrokerService.checkAccountManagementFailedLinking ( AuthenticationSessionModel  authSession,
String  error,
Object...  parameters 
)
inlineprivate
1053  {
1054  UserSessionModel userSession = new AuthenticationSessionManager(session).getUserSession(authSession);
1055  if (userSession != null && authSession.getClient() != null && authSession.getClient().getClientId().equals(Constants.ACCOUNT_MANAGEMENT_CLIENT_ID)) {
1056 
1057  this.event.event(EventType.FEDERATED_IDENTITY_LINK);
1058  UserModel user = userSession.getUser();
1059  this.event.user(user);
1060  this.event.detail(Details.USERNAME, user.getUsername());
1061 
1062  return redirectToAccountErrorPage(authSession, error, parameters);
1063  } else {
1064  return null;
1065  }
1066  }
Response redirectToAccountErrorPage(AuthenticationSessionModel authSession, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1108
KeycloakSession session
Definition: IdentityBrokerService.java:130
Response error(String code, String message)
Definition: IdentityBrokerService.java:839

◆ checkClient()

ClientModel org.keycloak.services.resources.IdentityBrokerService.checkClient ( String  clientId)
inlineprivate
162  {
163  if (clientId == null) {
164  event.error(Errors.INVALID_REQUEST);
165  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.MISSING_PARAMETER, OIDCLoginProtocol.CLIENT_ID_PARAM);
166  }
167 
168  event.client(clientId);
169 
170  ClientModel client = realmModel.getClientByClientId(clientId);
171  if (client == null) {
172  event.error(Errors.CLIENT_NOT_FOUND);
173  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
174  }
175 
176  if (!client.isEnabled()) {
177  event.error(Errors.CLIENT_DISABLED);
178  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
179  }
180  return client;
181 
182  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ checkRealm()

void org.keycloak.services.resources.IdentityBrokerService.checkRealm ( )
inlineprivate
155  {
156  if (!realmModel.isEnabled()) {
157  event.error(Errors.REALM_DISABLED);
158  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.REALM_NOT_ENABLED);
159  }
160  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ clientInitiatedAccountLinking()

Response org.keycloak.services.resources.IdentityBrokerService.clientInitiatedAccountLinking ( @PathParam("provider_id") String  providerId,
@QueryParam("redirect_uri") String  redirectUri,
@QueryParam("client_id") String  clientId,
@QueryParam("nonce") String  nonce,
@QueryParam("hash") String  hash 
)
inline
205  {
206  this.event.event(EventType.CLIENT_INITIATED_ACCOUNT_LINKING);
207  checkRealm();
208  ClientModel client = checkClient(clientId);
209  redirectUri = RedirectUtils.verifyRedirectUri(session.getContext().getUri(), redirectUri, realmModel, client);
210  if (redirectUri == null) {
211  event.error(Errors.INVALID_REDIRECT_URI);
212  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
213  }
214 
215  event.detail(Details.REDIRECT_URI, redirectUri);
216 
217  if (nonce == null || hash == null) {
218  event.error(Errors.INVALID_REDIRECT_URI);
219  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
220 
221  }
222 
223  AuthenticationManager.AuthResult cookieResult = AuthenticationManager.authenticateIdentityCookie(session, realmModel, true);
224  String errorParam = "link_error";
225  if (cookieResult == null) {
226  event.error(Errors.NOT_LOGGED_IN);
227  UriBuilder builder = UriBuilder.fromUri(redirectUri)
228  .queryParam(errorParam, Errors.NOT_LOGGED_IN)
229  .queryParam("nonce", nonce);
230 
231  return Response.status(302).location(builder.build()).build();
232  }
233 
234  cookieResult.getSession();
235  event.session(cookieResult.getSession());
236  event.user(cookieResult.getUser());
237  event.detail(Details.USERNAME, cookieResult.getUser().getUsername());
238 
239  AuthenticatedClientSessionModel clientSession = null;
240  for (AuthenticatedClientSessionModel cs : cookieResult.getSession().getAuthenticatedClientSessions().values()) {
241  if (cs.getClient().getClientId().equals(clientId)) {
242  byte[] decoded = Base64Url.decode(hash);
243  MessageDigest md = null;
244  try {
245  md = MessageDigest.getInstance("SHA-256");
246  } catch (NoSuchAlgorithmException e) {
247  throw new ErrorPageException(session, Response.Status.INTERNAL_SERVER_ERROR, Messages.UNEXPECTED_ERROR_HANDLING_REQUEST);
248  }
249  String input = nonce + cookieResult.getSession().getId() + clientId + providerId;
250  byte[] check = md.digest(input.getBytes(StandardCharsets.UTF_8));
251  if (MessageDigest.isEqual(decoded, check)) {
252  clientSession = cs;
253  break;
254  }
255  }
256  }
257  if (clientSession == null) {
258  event.error(Errors.INVALID_TOKEN);
259  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
260  }
261 
262  event.detail(Details.IDENTITY_PROVIDER, providerId);
263 
264  ClientModel accountService = this.realmModel.getClientByClientId(Constants.ACCOUNT_MANAGEMENT_CLIENT_ID);
265  if (!accountService.getId().equals(client.getId())) {
266  RoleModel manageAccountRole = accountService.getRole(AccountRoles.MANAGE_ACCOUNT);
267 
268  // Ensure user has role and client has "role scope" for this role
269  ClientSessionContext ctx = DefaultClientSessionContext.fromClientSessionScopeParameter(clientSession);
270  Set<RoleModel> userAccountRoles = ctx.getRoles();
271 
272  if (!userAccountRoles.contains(manageAccountRole)) {
273  RoleModel linkRole = accountService.getRole(AccountRoles.MANAGE_ACCOUNT_LINKS);
274  if (!userAccountRoles.contains(linkRole)) {
275  event.error(Errors.NOT_ALLOWED);
276  UriBuilder builder = UriBuilder.fromUri(redirectUri)
277  .queryParam(errorParam, Errors.NOT_ALLOWED)
278  .queryParam("nonce", nonce);
279  return Response.status(302).location(builder.build()).build();
280  }
281  }
282  }
283 
284 
285  IdentityProviderModel identityProviderModel = realmModel.getIdentityProviderByAlias(providerId);
286  if (identityProviderModel == null) {
287  event.error(Errors.UNKNOWN_IDENTITY_PROVIDER);
288  UriBuilder builder = UriBuilder.fromUri(redirectUri)
289  .queryParam(errorParam, Errors.UNKNOWN_IDENTITY_PROVIDER)
290  .queryParam("nonce", nonce);
291  return Response.status(302).location(builder.build()).build();
292 
293  }
294 
295 
296  // Create AuthenticationSessionModel with same ID like userSession and refresh cookie
297  UserSessionModel userSession = cookieResult.getSession();
298 
299  // Auth session with ID corresponding to our userSession may already exists in some rare cases (EG. if some client tried to login in another browser tab with "prompt=login")
300  RootAuthenticationSessionModel rootAuthSession = session.authenticationSessions().getRootAuthenticationSession(realmModel, userSession.getId());
301  if (rootAuthSession == null) {
302  rootAuthSession = session.authenticationSessions().createRootAuthenticationSession(userSession.getId(), realmModel);
303  }
304 
305  AuthenticationSessionModel authSession = rootAuthSession.createAuthenticationSession(client);
306 
307  // Refresh the cookie
308  new AuthenticationSessionManager(session).setAuthSessionCookie(userSession.getId(), realmModel);
309 
310  ClientSessionCode<AuthenticationSessionModel> clientSessionCode = new ClientSessionCode<>(session, realmModel, authSession);
311  clientSessionCode.setAction(AuthenticationSessionModel.Action.AUTHENTICATE.name());
312  clientSessionCode.getOrGenerateCode();
313  authSession.setProtocol(client.getProtocol());
314  authSession.setRedirectUri(redirectUri);
315  authSession.setClientNote(OIDCLoginProtocol.STATE_PARAM, UUID.randomUUID().toString());
316  authSession.setAuthNote(LINKING_IDENTITY_PROVIDER, cookieResult.getSession().getId() + clientId + providerId);
317 
318  event.detail(Details.CODE_ID, userSession.getId());
319  event.success();
320 
321  try {
322  IdentityProvider identityProvider = getIdentityProvider(session, realmModel, providerId);
323  Response response = identityProvider.performLogin(createAuthenticationRequest(providerId, clientSessionCode));
324 
325  if (response != null) {
326  if (isDebugEnabled()) {
327  logger.debugf("Identity provider [%s] is going to send a request [%s].", identityProvider, response);
328  }
329  return response;
330  }
331  } catch (IdentityBrokerException e) {
332  return redirectToErrorPage(authSession, Response.Status.INTERNAL_SERVER_ERROR, Messages.COULD_NOT_SEND_AUTHENTICATION_REQUEST, e, providerId);
333  } catch (Exception e) {
334  return redirectToErrorPage(authSession, Response.Status.INTERNAL_SERVER_ERROR, Messages.UNEXPECTED_ERROR_HANDLING_REQUEST, e, providerId);
335  }
336 
337  return redirectToErrorPage(authSession, Response.Status.INTERNAL_SERVER_ERROR, Messages.COULD_NOT_PROCEED_WITH_AUTHENTICATION_REQUEST);
338 
339  }
static final String LINKING_IDENTITY_PROVIDER
Definition: IdentityBrokerService.java:123
static IdentityProvider getIdentityProvider(KeycloakSession session, RealmModel realm, String alias)
Definition: IdentityBrokerService.java:1160
ClientModel checkClient(String clientId)
Definition: IdentityBrokerService.java:162
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
void checkRealm()
Definition: IdentityBrokerService.java:155
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
AuthenticationRequest createAuthenticationRequest(String providerId, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:1068

◆ clientIntiatedAccountLinkingPreflight()

Response org.keycloak.services.resources.IdentityBrokerService.clientIntiatedAccountLinkingPreflight ( @PathParam("provider_id") String  providerId)
inline

Closes off CORS preflight requests for account linking

引数
providerId
戻り値
192  {
193  return Response.status(403).build(); // don't allow preflight
194  }

◆ corsResponse()

Response org.keycloak.services.resources.IdentityBrokerService.corsResponse ( Response  response,
ClientModel  clientModel 
)
inlineprivate
1198  {
1199  return Cors.add(this.request, Response.fromResponse(response)).auth().allowedOrigins(session.getContext().getUri(), clientModel).build();
1200  }
HttpRequest request
Definition: IdentityBrokerService.java:136
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ createAuthenticationRequest()

AuthenticationRequest org.keycloak.services.resources.IdentityBrokerService.createAuthenticationRequest ( String  providerId,
ClientSessionCode< AuthenticationSessionModel >  clientSessionCode 
)
inlineprivate
1068  {
1069  AuthenticationSessionModel authSession = null;
1070  IdentityBrokerState encodedState = null;
1071 
1072  if (clientSessionCode != null) {
1073  authSession = clientSessionCode.getClientSession();
1074  String relayState = clientSessionCode.getOrGenerateCode();
1075  encodedState = IdentityBrokerState.decoded(relayState, authSession.getClient().getClientId(), authSession.getTabId());
1076  }
1077 
1078  return new AuthenticationRequest(this.session, this.realmModel, authSession, this.request, this.session.getContext().getUri(), encodedState, getRedirectUri(providerId));
1079  }
static< CLIENT_SESSION extends CommonClientSessionModel > CLIENT_SESSION getClientSession(String code, String tabId, KeycloakSession session, RealmModel realm, ClientModel client, EventBuilder event, Class< CLIENT_SESSION > sessionClass)
Definition: ClientSessionCode.java:135
HttpRequest request
Definition: IdentityBrokerService.java:136
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130
String getOrGenerateCode()
Definition: ClientSessionCode.java:203
String getRedirectUri(String providerId)
Definition: IdentityBrokerService.java:1081

◆ error()

Response org.keycloak.services.resources.IdentityBrokerService.error ( String  code,
String  message 
)
inline
839  {
840  ParsedCodeContext parsedCode = parseEncodedSessionCode(code);
841  if (parsedCode.response != null) {
842  return parsedCode.response;
843  }
844  ClientSessionCode<AuthenticationSessionModel> clientCode = parsedCode.clientSessionCode;
845 
846  Response accountManagementFailedLinking = checkAccountManagementFailedLinking(clientCode.getClientSession(), message);
847  if (accountManagementFailedLinking != null) {
848  return accountManagementFailedLinking;
849  }
850 
851  return browserAuthentication(clientCode.getClientSession(), message);
852  }
Response checkAccountManagementFailedLinking(AuthenticationSessionModel authSession, String error, Object... parameters)
Definition: IdentityBrokerService.java:1053
ParsedCodeContext parseEncodedSessionCode(String encodedCode)
Definition: IdentityBrokerService.java:980
Response browserAuthentication(AuthenticationSessionModel authSession, String errorMessage)
Definition: IdentityBrokerService.java:1124

◆ finishBrokerAuthentication()

Response org.keycloak.services.resources.IdentityBrokerService.finishBrokerAuthentication ( BrokeredIdentityContext  context,
UserModel  federatedUser,
AuthenticationSessionModel  authSession,
String  providerId 
)
inlineprivate
793  {
794  authSession.setAuthNote(AuthenticationProcessor.BROKER_SESSION_ID, context.getBrokerSessionId());
795  authSession.setAuthNote(AuthenticationProcessor.BROKER_USER_ID, context.getBrokerUserId());
796 
797  this.event.user(federatedUser);
798 
799  context.getIdp().authenticationFinished(authSession, context);
800  authSession.setUserSessionNote(Details.IDENTITY_PROVIDER, providerId);
801  authSession.setUserSessionNote(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
802 
803  event.detail(Details.IDENTITY_PROVIDER, providerId)
804  .detail(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
805 
806  if (isDebugEnabled()) {
807  logger.debugf("Performing local authentication for user [%s].", federatedUser);
808  }
809 
810  AuthenticationManager.setClientScopesInSession(authSession);
811 
812  String nextRequiredAction = AuthenticationManager.nextRequiredAction(session, authSession, clientConnection, request, session.getContext().getUri(), event);
813  if (nextRequiredAction != null) {
814  return AuthenticationManager.redirectToRequiredActions(session, realmModel, authSession, session.getContext().getUri(), nextRequiredAction);
815  } else {
816  event.detail(Details.CODE_ID, authSession.getParentSession().getId()); // todo This should be set elsewhere. find out why tests fail. Don't know where this is supposed to be set
817  return AuthenticationManager.finishedRequiredActions(session, authSession, null, clientConnection, request, session.getContext().getUri(), event);
818  }
819  }
HttpRequest request
Definition: IdentityBrokerService.java:136
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
ClientConnection clientConnection
Definition: IdentityBrokerService.java:133
EventBuilder event
Definition: IdentityBrokerService.java:141

◆ finishOrRedirectToPostBrokerLogin()

Response org.keycloak.services.resources.IdentityBrokerService.finishOrRedirectToPostBrokerLogin ( AuthenticationSessionModel  authSession,
BrokeredIdentityContext  context,
boolean  wasFirstBrokerLogin,
ClientSessionCode< AuthenticationSessionModel >  clientSessionCode 
)
inlineprivate
699  {
700  String postBrokerLoginFlowId = context.getIdpConfig().getPostBrokerLoginFlowId();
701  if (postBrokerLoginFlowId == null) {
702 
703  logger.debugf("Skip redirect to postBrokerLogin flow. PostBrokerLogin flow not set for identityProvider '%s'.", context.getIdpConfig().getAlias());
704  return afterPostBrokerLoginFlowSuccess(authSession, context, wasFirstBrokerLogin, clientSessionCode);
705  } else {
706 
707  logger.debugf("Redirect to postBrokerLogin flow after authentication with identityProvider '%s'.", context.getIdpConfig().getAlias());
708 
709  authSession.getParentSession().setTimestamp(Time.currentTime());
710 
711  SerializedBrokeredIdentityContext ctx = SerializedBrokeredIdentityContext.serialize(context);
712  ctx.saveToAuthenticationSession(authSession, PostBrokerLoginConstants.PBL_BROKERED_IDENTITY_CONTEXT);
713 
714  authSession.setAuthNote(PostBrokerLoginConstants.PBL_AFTER_FIRST_BROKER_LOGIN, String.valueOf(wasFirstBrokerLogin));
715 
716  URI redirect = LoginActionsService.postBrokerLoginProcessor(session.getContext().getUri())
717  .queryParam(Constants.CLIENT_ID, authSession.getClient().getClientId())
718  .queryParam(Constants.TAB_ID, authSession.getTabId())
719  .build(realmModel.getName());
720  return Response.status(302).location(redirect).build();
721  }
722  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
Response afterPostBrokerLoginFlowSuccess(AuthenticationSessionModel authSession, BrokeredIdentityContext context, boolean wasFirstBrokerLogin, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:765
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125

◆ fireErrorEvent() [1/2]

void org.keycloak.services.resources.IdentityBrokerService.fireErrorEvent ( String  message,
Throwable  throwable 
)
inlineprivate
1202  {
1203  if (!this.event.getEvent().getType().toString().endsWith("_ERROR")) {
1204  boolean newTransaction = !this.session.getTransactionManager().isActive();
1205 
1206  try {
1207  if (newTransaction) {
1208  this.session.getTransactionManager().begin();
1209  }
1210 
1211  this.event.error(message);
1212 
1213  if (newTransaction) {
1214  this.session.getTransactionManager().commit();
1215  }
1216  } catch (Exception e) {
1217  ServicesLogger.LOGGER.couldNotFireEvent(e);
1218  rollback();
1219  }
1220  }
1221 
1222  if (throwable != null) {
1223  logger.error(message, throwable);
1224  } else {
1225  logger.error(message);
1226  }
1227  }
void rollback()
Definition: IdentityBrokerService.java:1237
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
EventBuilder event
Definition: IdentityBrokerService.java:141

◆ fireErrorEvent() [2/2]

void org.keycloak.services.resources.IdentityBrokerService.fireErrorEvent ( String  message)
inlineprivate
1229  {
1230  fireErrorEvent(message, null);
1231  }
void fireErrorEvent(String message, Throwable throwable)
Definition: IdentityBrokerService.java:1202

◆ forbidden()

Response org.keycloak.services.resources.IdentityBrokerService.forbidden ( String  message)
inlineprivate
1155  {
1156  fireErrorEvent(message);
1157  return ErrorResponse.error(message, Response.Status.FORBIDDEN);
1158  }
void fireErrorEvent(String message, Throwable throwable)
Definition: IdentityBrokerService.java:1202

◆ getEndpoint()

Object org.keycloak.services.resources.IdentityBrokerService.getEndpoint ( @PathParam("provider_id") String  providerId)
inline
401  {
402  IdentityProvider identityProvider = getIdentityProvider(session, realmModel, providerId);
403  Object callback = identityProvider.callback(realmModel, this, event);
404  ResteasyProviderFactory.getInstance().injectProperties(callback);
405  //resourceContext.initResource(brokerService);
406  return callback;
407 
408 
409  }
static IdentityProvider getIdentityProvider(KeycloakSession session, RealmModel realm, String alias)
Definition: IdentityBrokerService.java:1160
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130
EventBuilder event
Definition: IdentityBrokerService.java:141

◆ getIdentityProvider()

static IdentityProvider org.keycloak.services.resources.IdentityBrokerService.getIdentityProvider ( KeycloakSession  session,
RealmModel  realm,
String  alias 
)
inlinestatic
1160  {
1161  IdentityProviderModel identityProviderModel = realm.getIdentityProviderByAlias(alias);
1162 
1163  if (identityProviderModel != null) {
1164  IdentityProviderFactory providerFactory = getIdentityProviderFactory(session, identityProviderModel);
1165 
1166  if (providerFactory == null) {
1167  throw new IdentityBrokerException("Could not find factory for identity provider [" + alias + "].");
1168  }
1169 
1170  return providerFactory.create(session, identityProviderModel);
1171  }
1172 
1173  throw new IdentityBrokerException("Identity Provider [" + alias + "] not found.");
1174  }
static IdentityProviderFactory getIdentityProviderFactory(KeycloakSession session, IdentityProviderModel model)
Definition: IdentityBrokerService.java:1176
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ getIdentityProviderConfig()

IdentityProviderModel org.keycloak.services.resources.IdentityBrokerService.getIdentityProviderConfig ( String  providerId)
inlineprivate
1190  {
1191  IdentityProviderModel model = this.realmModel.getIdentityProviderByAlias(providerId);
1192  if (model == null) {
1193  throw new IdentityBrokerException("Configuration for identity provider [" + providerId + "] not found.");
1194  }
1195  return model;
1196  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127

◆ getIdentityProviderFactory()

static IdentityProviderFactory org.keycloak.services.resources.IdentityBrokerService.getIdentityProviderFactory ( KeycloakSession  session,
IdentityProviderModel  model 
)
inlinestatic
1176  {
1177  Map<String, IdentityProviderFactory> availableProviders = new HashMap<String, IdentityProviderFactory>();
1178  List<ProviderFactory> allProviders = new ArrayList<ProviderFactory>();
1179 
1180  allProviders.addAll(session.getKeycloakSessionFactory().getProviderFactories(IdentityProvider.class));
1181  allProviders.addAll(session.getKeycloakSessionFactory().getProviderFactories(SocialIdentityProvider.class));
1182 
1183  for (ProviderFactory providerFactory : allProviders) {
1184  availableProviders.put(providerFactory.getId(), (IdentityProviderFactory) providerFactory);
1185  }
1186 
1187  return availableProviders.get(model.getProviderId());
1188  }
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ getRedirectUri()

String org.keycloak.services.resources.IdentityBrokerService.getRedirectUri ( String  providerId)
inlineprivate
1081  {
1082  return Urls.identityProviderAuthnResponse(this.session.getContext().getUri().getBaseUri(), providerId, this.realmModel.getName()).toString();
1083  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ getToken()

Response org.keycloak.services.resources.IdentityBrokerService.getToken ( String  providerId,
boolean  forceRetrieval 
)
inlineprivate
430  {
431  this.event.event(EventType.IDENTITY_PROVIDER_RETRIEVE_TOKEN);
432 
433  try {
434  AppAuthManager authManager = new AppAuthManager();
435  AuthenticationManager.AuthResult authResult = authManager.authenticateBearerToken(this.session, this.realmModel, this.session.getContext().getUri(), this.clientConnection, this.request.getHttpHeaders());
436 
437  if (authResult != null) {
438  AccessToken token = authResult.getToken();
439  String[] audience = token.getAudience();
440  ClientModel clientModel = this.realmModel.getClientByClientId(audience[0]);
441 
442  if (clientModel == null) {
443  return badRequest("Invalid client.");
444  }
445 
446  session.getContext().setClient(clientModel);
447 
448  ClientModel brokerClient = realmModel.getClientByClientId(Constants.BROKER_SERVICE_CLIENT_ID);
449  if (brokerClient == null) {
450  return corsResponse(forbidden("Realm has not migrated to support the broker token exchange service"), clientModel);
451 
452  }
453  if (!canReadBrokerToken(token)) {
454  return corsResponse(forbidden("Client [" + clientModel.getClientId() + "] not authorized to retrieve tokens from identity provider [" + providerId + "]."), clientModel);
455 
456  }
457 
458  IdentityProvider identityProvider = getIdentityProvider(session, realmModel, providerId);
459  IdentityProviderModel identityProviderConfig = getIdentityProviderConfig(providerId);
460 
461  if (identityProviderConfig.isStoreToken()) {
462  FederatedIdentityModel identity = this.session.users().getFederatedIdentity(authResult.getUser(), providerId, this.realmModel);
463 
464  if (identity == null) {
465  return corsResponse(badRequest("User [" + authResult.getUser().getId() + "] is not associated with identity provider [" + providerId + "]."), clientModel);
466  }
467 
468  this.event.success();
469 
470  return corsResponse(identityProvider.retrieveToken(session, identity), clientModel);
471  }
472 
473  return corsResponse(badRequest("Identity Provider [" + providerId + "] does not support this operation."), clientModel);
474  }
475 
476  return badRequest("Invalid token.");
477  } catch (IdentityBrokerException e) {
478  return redirectToErrorPage(Response.Status.BAD_GATEWAY, Messages.COULD_NOT_OBTAIN_TOKEN, e, providerId);
479  } catch (Exception e) {
480  return redirectToErrorPage(Response.Status.BAD_GATEWAY, Messages.UNEXPECTED_ERROR_RETRIEVING_TOKEN, e, providerId);
481  }
482  }
Response badRequest(String message)
Definition: IdentityBrokerService.java:1150
boolean canReadBrokerToken(AccessToken token)
Definition: IdentityBrokerService.java:424
static IdentityProvider getIdentityProvider(KeycloakSession session, RealmModel realm, String alias)
Definition: IdentityBrokerService.java:1160
HttpRequest request
Definition: IdentityBrokerService.java:136
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
Response forbidden(String message)
Definition: IdentityBrokerService.java:1155
IdentityProviderModel getIdentityProviderConfig(String providerId)
Definition: IdentityBrokerService.java:1190
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
Response corsResponse(Response response, ClientModel clientModel)
Definition: IdentityBrokerService.java:1198
ClientConnection clientConnection
Definition: IdentityBrokerService.java:133

◆ init()

void org.keycloak.services.resources.IdentityBrokerService.init ( )
inline
151  {
152  this.event = new EventBuilder(realmModel, session, clientConnection).event(EventType.IDENTITY_PROVIDER_LOGIN);
153  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130
ClientConnection clientConnection
Definition: IdentityBrokerService.java:133

◆ isDebugEnabled()

boolean org.keycloak.services.resources.IdentityBrokerService.isDebugEnabled ( )
inlineprivate
1233  {
1234  return logger.isDebugEnabled();
1235  }
static final Logger logger
Definition: IdentityBrokerService.java:125

◆ parseEncodedSessionCode()

ParsedCodeContext org.keycloak.services.resources.IdentityBrokerService.parseEncodedSessionCode ( String  encodedCode)
inlineprivate
980  {
981  IdentityBrokerState state = IdentityBrokerState.encoded(encodedCode);
982  String code = state.getDecodedState();
983  String clientId = state.getClientId();
984  String tabId = state.getTabId();
985  return parseSessionCode(code, clientId, tabId);
986  }
ParsedCodeContext parseSessionCode(String code, String clientId, String tabId)
Definition: IdentityBrokerService.java:988

◆ parseSessionCode()

ParsedCodeContext org.keycloak.services.resources.IdentityBrokerService.parseSessionCode ( String  code,
String  clientId,
String  tabId 
)
inlineprivate
988  {
989  if (code == null || clientId == null || tabId == null) {
990  logger.debugf("Invalid request. Authorization code, clientId or tabId was null. Code=%s, clientId=%s, tabID=%s", code, clientId, tabId);
991  Response staleCodeError = redirectToErrorPage(Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
992  return ParsedCodeContext.response(staleCodeError);
993  }
994 
995  SessionCodeChecks checks = new SessionCodeChecks(realmModel, session.getContext().getUri(), request, clientConnection, session, event, null, code, null, clientId, tabId, LoginActionsService.AUTHENTICATE_PATH);
996  checks.initialVerify();
997  if (!checks.verifyActiveAndValidAction(AuthenticationSessionModel.Action.AUTHENTICATE.name(), ClientSessionCode.ActionType.LOGIN)) {
998 
999  AuthenticationSessionModel authSession = checks.getAuthenticationSession();
1000  if (authSession != null) {
1001  // Check if error happened during login or during linking from account management
1002  Response accountManagementFailedLinking = checkAccountManagementFailedLinking(authSession, Messages.STALE_CODE_ACCOUNT);
1003  if (accountManagementFailedLinking != null) {
1004  return ParsedCodeContext.response(accountManagementFailedLinking);
1005  } else {
1006  Response errorResponse = checks.getResponse();
1007 
1008  // Remove "code" from browser history
1009  errorResponse = BrowserHistoryHelper.getInstance().saveResponseAndRedirect(session, authSession, errorResponse, true, request);
1010  return ParsedCodeContext.response(errorResponse);
1011  }
1012  } else {
1013  return ParsedCodeContext.response(checks.getResponse());
1014  }
1015  } else {
1016  if (isDebugEnabled()) {
1017  logger.debugf("Authorization code is valid.");
1018  }
1019 
1020  return ParsedCodeContext.clientSessionCode(checks.getClientCode());
1021  }
1022  }
Response checkAccountManagementFailedLinking(AuthenticationSessionModel authSession, String error, Object... parameters)
Definition: IdentityBrokerService.java:1053
HttpRequest request
Definition: IdentityBrokerService.java:136
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
ClientConnection clientConnection
Definition: IdentityBrokerService.java:133
EventBuilder event
Definition: IdentityBrokerService.java:141

◆ performAccountLinking()

Response org.keycloak.services.resources.IdentityBrokerService.performAccountLinking ( AuthenticationSessionModel  authSession,
UserSessionModel  userSession,
BrokeredIdentityContext  context,
FederatedIdentityModel  newModel,
UserModel  federatedUser 
)
inlineprivate
878  {
879  logger.debugf("Will try to link identity provider [%s] to user [%s]", context.getIdpConfig().getAlias(), userSession.getUser().getUsername());
880 
881  this.event.event(EventType.FEDERATED_IDENTITY_LINK);
882 
883 
884 
885  UserModel authenticatedUser = userSession.getUser();
886  authSession.setAuthenticatedUser(authenticatedUser);
887 
888  if (federatedUser != null && !authenticatedUser.getId().equals(federatedUser.getId())) {
889  return redirectToErrorWhenLinkingFailed(authSession, Messages.IDENTITY_PROVIDER_ALREADY_LINKED, context.getIdpConfig().getAlias());
890  }
891 
892  if (!authenticatedUser.hasRole(this.realmModel.getClientByClientId(Constants.ACCOUNT_MANAGEMENT_CLIENT_ID).getRole(AccountRoles.MANAGE_ACCOUNT))) {
893  return redirectToErrorPage(authSession, Response.Status.FORBIDDEN, Messages.INSUFFICIENT_PERMISSION);
894  }
895 
896  if (!authenticatedUser.isEnabled()) {
897  return redirectToErrorWhenLinkingFailed(authSession, Messages.ACCOUNT_DISABLED);
898  }
899 
900 
901 
902  if (federatedUser != null) {
903  if (context.getIdpConfig().isStoreToken()) {
904  FederatedIdentityModel oldModel = this.session.users().getFederatedIdentity(federatedUser, context.getIdpConfig().getAlias(), this.realmModel);
905  if (!ObjectUtil.isEqualOrBothNull(context.getToken(), oldModel.getToken())) {
906  this.session.users().updateFederatedIdentity(this.realmModel, federatedUser, newModel);
907  if (isDebugEnabled()) {
908  logger.debugf("Identity [%s] update with response from identity provider [%s].", federatedUser, context.getIdpConfig().getAlias());
909  }
910  }
911  }
912  } else {
913  this.session.users().addFederatedIdentity(this.realmModel, authenticatedUser, newModel);
914  }
915  context.getIdp().authenticationFinished(authSession, context);
916 
917  AuthenticationManager.setClientScopesInSession(authSession);
918  TokenManager.attachAuthenticationSession(session, userSession, authSession);
919 
920  if (isDebugEnabled()) {
921  logger.debugf("Linking account [%s] from identity provider [%s] to user [%s].", newModel, context.getIdpConfig().getAlias(), authenticatedUser);
922  }
923 
924  this.event.user(authenticatedUser)
925  .detail(Details.USERNAME, authenticatedUser.getUsername())
926  .detail(Details.IDENTITY_PROVIDER, newModel.getIdentityProvider())
927  .detail(Details.IDENTITY_PROVIDER_USERNAME, newModel.getUserName())
928  .success();
929 
930  // we do this to make sure that the parent IDP is logged out when this user session is complete.
931  // But for the case when userSession was previously authenticated with broker1 and now is linked to another broker2, we shouldn't override broker1 notes with the broker2 for sure.
932  // Maybe broker logout should be rather always skiped in case of broker-linking
933  if (userSession.getNote(Details.IDENTITY_PROVIDER) == null) {
934  userSession.setNote(Details.IDENTITY_PROVIDER, context.getIdpConfig().getAlias());
935  userSession.setNote(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
936  }
937 
938  return Response.status(302).location(UriBuilder.fromUri(authSession.getRedirectUri()).build()).build();
939  }
Response redirectToErrorWhenLinkingFailed(AuthenticationSessionModel authSession, String message, Object... parameters)
Definition: IdentityBrokerService.java:942
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125

◆ performLogin()

Response org.keycloak.services.resources.IdentityBrokerService.performLogin ( @PathParam("provider_id") String  providerId,
@QueryParam(LoginActionsService.SESSION_CODE) String  code,
@QueryParam("client_id") String  clientId,
@QueryParam(Constants.TAB_ID) String  tabId 
)
inline
357  {
358  this.event.detail(Details.IDENTITY_PROVIDER, providerId);
359 
360  if (isDebugEnabled()) {
361  logger.debugf("Sending authentication request to identity provider [%s].", providerId);
362  }
363 
364  try {
365  ParsedCodeContext parsedCode = parseSessionCode(code, clientId, tabId);
366  if (parsedCode.response != null) {
367  return parsedCode.response;
368  }
369 
370  ClientSessionCode clientSessionCode = parsedCode.clientSessionCode;
371  IdentityProviderModel identityProviderModel = realmModel.getIdentityProviderByAlias(providerId);
372  if (identityProviderModel == null) {
373  throw new IdentityBrokerException("Identity Provider [" + providerId + "] not found.");
374  }
375  if (identityProviderModel.isLinkOnly()) {
376  throw new IdentityBrokerException("Identity Provider [" + providerId + "] is not allowed to perform a login.");
377 
378  }
379  IdentityProviderFactory providerFactory = getIdentityProviderFactory(session, identityProviderModel);
380 
381  IdentityProvider identityProvider = providerFactory.create(session, identityProviderModel);
382 
383  Response response = identityProvider.performLogin(createAuthenticationRequest(providerId, clientSessionCode));
384 
385  if (response != null) {
386  if (isDebugEnabled()) {
387  logger.debugf("Identity provider [%s] is going to send a request [%s].", identityProvider, response);
388  }
389  return response;
390  }
391  } catch (IdentityBrokerException e) {
392  return redirectToErrorPage(Response.Status.BAD_GATEWAY, Messages.COULD_NOT_SEND_AUTHENTICATION_REQUEST, e, providerId);
393  } catch (Exception e) {
394  return redirectToErrorPage(Response.Status.INTERNAL_SERVER_ERROR, Messages.UNEXPECTED_ERROR_HANDLING_REQUEST, e, providerId);
395  }
396 
397  return redirectToErrorPage(Response.Status.INTERNAL_SERVER_ERROR, Messages.COULD_NOT_PROCEED_WITH_AUTHENTICATION_REQUEST);
398  }
static IdentityProviderFactory getIdentityProviderFactory(KeycloakSession session, IdentityProviderModel model)
Definition: IdentityBrokerService.java:1176
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
ParsedCodeContext parseSessionCode(String code, String clientId, String tabId)
Definition: IdentityBrokerService.java:988
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125
AuthenticationRequest createAuthenticationRequest(String providerId, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:1068

◆ performPostLogin()

Response org.keycloak.services.resources.IdentityBrokerService.performPostLogin ( @PathParam("provider_id") String  providerId,
@QueryParam(LoginActionsService.SESSION_CODE) String  code,
@QueryParam("client_id") String  clientId,
@QueryParam(Constants.TAB_ID) String  tabId 
)
inline
347  {
348  return performLogin(providerId, code, clientId, tabId);
349  }
Response performLogin(@PathParam("provider_id") String providerId, @QueryParam(LoginActionsService.SESSION_CODE) String code, @QueryParam("client_id") String clientId, @QueryParam(Constants.TAB_ID) String tabId)
Definition: IdentityBrokerService.java:354

◆ redirectToAccountErrorPage()

Response org.keycloak.services.resources.IdentityBrokerService.redirectToAccountErrorPage ( AuthenticationSessionModel  authSession,
String  message,
Object ...  parameters 
)
inlineprivate
1108  {
1109  fireErrorEvent(message);
1110 
1111  FormMessage errorMessage = new FormMessage(message, parameters);
1112  try {
1113  String serializedError = JsonSerialization.writeValueAsString(errorMessage);
1114  authSession.setAuthNote(AccountFormService.ACCOUNT_MGMT_FORWARDED_ERROR_NOTE, serializedError);
1115  } catch (IOException ioe) {
1116  throw new RuntimeException(ioe);
1117  }
1118 
1119  URI accountServiceUri = UriBuilder.fromUri(authSession.getRedirectUri()).queryParam(Constants.TAB_ID, authSession.getTabId()).build();
1120  return Response.status(302).location(accountServiceUri).build();
1121  }
void fireErrorEvent(String message, Throwable throwable)
Definition: IdentityBrokerService.java:1202

◆ redirectToErrorPage() [1/3]

Response org.keycloak.services.resources.IdentityBrokerService.redirectToErrorPage ( AuthenticationSessionModel  authSession,
Response.Status  status,
String  message,
Object ...  parameters 
)
inlineprivate
1085  {
1086  return redirectToErrorPage(authSession, status, message, null, parameters);
1087  }
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085

◆ redirectToErrorPage() [2/3]

Response org.keycloak.services.resources.IdentityBrokerService.redirectToErrorPage ( Response.Status  status,
String  message,
Object ...  parameters 
)
inlineprivate
1089  {
1090  return redirectToErrorPage(null, status, message, null, parameters);
1091  }
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085

◆ redirectToErrorPage() [3/3]

Response org.keycloak.services.resources.IdentityBrokerService.redirectToErrorPage ( AuthenticationSessionModel  authSession,
Response.Status  status,
String  message,
Throwable  throwable,
Object ...  parameters 
)
inlineprivate
1093  {
1094  if (message == null) {
1095  message = Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR;
1096  }
1097 
1098  fireErrorEvent(message, throwable);
1099 
1100  if (throwable != null && throwable instanceof WebApplicationException) {
1101  WebApplicationException webEx = (WebApplicationException) throwable;
1102  return webEx.getResponse();
1103  }
1104 
1105  return ErrorPage.error(this.session, authSession, status, message, parameters);
1106  }
KeycloakSession session
Definition: IdentityBrokerService.java:130
void fireErrorEvent(String message, Throwable throwable)
Definition: IdentityBrokerService.java:1202

◆ redirectToErrorWhenLinkingFailed()

Response org.keycloak.services.resources.IdentityBrokerService.redirectToErrorWhenLinkingFailed ( AuthenticationSessionModel  authSession,
String  message,
Object...  parameters 
)
inlineprivate
942  {
943  if (authSession.getClient() != null && authSession.getClient().getClientId().equals(Constants.ACCOUNT_MANAGEMENT_CLIENT_ID)) {
944  return redirectToAccountErrorPage(authSession, message, parameters);
945  } else {
946  return redirectToErrorPage(authSession, Response.Status.BAD_REQUEST, message, parameters); // Should rather redirect to app instead and display error here?
947  }
948  }
Response redirectToAccountErrorPage(AuthenticationSessionModel authSession, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1108
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085

◆ retrieveToken()

Response org.keycloak.services.resources.IdentityBrokerService.retrieveToken ( @PathParam("provider_id") String  providerId)
inline
420  {
421  return getToken(providerId, false);
422  }
Response getToken(String providerId, boolean forceRetrieval)
Definition: IdentityBrokerService.java:430

◆ retrieveTokenPreflight()

Response org.keycloak.services.resources.IdentityBrokerService.retrieveTokenPreflight ( )
inline
413  {
414  return Cors.add(this.request, Response.ok()).auth().preflight().build();
415  }
HttpRequest request
Definition: IdentityBrokerService.java:136

◆ rollback()

void org.keycloak.services.resources.IdentityBrokerService.rollback ( )
inlineprivate
1237  {
1238  if (this.session.getTransactionManager().isActive()) {
1239  this.session.getTransactionManager().rollback();
1240  }
1241  }
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ samlIdpInitiatedSSO()

ParsedCodeContext org.keycloak.services.resources.IdentityBrokerService.samlIdpInitiatedSSO ( final String  clientUrlName)
inlineprivate

If there is a client whose SAML IDP-initiated SSO URL name is set to the given

clientUrlName

, creates a fresh client session for that client and returns a ParsedCodeContext object with that session. Otherwise returns "client not found" response.

引数
clientUrlName
戻り値
see description
1033  {
1034  event.event(EventType.LOGIN);
1035  CacheControlUtil.noBackButtonCacheControlHeader();
1036  Optional<ClientModel> oClient = this.realmModel.getClients().stream()
1037  .filter(c -> Objects.equals(c.getAttribute(SamlProtocol.SAML_IDP_INITIATED_SSO_URL_NAME), clientUrlName))
1038  .findFirst();
1039 
1040  if (! oClient.isPresent()) {
1041  event.error(Errors.CLIENT_NOT_FOUND);
1042  return ParsedCodeContext.response(redirectToErrorPage(Response.Status.BAD_REQUEST, Messages.CLIENT_NOT_FOUND));
1043  }
1044 
1045  LoginProtocolFactory factory = (LoginProtocolFactory) session.getKeycloakSessionFactory().getProviderFactory(LoginProtocol.class, SamlProtocol.LOGIN_PROTOCOL);
1046  SamlService samlService = (SamlService) factory.createProtocolEndpoint(realmModel, event);
1047  ResteasyProviderFactory.getInstance().injectProperties(samlService);
1048  AuthenticationSessionModel authSession = samlService.getOrCreateLoginSessionForIdpInitiatedSso(session, realmModel, oClient.get(), null);
1049 
1050  return ParsedCodeContext.clientSessionCode(new ClientSessionCode<>(session, this.realmModel, authSession));
1051  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085
KeycloakSession session
Definition: IdentityBrokerService.java:130
EventBuilder event
Definition: IdentityBrokerService.java:141

◆ shouldPerformAccountLinking()

boolean org.keycloak.services.resources.IdentityBrokerService.shouldPerformAccountLinking ( AuthenticationSessionModel  authSession,
UserSessionModel  userSession,
String  providerId 
)
inlineprivate
855  {
856  String noteFromSession = authSession.getAuthNote(LINKING_IDENTITY_PROVIDER);
857  if (noteFromSession == null) {
858  return false;
859  }
860 
861  boolean linkingValid;
862  if (userSession == null) {
863  linkingValid = false;
864  } else {
865  String expectedNote = userSession.getId() + authSession.getClient().getClientId() + providerId;
866  linkingValid = expectedNote.equals(noteFromSession);
867  }
868 
869  if (linkingValid) {
870  authSession.removeAuthNote(LINKING_IDENTITY_PROVIDER);
871  return true;
872  } else {
873  throw new ErrorPageException(session, Response.Status.BAD_REQUEST, Messages.BROKER_LINKING_SESSION_EXPIRED);
874  }
875  }
static final String LINKING_IDENTITY_PROVIDER
Definition: IdentityBrokerService.java:123
KeycloakSession session
Definition: IdentityBrokerService.java:130

◆ updateFederatedIdentity()

void org.keycloak.services.resources.IdentityBrokerService.updateFederatedIdentity ( BrokeredIdentityContext  context,
UserModel  federatedUser 
)
inlineprivate
951  {
952  FederatedIdentityModel federatedIdentityModel = this.session.users().getFederatedIdentity(federatedUser, context.getIdpConfig().getAlias(), this.realmModel);
953 
954  // Skip DB write if tokens are null or equal
955  updateToken(context, federatedUser, federatedIdentityModel);
956  context.getIdp().updateBrokeredUser(session, realmModel, federatedUser, context);
957  Set<IdentityProviderMapperModel> mappers = realmModel.getIdentityProviderMappersByAlias(context.getIdpConfig().getAlias());
958  if (mappers != null) {
959  KeycloakSessionFactory sessionFactory = session.getKeycloakSessionFactory();
960  for (IdentityProviderMapperModel mapper : mappers) {
961  IdentityProviderMapper target = (IdentityProviderMapper)sessionFactory.getProviderFactory(IdentityProviderMapper.class, mapper.getIdentityProviderMapper());
962  target.updateBrokeredUser(session, realmModel, federatedUser, mapper, context);
963  }
964  }
965 
966  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
KeycloakSession session
Definition: IdentityBrokerService.java:130
void updateToken(BrokeredIdentityContext context, UserModel federatedUser, FederatedIdentityModel federatedIdentityModel)
Definition: IdentityBrokerService.java:968

◆ updateToken()

void org.keycloak.services.resources.IdentityBrokerService.updateToken ( BrokeredIdentityContext  context,
UserModel  federatedUser,
FederatedIdentityModel  federatedIdentityModel 
)
inlineprivate
968  {
969  if (context.getIdpConfig().isStoreToken() && !ObjectUtil.isEqualOrBothNull(context.getToken(), federatedIdentityModel.getToken())) {
970  federatedIdentityModel.setToken(context.getToken());
971 
972  this.session.users().updateFederatedIdentity(this.realmModel, federatedUser, federatedIdentityModel);
973 
974  if (isDebugEnabled()) {
975  logger.debugf("Identity [%s] update with response from identity provider [%s].", federatedUser, context.getIdpConfig().getAlias());
976  }
977  }
978  }
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
KeycloakSession session
Definition: IdentityBrokerService.java:130
static final Logger logger
Definition: IdentityBrokerService.java:125

◆ validateUser()

Response org.keycloak.services.resources.IdentityBrokerService.validateUser ( AuthenticationSessionModel  authSession,
UserModel  user,
RealmModel  realm 
)
inline
580  {
581  if (!user.isEnabled()) {
582  event.error(Errors.USER_DISABLED);
583  return ErrorPage.error(session, authSession, Response.Status.BAD_REQUEST, Messages.ACCOUNT_DISABLED);
584  }
585  if (realm.isBruteForceProtected()) {
586  if (session.getProvider(BruteForceProtector.class).isTemporarilyDisabled(session, realm, user)) {
587  event.error(Errors.USER_TEMPORARILY_DISABLED);
588  return ErrorPage.error(session, authSession, Response.Status.BAD_REQUEST, Messages.ACCOUNT_DISABLED);
589  }
590  }
591  return null;
592  }
KeycloakSession session
Definition: IdentityBrokerService.java:130

メンバ詳解

◆ clientConnection

ClientConnection org.keycloak.services.resources.IdentityBrokerService.clientConnection
private

◆ event

EventBuilder org.keycloak.services.resources.IdentityBrokerService.event
private

◆ headers

HttpHeaders org.keycloak.services.resources.IdentityBrokerService.headers
private

◆ LINKING_IDENTITY_PROVIDER

final String org.keycloak.services.resources.IdentityBrokerService.LINKING_IDENTITY_PROVIDER = "LINKING_IDENTITY_PROVIDER"
staticprivate

◆ logger

final Logger org.keycloak.services.resources.IdentityBrokerService.logger = Logger.getLogger(IdentityBrokerService.class)
staticprivate

◆ realmModel

final RealmModel org.keycloak.services.resources.IdentityBrokerService.realmModel
private

◆ request

HttpRequest org.keycloak.services.resources.IdentityBrokerService.request
private

◆ session

KeycloakSession org.keycloak.services.resources.IdentityBrokerService.session
private

このクラス詳解は次のファイルから抽出されました: