搜尋
首頁後端開發php教程PHP中SSO Cookie登入分析與實現

什麼是SSO?

單一登入SSO(Single Sign-On)是身分識別管理的一部分。 SSO的一種較為通俗的定義是:SSO是指訪問同一伺服器不同應用中的受保護資源的同一用戶,只需要登入一次,即透過一個應用程式中的安全驗證後,再訪問其他應用程式中的受保護資源時,不再需要重新登入驗證

SSO的用途:

目前的企業應用環境中,往往有很多的應用系統,淘寶、天貓、愛淘寶等等產品和如辦公室自動化(OA)系統,財務管理系統,檔案管理系統,資訊查詢系統等等。這些應用系統服務企業的資訊化建設,為企業帶來了很好的效益。但是,使用者在使用這些應用系統時,並不方便。使用者每次使用系統,都必須輸入使用者名稱和使用者密碼,進行身份驗證;而且應用系統不同,使用者帳號就不同,使用者必須同時牢記多套使用者名稱和使用者密碼。特別是對於應用系統數目較多,使用者數目也很多的企業,這個問題特別突出。問題的原因並不是系統開發出現失誤,而是缺乏整體規劃,缺乏統一的使用者登入平台,使用SSO技術可以解決以上這些問題

SSO的好處:

方便使用者:從使用者實際使用角度來考慮

使用者使用應用系統時,能夠一次登錄,並多次使用。使用者不再需要每次輸入使用者名稱和使用者密碼,也不需要牢記多套使用者名稱和使用者密碼。單一登入平台能夠改善使用者使用應用系統的體驗。
方便管理員:從日常維護管理角度考慮


現在很多大的互聯網公司都會有很多的應用,比如以下是淘寶網的截圖:

PHP中SSO Cookie登录分析和实现

天貓聚頭條等都是不同划算的應用,有的甚至採用完全不同的域名,但是所有在淘寶註冊的用戶都是使用的一套用戶名和口令,如果在這些系統直接切換做不到登陸狀態的同步,體驗是非常差的。再舉個栗子,很多公司內部系統也有很多個,比如HR系統,財務系統,考勤系統等等,如果員工在一個系統登陸了,跳轉到另外一個系統還需要登陸,就會讓人很不爽. ..

基於此,SSO(Single Sign On)應運而生。當然,我們來現實這個需求的方法有很多種,使用Cookie是其中比較簡單的方式,主要需要解決的問題是:Cookie是不能跨域傳遞的,如何將一個域的Cookie通知給其它應用(不在同一個域)?

so,如果你對cookie機制不太熟悉,請先google,大致了解為什麼cookie會設計成不能跨域等相關問題。

      系統管理員只需要維護一套統一的使用者帳號,方便、簡單。相較之下,系統管理員以前需要管理很多套的使用者帳號。每一個應用系統就有一套使用者帳號,不僅為管理上帶來不方便,而且,也容易出現管理漏洞。

簡化應用系統開發:從應用擴充角度考慮

      開發新的應用系統時,可直接使用單一登入平台的使用者認證服務,簡化開發流程。單一登入平台透過提供統一的認證平台,實現單一登入。因此,應用系統並不需要開發使用者認證程序。   
如何實現?

SSO有以下幾種方式實現

共享Cookie

當我們的子系統都在一個父級域名下時,我們可以將Cookie種在父域下,這樣瀏覽器同域名下的Cookie則可以共享,這樣可以透過Cookie加解密的演算法來取得用戶SessionID,從而實現SSO。

但是,後面我們發現這種方式有幾種弊端:
a. 所有同域名的系統都能獲取SessionID,易被修改且不安全;
b. 跨域無法使用。

ticket驗證,我們目前採取的是這種方式

這種實現的SSO有以下幾個步驟:

a. 用戶訪問某個子系統,發現如果未登錄,則引導用戶跳轉到SSO登入頁面;
b. 判斷SSO是否已登入;
c. 如果已經登錄,直接跳到回呼地址,並返回認證ticket;
d. 如果未登錄,使用者正確輸入使用者名稱/密碼,認證透過跳前往回呼地址,並返回認證ticket;
e. 子系統獲取ticket,調用SSO獲取用戶uid等信息,成功後讓用戶登錄。

