CAS全称是中心认证服务(Central Authentication Service), 是SSO服务中一种认证协议, 目前有三个版本1.0, 2.0, 3.0

#CAS认证流程

  • 认证过程
    1
    略... :)
  • 如图所示

#CAS协议认证接口URI

  • 接口列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. /login接口

2. /logout接口

3. /validate接口 Ticket认证接口 (v1.0)

4. /serviceValidate接口 Ticket认证接口 (v2.0)

5. /proxyValidate接口 Ticket认证/代理接口 (v2.0)

6. /proxy接口 代理服务接口 (v2.0)

7. /p3/serviceValidate接口 Ticket认证接口(v3.0

8. /p3/proxyValidate接口 Ticket认证/代理接口 (v3.0)
  • 接口数据结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#login接口
请求参数:
service=http://686617c54d47/users/auth/cas3/callback?url=http://127.0.0.1/users/sign_in

选填参数:
renew=
gateway=
method=

响应参数:
认证成功: 302跳转到service地址, 附带ticket认证成功参数
认证失败: SSO登陆页面提示错误信息


#logout接口
v1.0,v2.0版本:
账户退出成功后显示成功信息的页面

v3.0版本:
请求参数中不带service, 显示退出成功页面;参数中带有service,退出成功后跳转到service页面


#validate接口 (不推荐使用)
请求参数:
service:
ticket: (login时认证的Ticket)
renew(选填)

响应参数:
认证成功: yes<LF>
认证失败: no<LF>

#serviceValidate接口
请求参数:
service:
ticket: (login时认证的Ticket)
pgtUrl: (代理url, 选填)
renew: (选填)
format: (期待响应结果格式:xml或json, Gitlab默认使用XML)

响应参数:
认证成功(xml格式):
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>业务参数</cas:user>
<cas:attributes>
<cas:firstname>业务参数</cas:firstname>
</cas:attributes>
<cas:proxyGrantingTicket>新生成的Ticket</cas:proxyGrantingTicket>
</cas:authenticationSuccess>
</cas:serviceResponse>

认证失败(xml格式):
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationFailure code="INVALID_TICKET">
错误信息
</cas:authenticationFailure>
</cas:serviceResponse>

认证失败相关的错误码:
INVALID_REQUEST | INVALID_TICKET_SPEC | INVALID_TICKET | INVALID_SERVICE | INTERNAL_ERROR

#Ticket身份票据

ticket是认证周期中身份凭证,ticket字符仅包含{A-Z, a-z, 0-9}和”-“, 字符长度最好大于64位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
service类型Ticket: 
1. 用于校验login service参数中的地址
2. Ticket字符串必须以"ST-"开头
3. Ticket验证次数限制,有效期等安全性

proxy类型Ticket:
1. 用于校验proxy service参数中的地址
2. Ticket字符串必须以"PT-"开头
3. Ticket验证次数限制,有效期等安全性

proxy-grant类型Ticket:
1. 多级别proxy代理中使用,非一次性ticket
2. Ticket字符串必须以"PGT-"开头
3. Ticket验证次数限制,有效期等安全性

login类型Ticket:
1. 登陆成功后标志Ticket
2. Ticket字符串必须以"LT-"开头

ticket-granting类型:
1. Verify认证成功后产生的Ticket
2. Ticket字符串必须以"TGT-"开头
3. Ticket验证次数限制,有效期等安全性
4. 尽量再加密一次Ticket

ticket-granting cookie类型:
1. Verify认证成功后产生的Ticket, 保存在Cookie中(同二级域名下使用cookie)
2. Ticket字符串必须以"TGC-"开头
3. Cookie路径严格限制 (多用于同二级域名其他站点)
4. Cookie中可能包含ticket-granting的ticket(不推荐)

#参考

  1. [CAS协议细节] https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html
  2. [CAS协议原理] https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol.html
  3. [CAS客户端实现] https://apereo.github.io/cas/4.2.x/integration/CAS-Clients.html
  4. [CAS原理解析] https://juejin.im/post/5a002b536fb9a045132a1727

评论