基礎知識
名詞解釋
AS
Authentication Service
:認證服務,發放TGT
KDC
Key Distribution Center
:密鑰發放中心
TGS
Ticket-Granting Service
:票據授權服務,索取TGT
,發放ST
TGC
ticket-granting cookie
:授權的票據證明,由CAS Server
通過SSL
方式發送給終端用戶。該值存在Cookie中,根據TGC
可以找到TGT
。
TGT
Ticket Granting tieckt
:俗稱大令牌,或者票根,由KDC
和AS
發放,獲取該票據後,可直接申請其他服務票據ST
,不需要提供身份認證信息
ST
Service Ticket
:服務票據,由KDC
的TGS
發放,ST
是訪問server
內部的令牌
CAS
認證流程
CAS (Central Authentication Service)
中央身份驗證服務認證流程如下:
- 訪問服務:由於
CAS client
和WEB
應用部署在一起,當用戶訪問WEB
應用時,CAS client
就會處理請求 - 定向認證:
CAS client
客戶端校驗HTTP
請求中是否包含ST
和TGT
,如果沒有則會重定向到CAS server
地址進行用戶認證 - 用戶認證:用戶通過瀏覽器填寫用戶信息,提交給
CAS Server
認證 - 發放票據:
CAS Server
校驗過用戶信息後,爲CAS client
發放ST
,並在瀏覽器cookie
中設置TGC
,下次訪問CAS Server
時會根據TGC
和TGT
驗證,判斷是否已經登錄 - 驗證票據:
CAS Client
拿到ST
後,再次請求CAS Server
驗證ST
合法性,驗證通過後允許客戶端訪問 - 傳輸用戶信息:
CAS Server
校驗過ST
後,傳輸用戶信息給CAS client
代碼示例
phpCAS
庫: https://github.com/apereo/phpCAS
使用phpCAS
實現對於訪問www.baidu.com
的訪問控制
<?php
require_once './vendor/apereo/phpcas/CAS.php';
$home = 'http://www.baidu.com/';
$login_url = 'http://10.91.156.174:8080/cas/login?service='.urlencode($home);
$logout_url = 'http://10.91.156.174:8080/cas/logout';
$service_validate_url = 'http://10.91.156.174:8080/cas/serviceValidate';
phpCAS::setDebug();
//設置client屬性
phpCAS::client(CAS_VERSION_2_0, "10.91.156.174", 8080, "/cas");
// 設置 Login url
phpCAS::setServerLoginURL($login_url);
// 設置 logout url
phpCAS::setServerLogoutURL($logout_url);
// 設置 validate url
phpCAS::setServerServiceValidateURL($service_validate_url);
// cas server 設置不校驗 ssl 證書
phpCAS::setNoCasServerValidation();
// 這個方法確保用戶是否驗證過,如果沒有驗證則跳轉到驗證界面。
phpCAS::forceAuthentication();
通過php -S localhost:8080
啓動服務
首次登陸流程
受訪問控制的資源地址爲:http://www.baidu.com/
1.訪問服務
通過訪問localhost:8080
訪問本地WEB
服務,發現沒有用戶登錄信息,便會生成login url
,並重定向到該地址。其中login_url
中service
參數代表受訪問控制的資源
2.定向認證
瀏覽器收到重定向響應後,請求login_url
,等待用戶輸入用戶名密碼
3.用戶認證
用戶輸入用戶名密碼提交表單後,CAS server
對提交信息進行校驗。通過校驗後,會將瀏覽器重定向到service
參數後的url
,並且後面攜帶了一個ticket
令牌,該參數就是ST
。同時在Cookie
中設置CASTGC
,該Cookie
是訪問service_url
的cookie
,只有訪問該地址纔會攜帶這個cookie
。
向Cookie
中添加CASTGC
的目的是爲了下次訪問service_url
時,瀏覽器請求時攜帶TGC
參數,服務器根據該TGC
查找對應的TGT
,從而判斷用戶是否登錄過了,是否需要展示登錄頁面。TGT
與TGC
的關係就像SESSION
與Cookie
中SESSIONID
的關係。
4.發放票據
CAS server
會生成ST
服務票據,然後將瀏覽器重定向到$service_url?ticket=$service-ticket
5.驗證票據
CAS
客戶端取出ticket,生成$service_validate_url
,然後向$service_validate_url
發送請求從而驗證ST
。驗證ticket
的URL
形如:
http://${cas_server_host}:${cas_server_port}/cas/serviceValidate?ticket=${service-ticket}&service=http://www.baidu.com
當CAS server
校驗通過後,會再次重定向回service_url
,展示相關資源到瀏覽器中
第二次登陸流程
1.訪問服務
訪問本地WEB
服務,跳轉到login_url
2.簽發票據
2.由於之前訪問過一次,所以此次login_url
中帶了之前獲取出的CASTGC
,認證中心在收到請求後,發現TGC
對應一個TGT
,於是用TGT
簽發一個ST
,並且返回給瀏覽器
3.驗證票據
瀏覽器向cas server
發出的地址進行重定向,並校驗ST
,校驗成功後就可訪問受控制的資源了
總結
簡單點來說整體的流程就是,客戶端請求服務端的login_url
,如果攜帶了TGC
,服務端返回ST
,客戶端再次校驗ST
即可;若未攜帶TGC
,則跳轉到login_url
輸入用戶信息,校驗成功後,服務端將TGC
設置到Cookie
中返回,並頒發ST
,客戶端再次校驗ST
即可。