本篇文章根据个人理解的知识整理汇总,如有不足之处,请大家多多指正。

单点登录(SSO——Single Sign On)的应用是很普遍的,尤其在大型网站系统中,比如百度,登录百度账号和,再转到百度经验、百度贴吧等是不用重新登录的。本文将从 cookie 和 session 基础详细介绍单点登录的原理,代码实现为 PHP。

Cookie

Cookie 是由客户端访问服务器时服务器发送给客户端的特殊信息,且这些信息以文本文件的方式存储在客户端。第一次访问服务器时,服务器会在 HTTP 响应头(Response Header)返回 Cookie 信息。客户端保存 Cookie 信息之后,下次访问服务器时,HTTP请求头(Request Header)会包含 Cookie 信息。

简单的说: 服务器不认识访问它的客户端,为了识别它们,就给每个访问它的客户端一个口令,服务器通过口令识别这些客户端。

注意: 不是访问每个服务器都会返回 Cookie 的,只有服务器中有设置 Cookie ,才会返回给客户端。

Cookie 生成和传递流程

  • 在本地服务器下的 test.php 中设置 Cookie
<?php
// Cookie 是 HTTP 标头的一部分,因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似
setcookie('testCookie', 'this is test cookie');
  • 通过浏览器访问本地服务器 localhost/test.php,报文如下:

  • 删除本地服务器下 test.php 中的 setcookie,再次访问 localhost/test.php,报文如下:

Cookie 流程图

简单登录示例:

<?php
# 登录
setcookie('userName', 'test'); # 判断是否已登录
if (isset($_COOKIE['userName'])) {
echo '已登录';
}

关于 Cookie 的具体用法暂时不多说明,本篇文章主要讲解机制原理

Session

Session 是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。在客户端访问服务器时,服务器会创建 Session 并生成一个 Session id 发到客户端,客户端下次访问时需要带着 Session id,服务器则根据 Session id 找到相应的 Session。

Session 生成和传递流程

  • 服务器设置 Session:localhost/session.php
<?php
session_start();
$_SESSION['testSession'] = 'This is test';
  • 客户端浏览器访问服务器:localhost/session.php,报文如下图:

  • 客户端浏览器再此访问服务器(注释代码):localhost/session.php,报文如下:

Cookie 和 Session 的关系图(接上节中的设置)

单点登录

在介绍单点登录的方式之前先介绍一下 PHP 中的 Cookie 中的设置,方便容易理解

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

参数:

  • name: Cookie 名称。
  • value: Cookie 值。
  • expire: Cookie 的过期时间。
  • path: Cookie 有效的服务器路径。 设置成 '/' 时,Cookie 对整个域名 domain 有效。 如果设置成 '/foo/', Cookie 仅仅对 domain 中 /foo/ 目录及其子目录有效(比如 /foo/bar/)。 默认值是设置 Cookie 时的当前目录。
  • domain: Cookie 的有效域名/子域名。 设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。 要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 'example.com')。

由上节我们知道,Session 是存放在服务器中的,客户端与服务器的通信会话是通过 Session id 识别的, 客户端 Session id 是存放在 cookie 中,因此单点登录大致分为:同域名不同站点登录、同域不同子域登录、不同域名登录。

同域名不同站点登录

由 PHP 中的 Cookie 设置说明可以看出,默认下不同站点是共享 Cookie 的除非设置了不同的有效服务器路径。如果设置了不同的有效的服务器路径怎么实现共享登录呢?哈哈哈,那就将有效服务器路径设置为默认 '/' 的就好了。

同域不同子域登录

同样,由 PHP 中的 Cookie 设置说明可以看出,只要设置 Cookie 的 domain(Cookie 的有效域名/子域名) 参数就可以了,如下:

由于 PHP 中生成 Session 会自动配置 Cookie,因此我们可以直接在 Session 中设置 Cookie 有效域

one.sso.test/create_session

<?php
session_set_cookie_params(time()+3600, '/', 'sso.test');
session_start();
$_SESSION['test'] = 'This is test';

two.sso.test/get_session

<?php
session_set_cookie_params(time()+3600, '/', 'sso.test');
session_start();
echo $_SESSION['test'];

其中后者是可以获取到 Session 值的。下边两图分别问以上两个子域名的报文和 Cookie 信息

图一:



图二:

由图可见他们的 Session id 是相同的,因此调用的是服务器上的同一个 Session。

注意:在 PHP 中,配置 Session 的 Cookie 信息,还可以通过修改 php.ini 文件设置

session.cookie_path = /
session.cookie_domain = '.sso.test'
session.cookie_lifetime = 0

不同域名登录

