本服务提基于CAS协议,实现简易SSO功能(Single Sign On, 单点登录)。可提供跨域名的统一身份认证。本服务基于flask框架实现,运行环境为python 3.6.5。
CAS服务规程共计三个,分别为:
- 用户登录过程
- 已登录用户认证过程
- 用户登出过程(暂未实现)
参与本规程的实体包含三个:
- 用户 user
- CAS服务 cas
- 他方应用 app
规程描述如下:
- user 发送请求到 app, 以请求获取相关资源;
- app 获取到 user 发来的请求,判断该用户是否已通过认证。若通过认证,则结束规程,否则将返回给 user 状态码为302的响应报文, 报文携带 app 与 cas 事先商议好的 domain,domain用于标记app身份。使用户跳转到 cas,进行cas认证;
- user 将携带由 app 返回的 domain,发送认证请求到 cas;
- cas 判别是否已经颁发给 user 票证授予票证 tgt,若未颁发tgt或tgt过期失效,则返回 user 登录页面,要求用户进行登录;
- user 将自身身份凭证及口令发送给 cas 请求身份认证;
- cas 判别用户身份,若通过身份认证,将 domain 查询与 app 事先商议好的回调地址 callback_url,颁发给user的tgt,以及服务票证 st 返回给用户;
- 用户将携带 st 访问 cas 发回的回调地址。
- app 将在回调地址处获取到 st, 当app需要获取 user 的相关信息或权限声明时, 需要携带 st 访问 cas 的 server_validate 服务;
- cas 接收到 server_validate 的服务请求时, 判断 st 是否存在、是否过期。当符合一切约束要求时,将返回与 st 绑定的 user 相关数据。
在已登录 cas 的 user 执行该规程时,即已经获得尚未过期的 tgt。不需要用户再次输入用户凭证及口令,cas可直接颁发st。
该服务运行在python 3.6.5环境下,相关的依赖库已经标记在 requirements.txt 当中,可使用pip进行安装:
$ pip3 install -r requirements.txt
运行该服务的方法如下:
$ python3 main.py start
数据库的建表sql 在文件 cas_schema.sql 中,在cas/config.cfg可修改连接数据库的配置,可根据本地需要进行修改。
HTTP Method: GET
访问URL: /login?domain=<app标识>
接口描述: 获取app信息
返回结果:
如果用户尚未登录,或TGT已经过期,并且app标识在CAS中存在,则返回app的相关信息
{
"name": "<app名称>"
}
如果用户已经登录,并且TGT尚未过期,并且app标识在CAS中存在,则返回如下信息
{
"message": "login_success",
"server_ticket": "<ST票证token>",
"callback_url": "<回调地址>"
}
HTTP Method:POST
访问URL:/login
接口描述:用户登录CAS
访问参数:
{
"username": "<用户名>",
"password": "<口令>",
"domain": "<app标识>"
}
返回结果:
如果用户登录成功,将返回如下信息:
{
"message": "login_success",
"ticket_grant_ticket": "<票证授予票证TGT token>",
"server_ticket": "<服务票证ST token>",
"callbacl_url": "<回调地址>"
HTTP Method: GET
访问地址: /server_validate?token=<ST token>
返回结果:
[
"<权限标识tag>",
...
]