应用场景

  具体是酱紫的,公司内部搞了好多单独的应用系统,比如考核、wiki、OA、git服务、项目管理...好多好多用户名密码需要记哦...忘了肿么办呀!这时候就想啊!能不能搞个统一认证的平台[后面简称UAS],登陆这个平台后直接从这个平台获得其他平台的权限,然后就可以直接免登陆访问啦!想想就有点小激动。

最简单粗暴的方案

  UAS关联存储其他各系统用户名密码,跳转链接直接模拟一个登陆请求,取得子系统session后不就可以很愉快的访问了么!
Unnamed.jpg

  那么问题来了:

  1. 直接把用户名密码交给其他系统维护,总感觉有点危险,毕竟有第三个人知道密码了嘛!
  2. 其他系统的相互跳转很难实现。
  3. 模拟登陆请求也是有一定的风险的

...反正密码让其他系统知道了就是不好。

基于token的无session认证

  既然直接存储用户名密码很危险,那有木有神马东东阔以替代用户名密码捏。。。好像还真有,是不是只要生成一个无法伪造的密文来授权给授信机构就阔以捏。。。。
  那么流程就会变成酱紫:
Unnamed1.jpg

既然已经有了token串能够识别用户身份,那session又有什么卵用呢。。。。session还会无端的增加集群系统的复杂度。
  那么流程再改改:
Unnamed2.jpg

恩恩。。。看上去挺好。
  至于浏览器请求怎么带上token,那就有好多方式了。
(1)作为get请求的参数,酱紫http://bbear.com.cn/abc?token=111111111111111111111
(2)restful格式,http://bbear.com.cn/111111111111111/abc
(3)跟这post一起提交

关联权限控制

  后来,又接到一个需求,说登陆一次UAS,要能直接在全部有权限的系统直接跳转。有了上面那一票经验,我想这也是个小case吧!
  流程如下:
3.jpg

  那么。。。问题来了,返回给用户多个平台的认证token,用户浏览器肿么区别对待呢?去不同的url用不同的token捏?
  我们是这么处理的,返回多个token是的时候,在用户浏览器置cookie,key就是用户需要请求的url,酱紫看起来就很优雅的解决了。。。。