简介
既然是要极简的方式来实现微信单点登陆,那么本方案采用的就是最简单的技术方案和实现,我们也从最简单的几个需求点说起:
1、如何判断是否登陆?
很显然,最简单的方式就是在业务系统中判断session是否存储用户信息进行判断。
2、如何单点登陆?
使用统一授权服务器,例如在商城系统判断为未登陆时,那么统一跳转到授权服务器,由授权服务器向微信服务器进行静默授权或提示授权,授权完成后,分配一个令牌作为url参数跳转到商城系统,由商城系统使用令牌获取用户信息,即可完成登陆
3、如何单点授权?
单点授权和同单点登陆流程相同,区别在于,用户已经由登陆过了,在授权系统上存在登陆信息,这时用户要登陆另外一个业务系统(订单系统),此时,在订单系统没有用户session信息,那么跳转到授权系统,授权系统因为已存在已登陆的用户信息,授权系统分配令牌,商城系统使用令牌获取用户信息
微信单点登陆流程图
说明:
1:微信令牌(token)和系统登陆令牌(token)两个是独立的,且没有关系
2:获取系统登陆令牌,可以是服务端重定向,也可以是浏览器在已登陆的域名通过ajax获取令牌在进行跳转
3:不同域名可以是不同session服务端,但需要统一的redis进行令牌管理
举例:
微信授权回调域名:weixin.mydomain.com 简称wx,对应后端为wx系统 (授权服务器)
用户首次登陆商城系统:
https://shop.mydomain.com/index.html 简称 shop,对应后端为shop系统
1、浏览器输入shop链接
2、shop系统判断未登陆状态,跳转到wx系统再(或直接)跳转微信静默授权,
3、wx系统通过微信code获取token(openId/unionId),wx系统判断不存在此用户资料
4、wx系统跳转到微信提示授权,用户许可授权
5、wx系统通过微信code获取token(openId/unionId),通过token获取微信用户资料
6、wx系统将用户资料保存入数据库中,并通过session设置为登陆状态
7、wx系统向redis存入令牌(例如guid)和对应的用户id,将令牌作为url参数跳转回shop链接
8、shop服务器获得令牌取得用户id(同时销毁令牌,保证安全),设置为登陆状态
9、显示shop页面,完成!
用户进入订单系统:
https://order.mydomain.com/index.html 简称 order,对应后端为order系统
1、order链接已获得令牌参数
2、order通过令牌向redis获取用户id(同时销毁令牌),从而获取用户资料,并将session设置为登陆状态
3、显示order页面,完成!
总结:
方案优点:
1、实现简单,不依赖任务第三方框架,运行效率高
2、采用一次性令牌,用完即可销毁,可以满足大部分业务系统安全性需求,如果有需要还可以对令牌进行加密
3、对授权服务器,非实时强依赖,只在授权时使用下,即可脱离,基本0耦合,
4、授权服务器集群简单,保证高可用
5、可以无缝集成第三方权限框架
方案缺点:
1、业务系统自己保存用户信息,会存在一定的内存冗余
2、用户资料变更或退出时,要广播所有业务系统同步处理