持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
前言:目前正在实现一个单点登录的需求,此前未接触单点登录的开发,对此了解甚少。为了实在需求,查阅了很多资料以及对接方开发人员的讲解,才对单点登录有所了解,过程不易,特此做一下记录。
1. 什么是SSO
单点登录(Single sign-on),简称就是SSO,是一种身份验证方法,在多个应用系统中,只需要一个登录模块,登录一次,就可以访问其他相互信任的应用系统。
2. SSO的优点
- 降低访问第三方网站风险(用户密码不存储或外部管理);
- 从不同的用户名和密码的组合减少密码疲劳;
- 减少花费的时间重新输入密码相同的身份;
- 降低IT成本适当降低一些IT帮助台调用有关密码;
- SSO集中的所有其他应用程序和系统,用于身份验证服务器的身份验证,并与技术相结合是为了确保用户不必主动输入凭据一次以上。
3. SSO单点登录与CAS和OAuth之间有什么区别
SSO仅仅是一种设计架构,而CAS和OAuth是SSO的一种实现方式,他们之间是抽象与具象的关系。
4. CAS和OAuth的区别
4.1 CAS
CAS 中央认证服务(Central Authentication Service),旨在为WEB应用系统提供一种可靠的单点登录解决方案(WEB SSO)。
CAS的单点登录时保障客户端的用户资源的安全,客户端要获取的最终信息是,这个用户到底有没有权限访问我(CAS客户端)的资源。
4.2 OAuth2.0
OAuth2.0 开放授权(Open Authorization),是一个为用户资源授权定义的安全标准,主要用于第三方应用授权登录,由于OAuth1.0标准存在安全漏洞现在已升级到2.0版本。
OAuth2.0则是保障服务端的用户资源的安全,获取的最终信息是,我(OAuth2.0服务提供方)的用户的资源到底能不能让你(OAuth2.0的客户端)访问。
5. SSO的具体流程
5.1 BS应用OAuth2.0单点登录
5.1.1 BS应用OAuth2.0单点登录集成流程图
5.1.2 流程说明
a. 第三方应用发起登录开始向请求单点登录;
b. 第三方应用通过client_id向统一身份认证发起请求code接口;
c. 统一身份认证返回应用系统code以及产生token;
d. 第三方应用拿到code发起请求通过code获得access_token接口;
e. 统一身份认证验证token是否存在;
f. 如果token存在有效,统一身份认证返回应用access_token;
g. 第三方应用发起请求通过access_token获取用户信息接口;
h. 统一身份认证返回应用用户信息。
5.1.3 OAuth2请求时序图
5.1.4 注意事项
a. client_secret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取client_secret);
b. access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户相关接口功能被恶意发起等行为;
c. refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。
建议将secret、用户数据(如access_token)放在服务器,由服务器后台调用请求。
5.2 BS应用OAuth2.0单点退出
5.2.1 门户通知身份认证退出
5.2.1.1 退出流程图
5.2.1.2 退出流程说明
a. 用户在应用已登录页面点击退出;
b. 浏览器向应用发送退出请求;
c. 应用清除自己浏览器和服务器上的缓存等信息执行退出操作,同时向统一身份认证系统认证服务发送GET请求,请求认证退出,请求中返回client_id和redirect_uri(门户退出后的主页);
d. 统一身份认证服务收到退出通知后,清除服务端认证信息和缓存信息,并将统一认证门户重定向,清理浏览器里的cookie里和localstorage等内容;
e. 浏览器清理完成后,请求redirect_uri(门户退出后的主页)地址;
f. 门户应用收到请求后返回退出后的登录页面。
5.2.1.3 时序图
5.2.2 身份认证通知应用退出
5.2.2.1 退出流程图
5.2.2.2 退出流程说明
a. 用户在统一身份认证系统门户已登录后点击退出;
b. 浏览器向统一身份认证服务发出退出请求;
c. 统一身份认证服务清理认证信息和缓存信息,并向应用系统发送post请求,使用应用中配置的登出地址url,将用户account(具体字段为requestBody)发送给第三方应用,并向浏览器返回门户退出后的界面;
d. 第三方应用接收到用户account后,清除session等信息并退出。