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
返回请求成功。