基于 OAuth2.0 协议的单点登录系统方案设计
一、什么是单点登录?
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。---- 《百度百科》
换而言之,在公司业务逐渐壮大的过程中,开发了很多的子系统。每个子系统都有自己的用户的登录、注册模块,为了能够在公司内部统一用户登录授权功能,诞生了一个统一的用户登录认证系统,这个系统就可以称之为单点登录系统。
二、什么是 OAuth2.0 协议?
OAuth 是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。主要是用于在第三方平台上进行的用户授权,常见的一些场景,例如:QQ、微博、微信的授权登录。第三方开发平台的授权接入,例如:Shopify、速卖通、亚马逊等。
三、单点登录解决什么问题?
假设,当我们的 ERP 系统功能模块越来越多的时候,后期可能会拆分出产品库存系统、财务系统、订单系统、工单系统等,那是不是意味着每个系统都需要开发一套登录注册功能呢?如果每个系统有一套自己的用户体系,就会出现用户在使用的时候,需要重复注册、重复登录、重复记住对应的账号密码,一旦子系统多达十几个的时候,对于用户来说这种情况,显然是不能接受的。
其次对应我们开发人员来说,很显然也不可能每个系统开发一套相同的功能,因此我们需要有一套能够统一登录、注册、用户管理、权限等功能的系统。那么这样一套系统就是,今天要分享的单点登录系统。单点登录系统,能够让我们只需拥有一个账号,便可以访问任意的子系统,类似于我们拥有了一张通行证,行便天下,畅通无阻。
四、单点登录交互时序图
五、案例演示
1、授权界面
2、系统地址
SSO 系统:http://www.sso.com/
A 业务系统:http://www.a.com
B 业务系统:http://www.b.com
3、关键代码
六、Ouath 2.0 授权模式的参数说明
1、客户端传递的参数
参数 | 描述 |
---|---|
response_type | 表示授权类型,必选项,此处的值固定为"code" |
client_id | 表示客户端的ID,必选项 |
redirect_uri | 表示重定向URL,可选项 |
scope | 表示申请的权限范围,可选项 |
state | 表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。 |
2、授权系统回调给客户端的参数
参数 | 描述 |
---|---|
code | 表示授权码,必选项。 |
state | 如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。 |
3、客户端向授权系统申请 Token 所需参数
参数 | 描述 |
---|---|
grant_type | 表示使用的授权模式,必选项,此处的值固定为"authorization_code"。 |
code | 表示获得的授权码,必选项。 |
redirect_uri | 表示重定向URI,必选项,且必须与上面中的该参数值保持一致。 |
client_id | 表示客户端ID,必选项。 |
client_secret | 表示客户端密钥,必选项。 |
4、授权系统返回给客户端的参数
参数 | 描述 |
---|---|
access_token | 表示访问令牌,必选项。 |
token_type | 表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。 |
expires_in | 表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。 |
refresh_token | 表示更新令牌,用来获取下一次的访问令牌,可选项。 |
scope | 表示权限范围,如果与客户端申请的范围一致,此项可省略。 |
七、总结
单点登录系统旨在打通各个子系统的用户体系,实现多场景下的免登。同时,企业内部也统一了账号体系,实现了用户数据的聚合。减少了用户的反复登录,提升了产品的体验。从系统的层面,减少了系统的重复建设,降低了研发成本。从安全层面,统一管理用户账号,提升了用户账号及权限的安全性。
本次分享的主要目的,旨在让大家了解单点登录的思想,以及 Ouath2.0 协议在实际场景中的应用。单点登录只是一种解决问题的手段或技术解决方案,Oauth2.0 协议是一套授权的标准。那么单点登录系统,就是这两者的结合。附代码 https://github.com/yxhsea/single-point.git