`
denger
  • 浏览: 359516 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CAS 之 集成RESTful API

阅读更多
     最近因为公司另一款基于C/S的产品也需要整合到CAS 的 SSO,但是 CAS 本身对于客户端或浏览器而言是基于其COOKIE来存储用户(TGT)Ticket的,所以这时候就需要使用 CAS 的 RestFul API 来进行登录验证,并支持在C/S软件中点击用户头象时打开浏览器并跳转至用户中心,而且这时候在 WEB 上应该是已登录的状态(类似QQ点击自己的头象时,马上就进入到了QQ空间。)

     关于CAS的登录验证流程,可以参考“CAS 之 实现用户注册后自动登录”,这里的RESTful登录验证流程与其大致相似,大体流程为:首先客户端提交用户名、密码、及Service三个参数,如果验证成功便返回用户的TGT(Ticket Granting Ticket)至客户端, 然后客户端再根据 TGT 获取用户的 ST(Service Ticket)来进行验证登录。 故名思意,TGT是用于生成一个新的Ticket(ST)的Ticket,而ST则是提供给客户端用于登录的Ticket,两者最大的区别在于,TGT是用户名密码验证成功之后所生成的Ticket,并且会保存在Server中及Cookie中,而ST则必须是是根据TGT来生成,主要用于登录,并且当登录成功之后 ST 则会失效。

     CAS本身已经提供了 restlet 的集成包,如果你用的是 maven 的话直接加入,我这里的Cas-server的版本是 3.4.2.1:
<dependency>
	<groupId>org.jasig.cas</groupId>
	<artifactId>cas-server-integration-restlet</artifactId>
	<version>3.4.2.1</version>
	<type>jar</type>
</dependency>

     然后再在 web.xml 中加入:
<servlet>
		<servlet-name>restlet</servlet-name>
		<servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>restlet</servlet-name>
		<url-pattern>/v1/*</url-pattern>
	</servlet-mapping>


    因为使用到了 Restlat 框架,所以还需要依赖几个 jar 包,分别是:
  •      com.noelios.restlet.ext.servlet.jar
  •      com.noelios.restlet.ext.spring-1.1.0.jar
  •      com.noelios.restlet.jar
  •      org.restlet-1.1.10.jar
  •      org.restlet.ext.spring-1.1.10.jar

   这几个jar已经打包在附件中了,另外 restlet.org 的 maven库中也有,需要的话可以去 maven.restlet.org 上找。
   另外关于 restlet的配置在 cas-server中已经存在在: /WEB-INF/restlet-servlet.xml文件。

   配置OK之后直接启动Server,下面来进行简单登录验证的测试:

   1. 提交用户名密码及Service 进行登录验证
      
DengerMacBook:cas-server denger$ curl -i -X  POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/member/v1/tickets/

HTTP/1.1 201 Created
Date: Wed, 23 Mar 2011 12:42:52 GMT
Location: http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas
Accept-Ranges: bytes
Server: Noelios-Restlet-Engine/1.1.6
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 437

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>201 The request has been fulfilled and resulted in a new resource being created</title></head><body><h1>TGT Created</h1><form action="http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas" method="POST">Service:<input type="text" name="service" value=""><br><input type="submit" value="Submit"></form></body></html>

    在以上Response信息及 Header中可以看到生成的 TGT,接下来是再重新根据 TGT 获取 ST,将请求的 URI 地址就是以上 Header中的 Location地址。

   2. 根据返回的 TGT 来获取 ST
   
DengerMacBook:cas-server denger$ curl -i  -X POST -d "service=http://www.google.com" http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas

HTTP/1.1 200 OK
Date: Wed, 23 Mar 2011 12:48:03 GMT
Accept-Ranges: bytes
Server: Noelios-Restlet-Engine/1.1.6
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 29

ST-2-lJfQyJMMEnNGnKcglf1d-cas

    获取成功之后则返回了 ST,这时候对于客户端而言就已经拿到了登录的TIcket, 如果需要在Web中自动登录的话,只需要弹出浏览器,将ST作为 ticket参数传入即可。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为:  http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录。 当然前提是在该Web应用中需要部署cas-client应用。

   3. 注销用户
  
DengerMacBook:cas-server denger$ curl -i  -X DELETE http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas

HTTP/1.1 200 OK
Date: Wed, 23 Mar 2011 12:54:28 GMT
Accept-Ranges: bytes
Server: Noelios-Restlet-Engine/1.1.6
Content-Length: 0
  注销用户就很简单了,直接 SUBMIT DELETE 删除 TGT即可.

  Java代码调用示例:
package cas;

import java.io.IOException;
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;


public final class Client
{
  private static final Logger LOG = Logger.getLogger(Client.class.getName());

  private Client()
  {
    // 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;

    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;
  }

  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://192.168.41.107:8080/member/v1/tickets";
    final String username = "admin";
    final String password = "111111";
    final String service = "http://localhost:8080/service";

    LOG.info(getTicket(server, username, password, service));
  }
}

   参考:https://wiki.jasig.org/display/CASUM/RESTful+API
分享到:
评论
21 楼 WANTAWAY314 2016-03-22  
还有一个问题,ST是根据service生成的,需要把多个应用的service配置成一样的,才能实现一个ST在多个应用中登录? 但是service好像要跟各自应用的ip或者域名有关,生成的ST才可以登录
20 楼 WANTAWAY314 2016-03-22  
你好。。。。。。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为:  http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录。。。。我获取到了tickets,直接按照你上面说的不行,但是浏览器上service?tickets=ST,可以转到目标地址,,,但是转向后才是  目标url?tickets=ST.........请问下这个是为什么
19 楼 飘渺青衣 2016-01-04  
rryqsh123 写道
final String service = "http://localhost:8080/service";  这是做什么用的?
还有ST也拿到了 但是按照 http://localhost:18080/CAS_BS_Client?ticket=ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org  登录报错


错误信息:
org.jasig.cas.client.validation.TicketValidationException:
绁ㄦ牴'ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org'涓嶇鍚堢洰鏍囨湇鍔?


好像ST是有时效的,必须在短时间使用,超时就这个错误了
18 楼 lysunki 2015-08-08  
郑州蘑菇云 写道
你这个文章我看了,也试验成功能够进行登录了,虽然能够登录,但是进入其他系统的话还是需要跳转到cas认证中心的登录界面进行登录?这是怎么回事?

请问有解决吗
17 楼 郑州蘑菇云 2015-05-08  
你这个文章我看了,也试验成功能够进行登录了,虽然能够登录,但是进入其他系统的话还是需要跳转到cas认证中心的登录界面进行登录?这是怎么回事?
16 楼 rryqsh123 2015-03-27  
final String service = "http://localhost:8080/service";  这是做什么用的?
还有ST也拿到了 但是按照 http://localhost:18080/CAS_BS_Client?ticket=ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org  登录报错


错误信息:
org.jasig.cas.client.validation.TicketValidationException:
绁ㄦ牴'ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org'涓嶇鍚堢洰鏍囨湇鍔?
15 楼 rryqsh123 2015-03-24  
为什么返回404啊
14 楼 chenhbc 2014-10-06  
hae 写道
经过无数次的失败终于搞定了

curl -i -X  POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/

楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com"  这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/  这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/文字cas-server/v1/tickets/ 这样写我相信大家会更明白点
 

 
请教下,我的验证成功了,拿到Ticket了,可是用http://XX.com?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 跳转过去后说票根无效,求解。
13 楼 renlei413326889 2014-09-18  
感谢博主,您的一系列文章都很有价值~~
12 楼 dphenixiong 2014-08-07  
带上ST后,无效,ST无法识别....
11 楼 冬天秋天 2014-07-10  
magic_wz 写道
请问,我拿到里ST之后,怎么登录不了?


使用这种方式进行浏览器登录:
http://localhost:8090/console/?ticket=ST-21-qn0wsQN9VK0cQ1pfemW9-sso
10 楼 冬天秋天 2014-07-10  
获取ST之后点击链接可以打开浏览器并进行登录,但是浏览器中也有退出登录的按钮,如何在浏览器中获取TGT,完成REST 方式的退出登录呢?
9 楼 magic_wz 2014-01-07  
请问,我拿到里ST之后,怎么登录不了?
8 楼 glassesbamboo 2013-12-23  
xiaokang1582830 写道
  获取成功之后则返回了 ST,这时候对于客户端而言就已经拿到了登录的TIcket, 如果需要在Web中自动登录的话,只需要弹出浏览器,将ST作为 ticket参数传入即可。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为:  http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录?登录时总是提示票根无效

我也觉得这里的方法是错误的,正如楼主在一开始自己说的,ST一旦验证过用户的身份是合法以后,ST就失效了,这里再带上ST去访问,肯定吃闭门羹啊。
7 楼 chengtianfei 2013-12-05  
service=http://www.google.com
这个service 可以随便写吗,我配置了一个service 他就只能访问这一个,其它的都包错误说票据无效,其它的系统都实现了cas 的客户端,有人回答一下原因吗?
6 楼 hae 2013-08-14  
hae 写道
经过无数次的失败终于搞定了

curl -i -X  POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/

楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com"  这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/  这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/cas-server/v1/tickets/ 这样写我相信大家会更明白点
 

5 楼 hae 2013-08-14  
经过无数次的失败终于搞定了

curl -i -X  POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/

楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com"  这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/  这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/文字cas-server/v1/tickets/ 这样写我相信大家会更明白点
 
4 楼 bmwcyq520 2013-08-08  
为什么我的返回结果集里面没有这一行呢?
Location: http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas 
3 楼 bmwcyq520 2013-08-07  
我怎么返回的是404,是不是需要在restlet-servlet.xml配置什么啊?
2 楼 fogu 2013-03-07  
我访问v1/tickets的时候,返回的是200码,debug的时候发现代码去跳转访问/cas/login接口了,访问完了以后就传回200了,而不是希望的201 create,不知道是什么原因,我用户名和密码也已经传递过去了

相关推荐

    CAS RESTful API 开发文档

    n cas-server-3.4.2\modules\cas-server-support-jdbc-3.4.2.jar 、 cas-server-integration-restlet-3.4.2.jar 拷贝到 D:\server\apache-tomcat-6.0.18\webapps\cas\WEB-INF\lib 目录下。 n 数据库驱动 jar 拷贝...

    H3C CAS REST API接口

    REST(Representational State Transfer)API是H3C CAS系统提供的一种接口方式,用于允许外部应用程序与CAS系统进行交互,实现系统的集成和二次开发。通过REST API,开发者可以远程操作和管理H3C CAS中的各种资源,...

    CAS Service 5.2.x 数据库连接REST已经配置

    在5.2.x版本中,CAS引入了RESTful API,这使得系统配置和管理更加灵活,可以通过HTTP请求直接操作。 对于MySQL数据库的配置,CAS通常会使用JDBC驱动来建立连接。在`cas.properties`或`application.yml`配置文件中,...

    基于springboot,cas5.3,shiro,pac4j,rest接口获取ticket不再跳转cas server登录页

    CAS 5.3版本引入了更多的改进和增强,包括支持RESTful API,使得与CAS交互更加灵活。 Shiro是Apache提供的一款轻量级的安全框架,用于实现身份认证、授权和会话管理。在Spring Boot应用中,Shiro可以轻松地集成并...

    cas3.4集成restle所需jar文件

    Restlet提供了客户端和服务器端的组件,可以方便地与Cas集成,实现基于REST的身份验证。 在Cas 3.4集成Restlet的过程中,你需要以下jar文件: 1. `cas-server-support-restlet`: 这是Cas提供的Restlet支持模块,...

    cas4.0集成restle所需jar文件

    集成 RESTle 则是为了将 CAS 的功能扩展到RESTful API接口,使得非Web应用也能受益于CAS的安全认证。 RESTle(Representational State Transfer for Lightweight Entities)是专门为CAS设计的一个扩展,它允许通过...

    cas-server-4.0.0-release+cas-client-3.2.1-release

    综上所述,`cas-server-4.0.0-release` 和 `cas-client-3.2.1-release` 文件包含了构建和维护一个基于CAS的单点登录系统所需的关键组件和源码,对于理解SSO机制、开发和优化CAS集成具有很高的价值。通过深入研究这些...

    前后端分离集成cas

    本项目是关于前后端分离集成CAS(Central Authentication Service)的一个实例,主要使用了Spring Boot、Shiro、Oracle数据库以及Vue.js等技术。 首先,Spring Boot是基于Spring框架的轻量级开发工具,它简化了新...

    cas、第三方接口登录

    CAS(Central Authentication Service)是基于Java的开源身份验证框架,用于实现单一登录(Single Sign-On,简称SSO)。SSO允许用户通过一次登录,就可以访问多个应用系统,无需重复输入用户名和密码。这对于大型...

    H3C CAS云计算软件套件《H3C CAS七日通》.rar

    9. **API与集成**:了解H3C CAS提供的RESTful API和SDK,以及如何与其他系统集成,实现自动化运维流程。 10. **开局配置实战**:通过H3C CAS开局配置指导书,一步步操作设置CAS环境,包括硬件准备、软件安装、网络...

    cas-overlay-template-5.3

    6. **RESTful API**:随着微服务架构的流行,CAS 5.3可能会提供RESTful API接口,方便与其他服务进行交互和集成。 7. **安全性增强**:版本5.3可能会包含安全更新,例如加强HTTPS支持,防止中间人攻击,并且提供更...

    cas-5.2.0源码

    7. **API与Web服务**:CAS 提供了 RESTful API 和 SOAP 接口,便于与其他系统集成。源码中可以研究这些接口的设计和实现。 通过对 CAS-5.2.0 的源码学习,开发者不仅可以深入理解 SSO 的工作原理,还能掌握如何定制...

    cas验证包--3.5.3版本文件

    10. **API和Web服务**:CAS提供了RESTful API和SOAP Web服务接口,使得系统可以通过程序化方式与CAS交互。 在解压后的“cas-3.5.3”文件夹中,你可能会找到以下组件: - `cas-server-webapp`: CAS服务器的Web应用...

    cas4.1.x集成.zip

    **三、CAS集成步骤** 1. **环境准备**:确保Java环境(JDK)和构建工具(如Maven)已安装。 2. **下载CAS服务器**:从官方网站获取CAS 4.1.x源码或预编译的服务器包。 3. **配置服务器**:修改`cas.properties`配置...

    cas-5.1zip文件

    7. **API与集成**:开发者可以利用CAS的RESTful API或Java API与CAS服务器进行交互,也可以集成到其他开发工具或持续集成/持续部署(CI/CD)流程中。 8. **自定义认证**:CAS支持自定义认证策略,例如通过LDAP、...

    SSO CAS Server 二次开发说明文档

    为了更好地支持移动设备,可以为CAS Server增加RESTful API,以便于移动应用集成。 1. **添加Spring Web依赖**:如果CAS Server尚未支持RESTful服务,需要添加Spring Web相关的依赖。 2. **修改`webx.xml`**:配置...

    cas4.2.4、cas4.0war包

    2. **RESTful API**:增加了RESTful接口,使得与其他系统集成更加便捷。 3. **多语言支持**:支持多种语言的用户界面,增强了国际化体验。 4. **自定义认证流程**:提供了更灵活的认证策略,允许开发人员创建...

    cas实现单点登录 功能

    4. API 认证:为 RESTful API 提供认证支持。 六、CAS 安全考虑 虽然 CAS 提供了便利的身份验证,但也需要注意安全问题,如防止 Session Fixation 攻击、保护 Service Ticket 不被截获、定期清理无效票证等。...

    cas 6.0.0-rc3

    3. **RESTful API**:随着Web服务的发展,CAS 6.0.0-RC3提供了RESTful API接口,允许管理员和开发者以更灵活的方式与CAS服务器交互,进行身份验证、票证管理等操作。 4. **多因素认证(MFA)支持**:CAS支持多种多...

Global site tag (gtag.js) - Google Analytics