编辑导语:很多时候我们都会遇到需要登陆的情况,特别是在系统设计中,我们常遇到统一登录问题,比如在公司的多种项目上;统一登陆需要注意哪些要点,有什么设计方法?本文作者介绍了统一登录服务需要考虑的点和几种常用的设计模式,我们一起来看一下。
在公司内部,如果有多个项目,每个项目都有登录,并且多个项目想要共用一套账户体系时,一般都会设计一个统一登录服务来实现业务快速接入。
下面讲下做一个统一登录服务需要考虑的点和几种常用的设计模式:
一、需要具备的基本要素
注:下文的业务侧指需要接入统一登录的业务方。
一个统一登录的登录流程:携带参数发起登录-统一登录认证-重定向业务后端地址-业务侧注入登录态-业务侧重定向到前端页面。
从登录流程可以看出几个核心要点:
1.统一登录认证
按道理统一登录服务,不是随随便便一个业务都能接入的;比如公司外部的恶意方坚决不能让它接入,所以统一登录必须要有来源的认证。
需要接入的业务方,一般会给它分配appId和appSecret,appId用于识别业务,比如appId=1表示是采购平台,appId=2表示是审核平台。
appSecret是业务方秘钥,业务方需要使用密钥通过算法计算签名,只有统一登录服务才能解出这个签名,从而识别出是信任授权应用,应用认证才能通过。
当应用认证通过后,开始校验用户,如果是新用户注册,就把业务appId和用户信息写入数据库;如果是老用户则直接校验数据库数据,用户校验成功后,整个认证成功。
2.认证成功后的跳转
当认证成功后,统一服务会发起业务侧url跳转。
上面说的业务方携带参数发起登录,这里的参数一般都有哪些呢?
appId、签名、用户信息、个性化数据、重定向地址(appId和签名上面已经说明用途)。
重定向地址用于认证成功后的业务跳转,一般是业务端的后台地址,统一登录会把用户的信息透传给业务侧,业务侧一般会做:登录态注入相应的业务域名和做一些用户数据初始化的操作。
个性化数据有什么用?当你访问一个页面时,登录态失效后会自动退出到登录页面,当再次登录成功时,按道理最好是跳转到当初退出时的具体页面。
个性化数据就是用于存放这个登录退出前的前端页面地址,统一登录会透传这个个性化数据到业务侧,业务侧注入登录态成功后,会跳转到这个前端页面。
当然个性化数据还可以放置其他的一些业务侧数据。
3.异常处理
统一登录的过程可能会有以下的异常,要注意做好错误码和错误提示的返回。
应用未登记指的是业务侧没有获取统一登录服务授权的appId和appSecret;用户已存在指的是数据库里已经存在同一个用户;用户注册信息不合法;认证超时;统一登录的登录认证一般都会做“防重放”的防御,意思就是业务侧发送的签名是有有效期的(有效期一般按秒计算),是为了防止恶意用户利用算好的签名重复多次登录。
二、设计模式
1.直接域名
统一登录平台直接提供一个统一登录域名,当登录态失效时,业务侧重定向到统一登录地址。
这种模式比较适用于公司内部的业务平台。这种模式的缺点是灵活性低,根据具体业务做相应的UI定制化比较麻烦。
2.js-sdk
sdk的方式比较灵活,其实是把登录的前端逻辑都封装在一个js-sdk当中,包括UI、发起登录请求等事件;需要接入的业务侧,只要引入这个sdk就可以使用。
js-sdk一个比较好的优点是,在用户引用它时,它可以把登录界面以iframe的形式嵌入到业务页面当中,可以自定义满足一些业务登录界面的个性化需求,比如a业务的登录界面需要放置宣传a业务的产品信息,可自定义登录信息框的位置。
而且js-sdk还可以提供改变登录样式的接口,可以让业务根据需求做些样式调整,比如更改统一登录信息框的背景图、字体、间距等。