cas客户端集成方案

面向读者

需要集成单点登录功能的第三方软件供应商

目的

  • 解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录。
  • 提高用户效率,用户不再被多次登录困扰,也不需要记住多个 ID 和密码。另外,用户忘记密码并求助于支持人员的情况也会减少。
  • 简化管理,如果应用程序加入了单点登录协议,管理用户帐号的负担就会减轻。

参考文档

https://github.com/apereo/cas

http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html

https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html

cas单点登录简介

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:

  1. 开源的企业级单点登录解决方案。
  1. CAS Server 为需要独立部署的 Web 应用。
  2. CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

部署架构图#

CAS单点登录流程图#

详细协议参考: https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html

第一次登陆APP1应用

http://upload-images.jianshu.io/upload_images/3696220-1c673a739803183f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

1访问应用app1

用户访问http://127.0.0.1/app1
此时APP1通过检测session发现用户并没有登录于是重定向到cas-server。

注意:第三方集成需要实现此逻辑

2APP1重定向到cas-server请求登录认证

重定向地址 http://192.168.1.100/cas/login?service=http://127.0.0.1/app1/cas
附带一个service参数告诉cas-server认证成功后再次重定向的地址。

3用户输入用户名密码提交

4认证成功,返回ticket

cas-server接受客户的参数认证成功,并生成一个ticket,重定向给app1,重定向地址
http://127.0.0.1/app1/cas?ticket=XXXXXXX

5校验ticket

对于Java应用来说http://127.0.0.1/app1/cas看起来就是个Servlet或者filter,当这个filter接受到第四步的ticket后,立刻拿着这个ticket去cas-server验证用户认证信息。cas2.0协议中,验证这个ticket的地址为
http://192.168.1.100/cas/serviceValidate,可以使用httpclient或者提供的客户端去调这个接口。

成功会返回

<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
 <cas:authenticationSuccess>
  <cas:user>username</cas:user>
  <cas:proxyGrantingTicket>PGTIOU-84678-8a9d...</cas:proxyGrantingTicket>
 </cas:authenticationSuccess>
</cas:serviceResponse>

失败返回

<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
 <cas:authenticationFailure code="INVALID_TICKET">
    Ticket ST-1856339-aA5Yuvrxzpv8Tau1cYQ7 not recognized
  </cas:authenticationFailure>
</cas:serviceResponse>

注意:第三方集成需要根据协议流程图实现此filter或者servlet

6返回app1

由于APP1单点信任cas-server,在得到第5步的user信息后,将user信息存入app1的session,或者其他方式标识该用户认证成功。
至此用户登录完成,整个过程app1无法知晓用户的密码,用户名密码由cas-server统一管理。

成功登陆APP1后登陆app2 流程图(免输用户名密码)##

http://upload-images.jianshu.io/upload_images/3696220-97d2be64dbf802d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

1访问应用app2 http://127.0.0.1/app2

此时APP2通过检测session发现用户并没有登录于是重定向到cas-server

2APP1重定向到cas-server请求登录认证

重定向地址 http://192.168.1.100/cas/login?service=http://127.0.0.1/app1/cas
附带一个service参数告诉cas-server认证成功后重定向的地址。

3判断用户已经登录

cas检测session发现用户已经登录过,于是直接跳转到第四步http://127.0.0.1/app2/cas?ticket=XXXXXXX
,而不是跳转到登录地址,这个过程对用户无感知。

4认证成功返回ticket

5校验ticket

于首次登录流程一致。

6返回app2

在用户这端访问APP2,直接就跳转到了登录后的页面,达到了免输用户名密码的效果,实际上在cas-server做了两次重定向。

接口#

/login,登录##

参数

  • service(必须),应用的唯一标识符号,例如http://127.0.0.1/app1/cas

举例

https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice

/logout,注销登录

调用这个接口,整个单点登录会话结束,其他应用单点登录功能失效。

举例

https://cas.example.org/cas/loout

/serviceValidate,验证ticket是否有效

参数

  • service(必须),应用的唯一标识符号,例如http://127.0.0.1/app1/cas

  • ticket (必须),通过登录获得到的票据

  • format (可选,xml或者json)指定接口返回的格式

返回

  • 成功

      <cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
       <cas:authenticationSuccess>
        <cas:user>username</cas:user>
        <cas:proxyGrantingTicket>PGTIOU-84678-8a9d...</cas:proxyGrantingTicket>
       </cas:authenticationSuccess>
      </cas:serviceResponse>
    

失败

    <cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
     <cas:authenticationFailure code="INVALID_TICKET">
        Ticket ST-1856339-aA5Yuvrxzpv8Tau1cYQ7 not recognized
      </cas:authenticationFailure>
    </cas:serviceResponse>

举例

https://cas.example.org/cas/validate?service=http%3A%2F%2Fwww.example.org%2Fservice&ticket=ST-1856339-aA5Yuvrxzpv8Tau1cYQ7

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容