由于涉及到用户信息安全问题,因此本文通过流程图大致说一下基本liu流程,具体操作看实际应用

注意: 上图中的“返回 Cookie 信息”并不是单独返回的,而是在“跳转页面”的 HTTP 响应头(Response Header)返回,同样异步请求的也是在 JS 调用 www.sso2.com 时在 HTTP 响应头Response Header 返回。

本文到此结束,后续如果有新的理解会补充上去。

SSO 单点登录总结(PHP)的更多相关文章

  1. 使用 JSONP 实现简单的 SSO 单点登录

    SSO 即 Single Sign On(单点登录).  一.二级域名之间的单点登录 不需要用到JSONP 或者 p3p 协议,直接使用 COOKIE 就行了,因为顶级域名相同就能实现 COOKIE ...

  2. CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  3. [sso] 单点登录认证流程

    一.流程说明 第一步:访问cas过滤链接ssoLogin,拼凑定向到 CAS_SERVER 获取ticket的URL 第二步:CAS_SERVER校验用户信息,生成Ticket 第三步:重新定向到访问 ...

  4. php sso单点登录原理阐述

    原理:就是用户登录了单点登录系统(sso)之后,就可以免登录形式进入相关系统: 实现: 点击登录跳转到SSO登录页面并带上当前应用的callback地址 登录成功后生成COOKIE并将COOKIE传给 ...

  5. SSO单点登录之跨域问题

    第一次写博客,与大家共勉. 这里用到的原理其实非常简单,将cookie存在一个公共的站点的页面上就可以了,这里我们管那个站点叫主站S. 先说说所谓的跨域 环境1:a.xxx.com需要跟b.xxx.c ...

  6. cas sso单点登录系列4_cas-server登录页面自定义修改过程(jsp页面修改)

    转:http://blog.csdn.net/ae6623/article/details/8861065 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标:    ...

  7. 学习CAS实现SSO单点登录

    学习CAS实现SSO单点登录 网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 ...

  8. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  9. SSO(单点登录)与旅游年卡

    SSO(单点登录)与旅游年卡 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应 ...

  10. sso单点登录,单点登录原理图,单点登录图解,单点登录

    sso单点登录,单点登录原理图,单点登录图解,单点登录 ============================== ©Copyright 蕃薯耀 2017年11月20日 http://www.cnb ...

随机推荐

  1. [Cuckoo SandBox]注入原理篇

    1.LoadExe 接python版本 通过调用LoadExe去加载Dll进行注入 所以先看LoadExe 加载器的功能吧 通过python管道接收到  processID,ThreadID,路径 , ...

  2. EF Core 2.1 +数据库视图

    1.参考文档 https://stackoverflow.com/questions/36012616/working-with-sql-views-in-entity-framework-core ...

  3. POS开发问题 - 缓存问题 - 02

    问题描述 : 有一个A页面使用了缓存,当从别的页面返回到A页面时, A页面绑定的有些事件,例如监听输入框输入事件:"input",监听点击触摸屏事件:"touchstar ...

  4. sass-基础

    导入: sass的导入(@import)规则和CSS的有所不同,编译时会将@import的scss文件合并进来只生成一个CSS文件. 但是如果你在sass文件中导入css文件如@import 'res ...

  5. 栅格那点儿事(四E)

    栅格金字塔   如果上面的部分都已经看过了,那么如何在ArcMap中更好的渲染一个栅格数据你已经知道了.可仅展示好一个栅格数据是不够的,我们还需要知道如何快速的展示一个栅格数据. 讲金字塔之前,先解释 ...

  6. fd_set实现原理

    fd_set是一个结构 /* The fd_set member is required to be an array of longs. */ typedef long int __fd_mask; ...

  7. 【小结】IIS7下的Http Native Module开发

    今天接到Product Manager的通知,Exchange 2007环境下的Native Module不再需要开发(详情可见上篇),但最近几天一直在做Prototype,那就做一下小结吧,总结一下 ...

  8. 5步玩转Power BI Embedded,老司机全程带路解析

    最近,由世纪互联运营的 Microsoft Azure 发布了一个超级炫酷的服务 Power BI Embedded,该服务可以通过 REST API 和 Power BI SDK 将 Power B ...

  9. bootstrap-table 数据表格行内修改

    bootstrap-table 数据行内修改js中设置列的属性 editable : { type : 'text',//数据显示在文本框内 emptytext : "--",// ...

  10. C#中WinForm程序退出方法技巧总结[转]

      这篇文章主要介绍了C#中WinForm程序退出方法,实例总结了技巧退出WinForm程序窗口的各种常用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了C#中WinForm程序退出方法技 ...