不依赖任何框架,使用redis一次性令牌,极简实现微信单点登陆(跨域跨系统)

简介

既然是要极简的方式来实现微信单点登陆,那么本方案采用的就是最简单的技术方案和实现,我们也从最简单的几个需求点说起:

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、用户资料变更或退出时,要广播所有业务系统同步处理

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值