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

PHP中SSO Cookie登入分析與實現

Jan 17, 2017 pm 02:03 PM

什麼是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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1663
14
CakePHP 教程
1420
52
Laravel 教程
1313
25
PHP教程
1266
29
C# 教程
1238
24
說明PHP中的不同錯誤類型(注意,警告,致命錯誤,解析錯誤)。 說明PHP中的不同錯誤類型(注意,警告,致命錯誤,解析錯誤)。 Apr 08, 2025 am 12:03 AM

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用? 什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用? Apr 09, 2025 am 12:09 AM

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

解釋self ::,parent ::和static :: in php oop中的區別。 解釋self ::,parent ::和static :: in php oop中的區別。 Apr 09, 2025 am 12:04 AM

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。

PHP如何安全地上載文件? PHP如何安全地上載文件? Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

See all articles