基于 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

posted @ 2021-04-11 09:59  Yxh_blogs  阅读(2179)  评论(0编辑  收藏  举报