SSO 实现方案探讨
14 February 2014
本博文主要针对多个相互信任的网站实现单点login后其它站点也login,单点logout后其它站点也logout的解决方案。
本方案学习自:Simple Single Sign-On for PHP (Ajax compatible),但实现方式与之有些不同:
- Broker可以存储用户信息,这样,当用户在登陆Broker之后所进行的操作都不需要请求SSO以检查用户是否退出了;
- 当用户从某个Broker退出时,该Broker先自己执行用户退出工作,之后发送退出请求到SSO,SSO通知其它已经登陆了的Broker执行退出工作。
先来看一个没有使用SSO功能的站点:

- 用户请求
login.php页面; - 站点检查到用户未登陆,返回返回登陆页面;
- 用户填写登录表单,提交;
- 网站验证用户身份,登录成功,重定向到
user.php; - 客户端请求
user.php; - 返回用户页面。
再来看一个使用SSO功能的站点(首次访问):

- 用户访问站点首页;
- 站点检测到客户端没有
token,于是设置token并重定向用户到SSO Server进行绑定; - 客户端携带
Broker的token请求SSO服务器; SSO Server完成绑定后,重定向用户到原来的页面;- 客户端请求
index.php; Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;SSO Server返回用户未登录;Broker返回未登陆的index.php页面;- 客户端请求
login.php; Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;SSO Server返回用户未登录;Broker返回login.php页面;- 用户填写表单,提交;
Broker通过CURL请求SSO Server验证;- 验证通过,
SSO Server返回成功,并且携带用户信息; Broker存储用户信息,并重定向客户端到user.php;- 客户端请求
user.php; Broker返回请求成功。
在首次访问后,访问信任站点:

- 客户端访问信任站点首页;
Broker检测到客户端没有自己的token,于是设置token并重定向客户端到SSO Server进行绑定;- 客户端携带
Broker的token请求SSO服务器; SSO Server完成对客户端的绑定并重定向用户回原来的页面;- 客户端请求
index.php; Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;SSO Server返回用户登录了,且携带用户信息;Broker存储用户信息,并返回登陆了的index.php页面;- 客户端请求
user.php; Broker返回请求成功;- 客户端请求退出;
Broker发送退出请求到SSO Server;SSO Server返回成功;Broker重定向客户端到login.php。
使用AJAX绑定token的站点(首次访问):

- 客户端访问信任站点首页;
Broker检测到用户未登陆,返回未登陆的index.php页面;- 客户端通过AJAX请求获取绑定的URL;
Broker检测到客户端没有自己的token,于是设置token并返回绑定链接;- 客户端通过加载一张空的图片来请求
SSO Server绑定; SSO Server完成绑定,返回空的图片;- 客户端通过AJAX向
Broker请求用户信息; Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;SSO Server返回用户未登陆;Broker返回未登录,无用户信息;- 客户端请求
login.php; Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;SSO Server返回用户未登录;Broker返回login.php页面;- 用户填写表单,提交;
Broker通过CURL请求SSO Server验证;- 验证通过,
SSO Server返回成功,并且携带用户信息; Broker存储用户信息,并重定向客户端到user.php;- 客户端请求
user.php; Broker返回请求成功。
使用AJAX绑定token的站点(首次访问后,访问信任站点):

- 客户端访问信任站点首页;
Broker检测到用户未登陆,返回未登陆的index.php页面;- 客户端通过AJAX请求获取绑定的URL;
Broker检测到客户端没有自己的token,于是设置token并返回绑定链接;- 客户端通过加载一张空的图片来请求
SSO Server绑定; SSO Server完成绑定,返回空的图片;- 客户端通过AJAX向
Broker请求用户信息; Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;SSO Server检测到用户已在其它站点登陆,返回用户信息;Broker存储用户信息,并返回给客户端;- 客户端接收到用户信息,修改页面结构,显示用户已登陆;
- 客户端请求
user.php; Broker返回请求成功。