前面已經說了,如何透過Cookie來實現SSO,主要是如何解決跨域問題。首先來談談Set-Cookie中的domain屬性。

Cookie domain

為了讓Http協定在一定程度上保持上下文,server在回應的頭部可以加入Set-Cookie來寫入一些資料到客戶端,Set-Cookie中的

domain欄位用來表示這個cookie所在的網域。

栗子:

我們訪問www.cookieexm.com,如果server在返回頭部中加入了Set-Cookie,如果不指定domain,那麼默認這個cookie的域就是www.cookieexm.com,也就是只有訪問www .cookieexm.com時客戶端才會把這個cookie回給服務端。
如果我們指定domain為.cookieexm.com,那麼客戶端在造訪以下網域:www.cookieexm.com www1.cookieexm.com a.cookieexm.com ***.cookieexm.com 時都能夠將cookie回傳。

所以,我們得出一條結論:客戶端對cookie的domain的匹配是從結尾進行匹配的,有了這個基礎,我們就可以實現我們的SSO登陸了。

cookie中需要注意的

設定為http-only

涉及登入憑證(如票據或使用者名稱)應該加密

cookie不能存放在子系統**.a1.a2 **.b1.b2 **.c1.c2間實現單一登錄,首先我們需要一個專門用於單點登陸的認證系統(sso.s1.s2)。假設目前系統處於未登入狀態,造訪www.a1.a2為例:


分別看一下每個步驟作用:

請求www.a1.a2

PHP中SSO Cookie登录分析和实现www.a1.a2收到請求,檢查是否攜帶登入的cookie,目前沒有登陸過,那麼重定向到sso認證中心

SSO提供登陸窗口,用戶輸入用戶名口令。 SSO系統驗證使用者名稱和口令

這一步驟是關鍵,如果登入成功,首先把SSO系統的Cookie放到客戶端;同時,將使用者的認證資訊傳遞透過重定向傳遞給業務方,注意,這個傳遞明顯不能透過cookie來傳遞(不同域嘛),一般是透過加密的querystring。

業務方的驗證系統收到sso認證訊息,再進行認證
業務方認證通過之後,把認證結果的cookie寫入到.a1.a2,至此,SSO認證完成
重定向到業務系統www.a1 .a2,由前面的結論可知,此時所有以.a1.a2結尾的業​​務系統都可以使用這個認證之後的cookie

response



說明:
業務認證系統不一定存在,有些不是太敏感的系統可以直接從SSO Authorization重新導向到業務系統,並把SSO的認證資訊帶過去。

承接上文,此時,如果用戶訪問www.b1.b2應用,如下圖所示:


與訪問www.a1.a2不同的是我們在重定向到SSO Authorization時已經不需要再去輸入用戶名,因為sso.s1.s2此時已經存有cookie,直接用cookie驗證。

以上,就是一個簡單的基於Cookie的登陸系統。 PHP中SSO Cookie登录分析和实现

其中幾個問題需要重點解決


如何高效存儲大量臨時性的信任數據

如何防止信息傳遞過程被篡改

如何讓SSO系統信任登錄系統和免登系統

對於第一個問題,一般可以採用類似與memcached的分散式快取的方案,既能提供可擴展資料量的機制,也能提供高效存取

對於第二個問題,一般採取數位簽章的方法,要麼透過數位憑證簽名,要麼透過像md5的方式,這就需要SSO系統返回免登URL的時候對需驗證的參數進行md5加密,並帶上token一起返回,最後需免登的系統進行驗證信任關係的時候,需把這個token傳給SSO系統,SSO系統透過token的驗證就可以辨別訊息是否被改過


對於最後一個問題,可以透過白名單來處理,說簡單點只有在白名單上的系統才能請求生產信任關係,同理只有白名單上的系統才能被免登入。

更多PHP中SSO Cookie登入分析與實現相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP記錄:PHP日誌分析的最佳實踐PHP記錄:PHP日誌分析的最佳實踐Mar 10, 2025 pm 02:32 PM

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除

在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

解釋PHP中晚期靜態結合的概念。解釋PHP中晚期靜態結合的概念。Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

自定義/擴展框架:如何添加自定義功能。自定義/擴展框架:如何添加自定義功能。Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),