SSO 單點登陸總結(PHP)

本篇文章根據我的理解的知識整理彙總,若有不足之處,請你們多多指正。php

單點登陸(SSO——Single Sign On)的應用是很廣泛的,尤爲在大型網站系統中,好比百度,登陸百度帳號和,再轉到百度經驗、百度貼吧等是不用從新登陸的。本文將從 cookie 和 session 基礎詳細介紹單點登陸的原理,代碼實現爲 PHP。瀏覽器

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,報文以下:
    session

  • 刪除本地服務器下 test.php 中的 setcookie,再次訪問 localhost/test.php,報文以下:
    dom

簡單登陸示例:

<?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,報文以下:

單點登陸

在介紹單點登陸的方式以前先介紹一下 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 返回。

本文到此結束,後續若是有新的理解會補充上去。

相關文章
相關標籤/搜索