14 February 2014

本博文主要针对多个相互信任的网站实现单点login后其它站点也login,单点logout后其它站点也logout的解决方案。

本方案学习自:Simple Single Sign-On for PHP (Ajax compatible),但实现方式与之有些不同:

  1. Broker可以存储用户信息,这样,当用户在登陆Broker之后所进行的操作都不需要请求SSO以检查用户是否退出了;
  2. 当用户从某个Broker退出时,该Broker先自己执行用户退出工作,之后发送退出请求到SSO,SSO通知其它已经登陆了的Broker执行退出工作。

先来看一个没有使用SSO功能的站点:


without sso

  1. 用户请求login.php页面;
  2. 站点检查到用户未登陆,返回返回登陆页面;
  3. 用户填写登录表单,提交;
  4. 网站验证用户身份,登录成功,重定向到user.php
  5. 客户端请求user.php
  6. 返回用户页面。

再来看一个使用SSO功能的站点(首次访问):


with sso first visite

  1. 用户访问站点首页;
  2. 站点检测到客户端没有token,于是设置token并重定向用户到SSO Server进行绑定;
  3. 客户端携带Brokertoken请求SSO服务器;
  4. SSO Server完成绑定后,重定向用户到原来的页面;
  5. 客户端请求index.php
  6. Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;
  7. SSO Server返回用户未登录;
  8. Broker返回未登陆的index.php页面;
  9. 客户端请求login.php
  10. Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;
  11. SSO Server返回用户未登录;
  12. Broker返回login.php页面;
  13. 用户填写表单,提交;
  14. Broker通过CURL请求SSO Server验证;
  15. 验证通过,SSO Server返回成功,并且携带用户信息;
  16. Broker存储用户信息,并重定向客户端到user.php
  17. 客户端请求user.php
  18. Broker返回请求成功。

在首次访问后,访问信任站点:


with sso second visite

  1. 客户端访问信任站点首页;
  2. Broker检测到客户端没有自己的token,于是设置token并重定向客户端到SSO Server进行绑定;
  3. 客户端携带Brokertoken请求SSO服务器;
  4. SSO Server完成对客户端的绑定并重定向用户回原来的页面;
  5. 客户端请求index.php
  6. Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;
  7. SSO Server返回用户登录了,且携带用户信息;
  8. Broker存储用户信息,并返回登陆了的index.php页面;
  9. 客户端请求user.php
  10. Broker返回请求成功;
  11. 客户端请求退出;
  12. Broker发送退出请求到SSO Server
  13. SSO Server返回成功;
  14. Broker重定向客户端到login.php

使用AJAX绑定token的站点(首次访问):


with sso second visite

  1. 客户端访问信任站点首页;
  2. Broker检测到用户未登陆,返回未登陆的index.php页面;
  3. 客户端通过AJAX请求获取绑定的URL;
  4. Broker检测到客户端没有自己的token,于是设置token并返回绑定链接;
  5. 客户端通过加载一张空的图片来请求SSO Server绑定;
  6. SSO Server完成绑定,返回空的图片;
  7. 客户端通过AJAX向Broker请求用户信息;
  8. Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;
  9. SSO Server返回用户未登陆;
  10. Broker返回未登录,无用户信息;
  11. 客户端请求login.php
  12. Broker检查到用户未登陆,于是请求SSO Server获取用户信息,看是否在其他信任站点登陆了;
  13. SSO Server返回用户未登录;
  14. Broker返回login.php页面;
  15. 用户填写表单,提交;
  16. Broker通过CURL请求SSO Server验证;
  17. 验证通过,SSO Server返回成功,并且携带用户信息;
  18. Broker存储用户信息,并重定向客户端到user.php
  19. 客户端请求user.php
  20. Broker返回请求成功。

使用AJAX绑定token的站点(首次访问后,访问信任站点):


with sso second visite

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