單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案 之一。SSO 的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
如果禁用cookie可以使用url中帶參數,把token傳遞給服務端。當然此方法涉及安全性問題,其實在cookie中保存token同樣存在安全性問題。推薦使用sso框架CAS實現單點登錄。
以登錄天貓為例進行說明:
1)當?戶第?次訪問淘寶的時候,因為還沒有登錄,會被引導到認證中?進?登錄。
2)根據?戶提供的登錄信息,認證系統進?身份驗證,如果通過,則登錄成功,并返回給?戶?個認證的憑據(JWT token)。
3)當?戶訪問天貓時,就會將這個 JWT token 帶上,作為??認證的憑據。
4)應?系統接收到請求后會把 JWT token 送到認證中?進?校驗。
5)如果通過校驗,?戶就可以在不?再次登錄的情況下訪問天貓了。
1)代理登錄(agent):用于無法改造的舊系統;
2)令牌環(token):通過Cookie共享令牌環的方式傳遞當前用戶信息,實現SSO,存在跨域問題;
3)身份票據(ticket):除了增加一臺信任驗證服務器,完全滿足了存儲信任,驗證信任,作用范圍和安全性的問題,也是適用最廣的webSSO實現方式
CAS框架:CAS(Central Authentication Service,即:統一認證服務)是實現SSO單點登錄的框架。CAS分為兩部分,CAS Server和CAS Client。
CAS Server用來負責用戶的認證工作,就像是把第一次登錄用戶的一個標識存在這里,以便此用戶在其他系統登錄時驗證其需不需要再次登錄。
CAS Client就是我們自己開發的應用程序,需要接入CAS Server端。當用戶訪問我們的應用時,首先需要重定向到CAS Server端進行驗證,要是原來登陸過,就免去登錄,重定向到下游系統,否則進行用戶名密碼登陸操作。
Ticket Granting ticket (TGT) :可以認為是CAS Server根據用戶名密碼生成的一張票,存在Server端
Ticket-granting cookie (TGC) :其實就是一個Cookie,存放用戶身份信息,由Server發給Client端
Service ticket (ST) :由TGT生成的一次性票據,用于驗證,只能用一次。相當于Server發給Client一張票,然后Client拿著這個票再來找Server驗證,看看是不是Server簽發的。
1)用戶訪問網站,第一次來,重定向到 CAS Server,發現沒有cookie,所以再重定向到CAS Server端的登錄頁面,并且URL帶有網站地址,便于認證成功后跳轉,形如 http ?/cas-server:8100/login?service=http ?/localhost:8081
注意:service后面這個地址就是登錄成功后要重定向的下游系統URL。
2)在登陸頁面輸入用戶名密碼認證,認證成功后cas-server生成TGT,再用TGT生成一個ST。 然后再第三次重定向并返回ST和cookie(TGC)到瀏覽器
3)瀏覽器帶著ST再訪問想要訪問的地址:
http ?/localhost:8081/?ticket=ST-25939-sqbDVZcuSvrvBC6MQlg5
注意:ticket后面那一串就是ST
4)瀏覽器的服務器收到ST后再去cas-server驗證一下是否為自己簽發的,驗證通過后就會顯示頁面信息,也就是重定向到第1步service后面的那個URL
首次登陸完畢。
5)再登陸另一個接入CAS的網站,重定向到CAS Server,server判斷是第一次來(但是此時有TGC,也就是cookie,所以不用去登陸頁面了),但此時沒有ST,去cas-server申請一個于是重定向到cas-server,形如:http: //cas-server:8100/login?service=http ?/localhost:8082 && TGC(cookie) (傳目標地址和cookie)
6)cas-server生成了ST后重定向給瀏覽器http ?/localhost:8082/?ticket=ST-25939-sqfsafgefesaedswqqw5-xxxx
7)瀏覽器的服務器收到ST后再去cas-server驗證一下是否為自己簽發的,驗證通過后就會顯示頁面信息(同第4步)
Token的意思是“令牌”,是服務端生成的一串字符串,作為客戶端進行請求的一個標識。
當用戶第一次登錄后,服務器生成一個token并將此token返回給客戶端,以后客戶端只需帶上這個token前來請求數據即可,無需再次帶上用戶名和密碼。
簡單Token的組成;uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的一定長度的十六進制字符串。為防止token泄露)。
OAuth 是一個行業的標準授權協議,主要用來授權第三方應用獲取有限的權限。實際上它就是一種授權機制,最終目的是為第三方應用頒發一個有時效性令牌 token,使得第三方應用能夠通過該令牌獲取相關的資源。
OAuth 2.0 比較常用的場景就是第三方登錄,當你的網站接入了第三方登錄時一般就是使用的 OAuth 2.0 協議。
現在OAuth 2.0也常見于支付場景(微信支付、支付寶支付)和開發平臺(微信開放平臺、阿里開放平臺等等)。
Access Token 是在 Oauth2.0 協議中,客戶端訪問資源服務器時需要帶上的令牌(其實就是一段全局唯一的隨機字符串)。擁有這個令牌代表著得到用戶的授權。令牌里面包含哪個用戶 在什么時候 授權給哪個app去做什么事情。當然這些信息是不能直接從Access Token 看出來的,而是存在平臺方的數據庫中,平臺可以用Access Token 作為 key 去查詢出這些信息,然后驗證調用方是否有權限。
Refresh Token是專用于刷新 Access Token 的 token。如果沒有Refresh Token,也可以刷新 Access Token,但每次刷新都要用戶輸入登錄用戶名與密碼。有了 Refresh Token,客戶端直接用Refresh Token 去更新Access Token,無需用戶進行額外的操作。
Json Web Token (JWT)是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準。該token被設計為緊湊且安全,特別適用于分布式站點單點登錄場景。
JWT由頭部(header)、載荷(payload)、簽證(signature) 三部分組成。