206         this.
event.event(EventType.CLIENT_INITIATED_ACCOUNT_LINKING);
   210         if (redirectUri == null) {
   211             event.error(Errors.INVALID_REDIRECT_URI);
   212             throw new ErrorPageException(
session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
   215         event.detail(Details.REDIRECT_URI, redirectUri);
   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);
   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);
   231             return Response.status(302).location(builder.build()).build();
   234         cookieResult.getSession();
   235         event.session(cookieResult.getSession());
   236         event.user(cookieResult.getUser());
   237         event.detail(Details.USERNAME, cookieResult.getUser().getUsername());
   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;
   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);
   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)) {
   257         if (clientSession == null) {
   258             event.error(Errors.INVALID_TOKEN);
   259             throw new ErrorPageException(
session, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
   262         event.detail(Details.IDENTITY_PROVIDER, providerId);
   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);
   269             ClientSessionContext ctx = DefaultClientSessionContext.fromClientSessionScopeParameter(clientSession);
   270             Set<RoleModel> userAccountRoles = ctx.getRoles();
   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();
   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();
   297         UserSessionModel userSession = cookieResult.getSession();
   301         if (rootAuthSession == null) {
   308         new AuthenticationSessionManager(
session).setAuthSessionCookie(userSession.getId(), 
realmModel);
   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());
   318         event.detail(Details.CODE_ID, userSession.getId());
   325             if (response != null) {
   327                     logger.debugf(
"Identity provider [%s] is going to send a request [%s].", identityProvider, response);
   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);
   337         return redirectToErrorPage(authSession, Response.Status.INTERNAL_SERVER_ERROR, Messages.COULD_NOT_PROCEED_WITH_AUTHENTICATION_REQUEST);
 KeycloakContext getContext()
 
AuthenticationSessionProvider authenticationSessions()
 
void setAction(String action)
 
void checkRealm()
Definition: IdentityBrokerService.java:155
 
final RealmModel realmModel
Definition: IdentityBrokerService.java:127
 
AuthenticationRequest createAuthenticationRequest(String providerId, ClientSessionCode< AuthenticationSessionModel > clientSessionCode)
Definition: IdentityBrokerService.java:1068
 
RootAuthenticationSessionModel getRootAuthenticationSession(RealmModel realm, String authenticationSessionId)
 
AuthenticationSessionModel createAuthenticationSession(ClientModel client)
 
RootAuthenticationSessionModel createRootAuthenticationSession(RealmModel realm)
 
KeycloakSession session
Definition: IdentityBrokerService.java:130
 
static IdentityProvider getIdentityProvider(KeycloakSession session, RealmModel realm, String alias)
Definition: IdentityBrokerService.java:1160
 
static final Logger logger
Definition: IdentityBrokerService.java:125
 
static final String LINKING_IDENTITY_PROVIDER
Definition: IdentityBrokerService.java:123
 
ClientModel checkClient(String clientId)
Definition: IdentityBrokerService.java:162
 
boolean isDebugEnabled()
Definition: IdentityBrokerService.java:1233
 
Response redirectToErrorPage(AuthenticationSessionModel authSession, Response.Status status, String message, Object ... parameters)
Definition: IdentityBrokerService.java:1085