1.
什麼是單點登陸?python
單點登陸(Single Sign On),簡稱爲 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。
客戶端持有ID,服務端持有session,二者一塊兒用來保持登陸狀態。客戶端須要用ID來做爲憑證,而服務端須要用session來驗證ID的有效性(ID可能過時、可能根本就是僞造的找不到對於的信息、ID下對應的客戶端尚未進行登陸驗證等)。可是session這東西一開始是每一個server本身獨有的,豆瓣FM有本身的session、豆瓣讀書有本身的session,而記錄ID的cookie又是不能跨域的。因此,咱們要實現一次登陸一次退出,只須要想辦法讓各個server的共用一個session的信息,讓客戶端在各個域名下都能持有這個ID就行了。再進一步講,只要各個server拿到同一個ID,都能有辦法檢驗出ID的有效性、而且能獲得ID對應的用戶信息就好了,也就是能檢驗ID。
所以實現單點登陸說到底就是要解決如何產生ID和存儲那個信任ID,再就是其餘系統如何驗證這個信任的有效性,所以要點也就如下兩個:
存儲信任驗證信任
如下是我探究所得的方法web
2.
單點登陸的實現有哪些?算法
1、以Cookie做爲憑證媒介
最簡單的單點登陸實現方式,是使用cookie做爲媒介,存放用戶憑證。用戶登陸父應用以後,應用返回一個加密的cookie,當用戶訪問子應用的時候,攜帶上這個cookie,受權應用解密cookie並進行校驗,校驗經過則登陸當前用戶。json
Auth via cookieflask
不難發現以上方式把信任存儲在客戶端的Cookie中,這種方式很容易使人質疑:Cookie不安全不能跨域實現免登對於第一個問題,經過加密Cookie能夠保證安全性,固然這是在源代碼不泄露的前提下。若是Cookie的加密算法泄露,攻擊者經過僞造Cookie則能夠僞造特定用戶身份,這是很危險的。對於第二個問題,更是硬傷。跨域
2、經過JSONP實現
對於跨域問題,可使用JSONP實現。用戶在父應用中登陸後,跟Session匹配的Cookie會存到客戶端中,當用戶須要登陸子應用的時候,受權應用訪問父應用提供的JSONP接口,並在請求中帶上父應用域名下的Cookie,父應用接收到請求,驗證用戶的登陸狀態,返回加密的信息,子應用經過解析返回來的加密信息來驗證用戶,若是經過驗證則登陸用戶。
這種方式雖然能解決跨域問題,可是安全性其實跟把信任存儲到Cookie是差很少的。若是一旦加密算法泄露了,攻擊者能夠在本地創建一個實現了登陸接口的假冒父應用,經過綁定Host來把子應用發起的請求指向本地的假冒父應用,並做出迴應。由於攻擊者徹底能夠按照加密算法來僞造響應請求,子應用接收到這個響應以後同樣能夠經過驗證,而且登陸特定用戶。安全
3、經過頁面重定向的方式
最後一種介紹的方式,是經過父應用和子應用來回重定向中進行通訊,實現信息的安全傳遞。父應用提供一個GET方式的登陸接口,用戶經過子應用重定向鏈接的方式訪問這個接口,若是用戶尚未登陸,則返回一個的登陸頁面,用戶輸入帳號密碼進行登陸。若是用戶已經登陸了,則生成加密的Token,而且重定向到子應用提供的驗證Token的接口,經過解密和校驗以後,子應用登陸當前用戶。服務器
Auth via redirectcookie
這種方式較前面兩種方式,接解決了上面兩種方法暴露出來的安全性問題和跨域的問題,可是並無前面兩種方式方便。安全與方便,原本就是一對矛盾。session
4、經過CAS構建用戶中心進行驗證
大概想法:經過配置URL的形式,把某些登陸請求發送到cas驗證服務器上,而後此時分爲兩種狀況,一種是沒有攜帶ticket,另外一種是攜帶ticket的。
處理第一種狀況:拼裝url請求,發送到服務器請求ticket,而後返回得到ticket,便到了第二步處理第二種狀況:cas服務器對於ticket進行驗證,返回結果
3.
python中單點登陸以及Flask框架的單點登陸如何實現?
參考內容Flask + PyJWT 實現基於Json Web Token的用戶認證受權實現基於json-web-token的用戶認證受權)參考內容Flask: SSO原理及實現**
4.
參考內容