单点登陆的设计,从单域名到多域名(经验分享)

我的实践总结,最初的的需求,多个产品线都在同一个根域名下面。ajax

独立的用户中心分离,单独负责用户登陆和用户信息获取、变动等处理逻辑。跨域

第一步,用户登陆成功,分配给用户一个memToken(令牌),经过cookie来多个产品线共享,后台逻辑,生成memToken和用户id的一个关联关系存入缓存。浏览器

memToken生成逻辑,ip+memCard+时间戳+secret ,经过md5生成,可使用其它方式生成。缓存

第二部,有用户相关操做经过memToken完成,这里有一个地方须要注意,须要有公共的处理层解析处理验证memToken,这样能够自由扩展memToken的验证规则,好比限制某个ip的访问频率、或者拉黑某个ip等一些防爬取的逻辑。cookie

上面就是一个最简易的单点登陆实现,但这时候有一个问题出现了...若是咱们的多个产品不是同一个根域名怎么办?设计

这时候其实没有那么复杂,只要作一些改变就行了接口

第一步:首先,cookie的存储仍是能够是某个根域名也能够是用户中心的子域名,但用户中心须要配置好容许浏览器跨域名访问(这个很关键)。ip

第二部:第一种方式能够经过cookie直接获取到memToken而后再根据memToken获取用户登陆状态和登陆信息,这里就要变化了,经过在浏览器访问统一的用户中心接口,而后接口不是经过参数获取memToken了,而是改成从cookie获取(这点变化挺明显的)也可使用其它方法,总之就是曲线实现cookie的共享。注意:经过ajax跨域访问必定要记得开启cookie的信息携带(withCredentials: true)..否则会很坑md5

删除:基于咱们的前面设计memToken和用户关联的逻辑,经过接口实现对memToken关联关系的删除来实现,cookie同步删除。ajax跨域

我的的实践,可能有漏洞也可能有更好的办法,欢迎讨论

qq技术交流群:208779755

相关文章
相关标签/搜索