SSO 單點登錄總結(PHP)

来源:https://www.cnblogs.com/it-abel/archive/2018/09/09/9612143.html
-Advertisement-
Play Games

本篇文章根據個人理解的知識整理彙總,包含 Cookie、Session 的基礎知識和單點登錄的方法,如有不足之處,請大家多多指正。 ...


本篇文章根據個人理解的知識整理彙總,如有不足之處,請大家多多指正。

單點登錄(SSO——Single Sign On)的應用是很普遍的,尤其在大型網站系統中,比如百度,登錄百度賬號和,再轉到百度經驗、百度貼吧等是不用重新登錄的。本文將從 cookie 和 session 基礎詳細介紹單點登錄的原理,代碼實現為 PHP。

Cookie 是由客戶端訪問伺服器時伺服器發送給客戶端的特殊信息,且這些信息以文本文件的方式存儲在客戶端。第一次訪問伺服器時,伺服器會在 HTTP 響應頭(Response Header)返回 Cookie 信息。客戶端保存 Cookie 信息之後,下次訪問伺服器時,HTTP請求頭(Request Header)會包含 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,報文如下:

簡單登錄示例:

<?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 返回。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字元串的生成轉換 你可以將任何類型的數據都轉換為字元串,你可以用下麵三種方法的任何一種: 字元串轉化為其他類型 js提供了parseInt()和parseFloat()兩個轉換函數,Number也可以實現轉化 字元的操作 字元串增刪查改 字元串比較 比較兩個字元串,比較是規則是按照字母表順序比較的 ...
  • todoList 結合之前 Vuejs 基礎與語法 使用 v-model 雙向綁定 input 輸入內容與數據 data 使用 @click 和 methods 關聯事件 使用 v-for 進行數據迴圈展示 <!DOCTYPE html> <html lang="en"> <head> <meta ...
  • 剛開始學JQuery寫的如有錯誤歡迎批評指正 JQuery擁有的選擇器可以讓我們更快更方便找到想要的元素,然後對相應的元素進行操作 簡單介紹一下一些常用的選擇器: 1.基本選擇器: 2.層級選擇器: 層級函數 3.過濾選擇器: 4.內容選擇器: 5.屬性選擇器: 6.子元素選擇器: 7.表單選擇器: ...
  • 全棧工程師也可以叫web 前端 H5主要是網站 app 小程式 公眾號這一塊 HTML篇 html(超文本標記語言,標記通用標記語言下的一個應用。) “超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素。 超文本標記語言的結構包括“頭”部分(英語:Head)、和“主體”部分(英語:B ...
  • 我主要進行對日期數據進行查看使用,有數據的顯示顏色、沒有數據可以不選 更多可以查看官方網站:http://www.daterangepicker.com/#examples ...
  • 在js中,函數本身屬於對象的一種,因此可以定義、賦值,作為對象的屬性或者成為其他函數的參數。函數名只是函數這個對象類的引用。 函數定義 從技術上講,這是一個函數表達式。但不推薦使用,因為這種語法會導致解析兩次代碼。第一次是解析常規javascript代碼,第二次解析傳入構造函數中的字元串,影響性能。 ...
  • 王之泰201771010131《面向對象程式設計(java)》第二周學習總結 第一部分:理論知識學習部分 第三章 第三章內容主要為Java語言的基礎語法,主要內容如下 1.基礎知識 1.1標識符 a)標識符可用作類名、變數名、方法名、數組名、文件名等。 註:第一個符號不能為數字,即不能用數字開頭。 ...
  • 1、類載入器 2、反射構造方法 3、反射成員變數 4、反射成員方法 5、反射配置文件運行類中的方法 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...