关于sso单点登录的一点新想法

355 阅读2分钟

前奏

看了一些关于sso单点登录,网上讲的一些实现,大概意思都差不多。都是有一个sso系统,不同的应用通过跳转到sso系统换取一个一次性的ticket参数,然后通过参数换取信息,实现多应用跨域名只需要登录一次。就如这篇文章讲的《# 单点登录(SSO)看这一篇就够了》

我的一些新想法

我想了想,感觉这样跳转重定向好麻烦,ticket换取用户信息防伪造,但是还是存在本地,还是可以伪造吧,没感觉安全在哪儿。 这时我想到浏览器有一个唯一的指纹。看这个开源的项目FingerprintJS

如果我以浏览器指纹作为我的身份验证,我登录的时候,将浏览器指纹传给后台,后台通过Redis将浏览器指纹和用户信息进行关联存储,设置过期时间,然后通知客户端,你已经登录了。这时候客户端跳转到相应的业务系统,业务系统里面进行业务交互时,都以浏览器指纹来判断是否登录以及获取相应的用户信息。这样跨不跨域名,都不会有任何影响。

如果同一个团队,开发的不同项目,部署在同一个服务器,公用的Redis。多个项目的客户端在同一个浏览器上访问,存储就乱了吧。为了区分不同项目,每个项目配置好一个唯一的key值。客户端通过key + 浏览器指纹 + 时间戳进行加密处理,放在headers中通过接口传给服务端,服务端进行解密,然后再将key + 浏览器指纹作为key存储到Redis。

为啥整个时间戳放里面,是为了每次前端传输,值都不一样,后台也可以校验时间,使用这个唯一标识的里的时间和接口请求的时间如果误差大的话,就判定为是非法请求,增加安全性和防伪造吧。

关于浏览器指纹

github_landing.png

Pro版本是要花钱的,有99.5%,不花钱的Open Source只有60%。不过99.5%也够了吧。

不过对于此,我又想了想,接口还可以拿到客户端 内网IP外网IP,以及 userAgent,可不可以将这三者进过计算加密来代替浏览器指纹呢,这三者是不是可以来确定唯一性?

这些都是我个人的一些发散想法,并没有进行实际验证,也不知道这样做的项目是不是会有问题。