CAS全称是中心认证服务(Central Authentication Service), 是SSO服务中一种认证协议, 目前有三个版本1.0, 2.0, 3.0
#CAS认证流程
- 认证过程
- 如图所示
#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(不推荐)
|
#参考
- [CAS协议细节] https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html
- [CAS协议原理] https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol.html
- [CAS客户端实现] https://apereo.github.io/cas/4.2.x/integration/CAS-Clients.html
- [CAS原理解析] https://juejin.im/post/5a002b536fb9a045132a1727