package org.jasig.cas.test.client; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.restlet.Client; /** * An example Java client to authenticate against CAS using REST services. * Please ensure you have followed the necessary setup found on the wiki. * * @author jesse lauren farinacci * @since 3.4.2 */ public final class RestClient { private static final Logger LOG = Logger.getLogger(Client.class.getName()); private RestClient() { // static-only access } public static String getTicket(final String server, final String username, final String password, final String service) { notNull(server, "server must not be null"); notNull(username, "username must not be null"); notNull(password, "password must not be null"); notNull(service, "service must not be null"); return getServiceTicket(server, getTicketGrantingTicket(server, username, password), service); } private static String getServiceTicket(final String server, final String ticketGrantingTicket, final String service) { if (ticketGrantingTicket == null) return null; LOG.info(ticketGrantingTicket); final HttpClient client = new HttpClient(); final PostMethod post = new PostMethod(server + "/" + ticketGrantingTicket); post.setRequestBody(new NameValuePair[] { new NameValuePair("service", service) }); try { client.executeMethod(post); final String response = post.getResponseBodyAsString(); switch (post.getStatusCode()) { case 200: return response; default: LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } } catch (final IOException e) { LOG.warning(e.getMessage()); } finally { post.releaseConnection(); } return null; } private static String getTicketGrantingTicket(final String server, final String username, final String password) { final HttpClient client = new HttpClient(); final PostMethod post = new PostMethod(server); post.setRequestBody(new NameValuePair[] { new NameValuePair("username", username), new NameValuePair("password", password) }); try { client.executeMethod(post); final String response = post.getResponseBodyAsString(); switch (post.getStatusCode()) { case 201: { final Matcher matcher = Pattern.compile(".*action=\".*/(.*?)\".*") .matcher(response); if (matcher.matches()) return matcher.group(1); LOG .warning("Successful ticket granting request, but no ticket found!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } default: LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } } catch (final IOException e) { LOG.warning(e.getMessage()); } finally { post.releaseConnection(); } return null; } public static String validateTicket(final String server, final String serviceTicket, final String service) { return validateTicket(server, serviceTicket, service, null); } public static String validateTicket(final String server, final String serviceTicket, final String service, final String delegatingUserName) { if (serviceTicket == null) return null; final HttpClient client = new HttpClient(); final PostMethod post = new PostMethod(server + "/serviceValidate"); List nameValuePairs = new ArrayList(); nameValuePairs.add(new NameValuePair("service", service)); if (delegatingUserName == null) { nameValuePairs.add(new NameValuePair("ticket", serviceTicket)); } else { nameValuePairs.add(new NameValuePair("ticket", delegatingUserName + ":" + serviceTicket)); } post.setRequestBody(nameValuePairs.toArray(new NameValuePair[]{})); try { client.executeMethod(post); final String response = post.getResponseBodyAsString(); switch (post.getStatusCode()) { case 200: return response; default: LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } } catch (final IOException e) { LOG.warning(e.getMessage()); } finally { post.releaseConnection(); } return null; } private static void notNull(final Object object, final String message) { if (object == null) throw new IllegalArgumentException(message); } public static void main(final String[] args) { final String server = "http://localhost:9080/cas/v1/tickets"; final String server2 = "http://localhost:9080/cas"; // final String username = "container"; // final String password = "DfqnIUD&@dqa32sd"; final String username = "dawidl@icm.edu.pl"; final String password = "1"; final String service = "http://localhost:9080/service"; final String delegatingUserName = "portal"; String serviceTicket = getTicket(server, username, password, service); LOG.info(serviceTicket); String response = validateTicket(server2, serviceTicket, service); LOG.info(response); // response = validateTicket(server2, serviceTicket, service, delegatingUserName); // LOG.info(response); //serviceValidate?service=http%3A%2F%2Fwww.service.com&ticket=ST-1856339-aA5Yuvrxzpv8Tau1cYQ7 } }