本博文主要针对多个相互信任的网站实现单点login后其它站点也login,单点logout后其它站点也logout的解决方案。
本方案学习自:
Simple Single Sign-On for PHP (Ajax compatible)
,但实现方式与之有些不同:
Broker可以存储用户信息,这样,当用户在登陆Broker之后所进行的操作都不需要请求SSO以检查用户是否退出了;
当用户从某个Broker退出时,该Broker先自己执行用户退出工作,之后发送退出请求到SSO,SSO通知其它已经登陆了的Broker执行退出工作。
用户访问站点首页;
站点检测到客户端没有
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
返回请求成功。