package org.keycloak.protocol.cas.endpoints;
|
|
import org.jboss.logging.Logger;
|
import org.keycloak.events.Details;
|
import org.keycloak.events.Errors;
|
import org.keycloak.events.EventBuilder;
|
import org.keycloak.events.EventType;
|
import org.keycloak.models.ClientModel;
|
import org.keycloak.models.ClientSessionModel;
|
import org.keycloak.models.RealmModel;
|
import org.keycloak.protocol.AuthorizationEndpointBase;
|
import org.keycloak.protocol.cas.CASLoginProtocol;
|
import org.keycloak.protocol.oidc.utils.RedirectUtils;
|
import org.keycloak.services.ErrorPageException;
|
import org.keycloak.services.messages.Messages;
|
import org.keycloak.services.util.CacheControlUtil;
|
|
import javax.ws.rs.GET;
|
import javax.ws.rs.core.MultivaluedMap;
|
import javax.ws.rs.core.Response;
|
|
public class AuthorizationEndpoint extends AuthorizationEndpointBase {
|
private static final Logger logger = Logger.getLogger(AuthorizationEndpoint.class);
|
|
private ClientModel client;
|
private ClientSessionModel clientSession;
|
private String redirectUri;
|
|
public AuthorizationEndpoint(RealmModel realm, EventBuilder event) {
|
super(realm, event);
|
event.event(EventType.LOGIN);
|
}
|
|
@GET
|
public Response build() {
|
MultivaluedMap<String, String> params = uriInfo.getQueryParameters();
|
String service = params.getFirst(CASLoginProtocol.SERVICE_PARAM);
|
boolean renew = params.containsKey(CASLoginProtocol.RENEW_PARAM);
|
boolean gateway = params.containsKey(CASLoginProtocol.GATEWAY_PARAM);
|
|
checkSsl();
|
checkRealm();
|
checkClient(service);
|
|
createClientSession();
|
// So back button doesn't work
|
CacheControlUtil.noBackButtonCacheControlHeader();
|
|
if (renew) {
|
clientSession.setNote(CASLoginProtocol.RENEW_PARAM, "true");
|
}
|
|
this.event.event(EventType.LOGIN);
|
return handleBrowserAuthenticationRequest(clientSession, new CASLoginProtocol(session, realm, uriInfo, headers, event), gateway, false);
|
}
|
|
private void checkSsl() {
|
if (!uriInfo.getBaseUri().getScheme().equals("https") && realm.getSslRequired().isRequired(clientConnection)) {
|
event.error(Errors.SSL_REQUIRED);
|
throw new ErrorPageException(session, Messages.HTTPS_REQUIRED);
|
}
|
}
|
|
private void checkRealm() {
|
if (!realm.isEnabled()) {
|
event.error(Errors.REALM_DISABLED);
|
throw new ErrorPageException(session, Messages.REALM_NOT_ENABLED);
|
}
|
}
|
|
private void checkClient(String service) {
|
if (service == null) {
|
event.error(Errors.INVALID_REQUEST);
|
throw new ErrorPageException(session, Messages.MISSING_PARAMETER, CASLoginProtocol.SERVICE_PARAM);
|
}
|
|
client = realm.getClients().stream()
|
.filter(c -> CASLoginProtocol.LOGIN_PROTOCOL.equals(c.getProtocol()))
|
.filter(c -> RedirectUtils.verifyRedirectUri(uriInfo, service, realm, c) != null)
|
.findFirst().orElse(null);
|
if (client == null) {
|
event.error(Errors.CLIENT_NOT_FOUND);
|
throw new ErrorPageException(session, Messages.CLIENT_NOT_FOUND);
|
}
|
|
if (!client.isEnabled()) {
|
event.error(Errors.CLIENT_DISABLED);
|
throw new ErrorPageException(session, Messages.CLIENT_DISABLED);
|
}
|
|
redirectUri = RedirectUtils.verifyRedirectUri(uriInfo, service, realm, client);
|
|
event.client(client.getClientId());
|
event.detail(Details.REDIRECT_URI, redirectUri);
|
|
session.getContext().setClient(client);
|
}
|
|
private void createClientSession() {
|
clientSession = session.sessions().createClientSession(realm, client);
|
clientSession.setAuthMethod(CASLoginProtocol.LOGIN_PROTOCOL);
|
clientSession.setRedirectUri(redirectUri);
|
clientSession.setAction(ClientSessionModel.Action.AUTHENTICATE.name());
|
}
|
}
|