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