本篇文章根據我的理解的知識整理彙總,若有不足之處,請你們多多指正。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 返回。
本文到此結束,後續若是有新的理解會補充上去。