本篇文章根据我的理解的知识整理汇总,若有不足之处,请你们多多指正。php
单点登陆(SSO——Single Sign On)的应用是很广泛的,尤为在大型网站系统中,好比百度,登陆百度帐号和,再转到百度经验、百度贴吧等是不用从新登陆的。本文将从 cookie 和 session 基础详细介绍单点登陆的原理,代码实现为 PHP。浏览器
Cookie 是由客户端访问服务器时服务器发送给客户端的特殊信息,且这些信息以文本文件的方式存储在客户端。第一次访问服务器时,服务器会在 HTTP 响应头(Response Header)返回 Cookie 信息。客户端保存 Cookie 信息以后,下次访问服务器时,HTTP请求头(Request Header)会包含 Cookie 信息。安全
简单的说: 服务器不认识访问它的客户端,为了识别它们,就给每一个访问它的客户端一个口令,服务器经过口令识别这些客户端。服务器
注意: 不是访问每一个服务器都会返回 Cookie 的,只有服务器中有设置 Cookie ,才会返回给客户端。cookie
<?php // Cookie 是 HTTP 标头的一部分,所以 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制相似 setcookie('testCookie', 'this is test cookie');
经过浏览器访问本地服务器 localhost/test.php,报文以下:
session
删除本地服务器下 test.php 中的 setcookie,再次访问 localhost/test.php,报文以下:
dom
<?php # 登陆 setcookie('userName', 'test'); # 判断是否已登陆 if (isset($_COOKIE['userName'])) { echo '已登陆'; }
关于 Cookie 的具体用法暂时很少说明,本篇文章主要讲解机制原理异步
Session 是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增长了服务器的存储压力。在客户端访问服务器时,服务器会建立 Session 并生成一个 Session id 发到客户端,客户端下次访问时须要带着 Session id,服务器则根据 Session id 找到相应的 Session。函数
<?php session_start(); $_SESSION['testSession'] = 'This is test';
客户端浏览器访问服务器:localhost/session.php,报文以下图:
网站
客户端浏览器再此访问服务器(注释代码):localhost/session.php,报文以下:
在介绍单点登陆的方式以前先介绍一下 PHP 中的 Cookie 中的设置,方便容易理解
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
参数:
由上节咱们知道,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 返回。
本文到此结束,后续若是有新的理解会补充上去。