个人实践总结,最初的的需求,多个产品线都在同一个根域名下面。
独立的用户中心分离,单独负责用户登录和用户信息获取、变更等处理逻辑。
第一步,用户登录成功,分配给用户一个memToken(令牌),通过cookie来多个产品线共享,后台逻辑,生成memToken和用户id的一个关联关系存入缓存。
memToken生成逻辑,ip+memCard+时间戳+secret ,通过md5生成,可以使用其它方式生成。
第二部,有用户相关操作通过memToken完成,这里有一个地方需要注意,需要有公共的处理层解析处理验证memToken,这样可以自由扩展memToken的验证规则,比如限制某个ip的访问频率、或者拉黑某个ip等一些防爬取的逻辑。
上面就是一个最简易的单点登录实现,但这时候有一个问题出现了...如果我们的多个产品不是同一个根域名怎么办?
这时候其实没有那么复杂,只要做一些改变就好了
第一步:首先,cookie的存储还是可以是某个根域名也可以是用户中心的子域名,但用户中心需要配置好允许浏览器跨域名访问(这个很关键)。
第二部:第一种方式可以通过cookie直接获取到memToken然后再根据memToken获取用户登录状态和登录信息,这里就要变化了,通过在浏览器访问统一的用户中心接口,然后接口不是通过参数获取memToken了,而是改为从cookie获取(这点变化挺明显的)也可以使用其它方法,总之就是曲线实现cookie的共享。注意:通过ajax跨域访问一定要记得开启cookie的信息携带(withCredentials: true)..不然会很坑
删除:基于我们的前面设计memToken和用户关联的逻辑,通过接口实现对memToken关联关系的删除来实现,cookie同步删除。
个人的实践,可能有漏洞也可能有更好的办法,欢迎讨论
qq技术交流群:208779755