單點登錄的三種實現方式

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

單點登錄SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,用戶在一處登錄后,就不用在其他系統中登錄,也就是用戶的一次登錄能得到其他所有系統的信任。單點登錄在大型網站里使用得非常頻繁,例如像阿里巴巴這樣的網站,在網站的背后是成百上千的子系統,用戶一次操作或交易可能涉及到幾十個子系統的協作,如果每個子系統都需要用戶認證,不僅用戶會瘋掉,各子系統也會為這種重復認證授權的邏輯搞瘋掉。實現單點登錄說到底就是要解決如何產生和存儲那個信任,再就是其他系統如何驗證這個信任的有效性,因此要點也就以下兩個:

  • 存儲信任
  • 驗證信任

如果一個系統做到了開頭所講的效果,也就算單點登錄,單點登錄有不同的實現方式,本文就羅列我開發中所遇見過的實現方式。

以Cookie作為憑證媒介

最簡單的單點登錄實現方式,是使用cookie作為媒介,存放用戶憑證。
用戶登錄父應用之后,應用返回一個加密的cookie,當用戶訪問子應用的時候,攜帶上這個cookie,授權應用解密cookie并進行校驗,校驗通過則登錄當前用戶。

Auth via cookie

不難發現以上方式把信任存儲在客戶端的Cookie中,這種方式很容易令人質疑:

  • Cookie不安全
  • 不能跨域實現免登

對于第一個問題,通過加密Cookie可以保證安全性,當然這是在源代碼不泄露的前提下。如果Cookie的加密算法泄露,攻擊者通過偽造Cookie則可以偽造特定用戶身份,這是很危險的。
對于第二個問題,更是硬傷。

通過JSONP實現

對于跨域問題,可以使用JSONP實現。
用戶在父應用中登錄后,跟Session匹配的Cookie會存到客戶端中,當用戶需要登錄子應用的時候,授權應用訪問父應用提供的JSONP接口,并在請求中帶上父應用域名下的Cookie,父應用接收到請求,驗證用戶的登錄狀態,返回加密的信息,子應用通過解析返回來的加密信息來驗證用戶,如果通過驗證則登錄用戶。

Auth via jsonp

這種方式雖然能解決跨域問題,但是安全性其實跟把信任存儲到Cookie是差不多的。如果一旦加密算法泄露了,攻擊者可以在本地建立一個實現了登錄接口的假冒父應用,通過綁定Host來把子應用發起的請求指向本地的假冒父應用,并作出回應。
因為攻擊者完全可以按照加密算法來偽造響應請求,子應用接收到這個響應之后一樣可以通過驗證,并且登錄特定用戶。

通過頁面重定向的方式

最后一種介紹的方式,是通過父應用和子應用來回重定向中進行通信,實現信息的安全傳遞。
父應用提供一個GET方式的登錄接口,用戶通過子應用重定向連接的方式訪問這個接口,如果用戶還沒有登錄,則返回一個的登錄頁面,用戶輸入賬號密碼進行登錄。如果用戶已經登錄了,則生成加密的Token,并且重定向到子應用提供的驗證Token的接口,通過解密和校驗之后,子應用登錄當前用戶。

Auth via redirect

這種方式較前面兩種方式,接解決了上面兩種方法暴露出來的安全性問題和跨域的問題,但是并沒有前面兩種方式方便。
安全與方便,本來就是一對矛盾。

使用獨立登錄系統

一般說來,大型應用會把授權的邏輯與用戶信息的相關邏輯獨立成一個應用,稱為用戶中心。
用戶中心不處理業務邏輯,只是處理用戶信息的管理以及授權給第三方應用。第三方應用需要登錄的時候,則把用戶的登錄請求轉發給用戶中心進行處理,用戶處理完畢返回憑證,第三方應用驗證憑證,通過后就登錄用戶。



作者:JC_Huang
鏈接:http://www.jianshu.com/p/613e44d4a464
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451064.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速判斷數組中每個對象同一屬性值是否相同

做批量查詢的時候,要確定數組中的多個對象下的字符串是否能全部匹配,這時需要在匹配的名稱對象中通過字段記錄該名稱是否匹配。 const search [ { name: B, isExistence: false },{ name: C, isExistence: false } ]; 這時要確定 search 是否全部匹配上…

java對象占用內存大小?

一個不包含任何內部成員變量的空Object大約占33byte,若增加成員變量,則增加相應大小的內存占用。 測算方式:設置jvm的堆大小為1m,在堆中不停new不含任何成員變量的OOMObject對象,直到堆內存溢出。如下圖,在…

Java程序員面試中的多線程問題

很多核心Java面試題來源于多線程(Multi-Threading)和集合框架(Collections Framework),理解核心線程概念時,嫻熟的實際經驗是必需的。這篇文章收集了 Java 線程方面一些典型的問題,這些問題經常被高級工程師所問到。 0.Java 中多線程同步是什…

SpringBoot2使用WebFlux函數式編程

本文只是簡單使用SpringBoot2使用WebFlux的函數式編程簡單使用,后續會繼續寫關于Webflux相關的文章。 最近一直在研究WebFlux,后續會陸續出一些相關的文章。 首先看一下Srping官網上的一張圖,對比一下SpringMvc和Spring WebFlux,如…

單點登錄原理與簡單實現

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、單系統登錄機制 1、http無狀態協議 web應用采用browser/server架構,http作為通信協議。http是無狀態協議,瀏…

java接口類支持多繼承

一個類只能extends一個父類,只能有一個父類,但可以implements多個接口。java通過使用接口的概念來取代C中多繼承。與此同時,一個接口則可以同時extends多個接口,卻不能implements任何接口。Java中的接口是支持多繼承的。

xmind-HTTP協議

轉載于:https://www.cnblogs.com/margot921/p/9764788.html

彈性布局

彈性布局 一、Flex布局是什么? Flex是Flexible Box的縮寫,意為”彈性布局”,用來為盒狀模型提供最大的靈活性。任何一個容器都可以指定為Flex布局。 二、基本概念 采用Flex布局的元素,稱為Flex容器(flex container&…

Java-Type簡單分類

&#xff08;1&#xff09;ParameterizedType&#xff1a; 參數化類型&#xff0c;例如List<T>。 &#xff08;2&#xff09;GenericArrayType&#xff1a; 泛型數組類型&#xff0c;例如T[]。 &#xff08;3&#xff09;TypeVariable&#xff1a; 泛型的類型變量&a…

解決dataTable 報錯:cannot read property “style“ of undefined

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 其實這錯&#xff0c;我之前也遇到過&#xff0c;只是太久了&#xff0c;沒有記錄下來&#xff0c; 今天看到群里朋友也遇到這個錯誤&a…

萬惡之源 - Python基礎數據類型一

整數 整數在Python中的關鍵字用int來表示; 整型在計算機中運于計算和比較 在32位機器上int的范圍是: -2**31&#xff5e;2**31-1&#xff0c;即-2147483648&#xff5e;2147483647 在64位機器上int的范圍是: -2**63&#xff5e;2**63-1&#xff0c;即-9223372036854775808&…

談談對于技術面試的心得體驗

導讀&#xff1a;作者lzprgmr寫了一篇《談談技術面試》文章&#xff0c;他在文中講述了自己對于技術人員面試的經驗和心得&#xff0c;以下是文章內容&#xff1a; 只要是招一個技術人員&#xff0c;不管是初級的程序員還是高級軟件工程師&#xff0c;技術上的考核都必不可少。…

es6中class類的全方面理解(三)------靜態方法

不需要實例化類&#xff0c;即可直接通過該類來調用的方法&#xff0c;即稱之為“靜態方法”。將類中的方法設為靜態方法也很簡單&#xff0c;在方法前加上static關鍵字即可。這樣該方法就不會被實例繼承&#xff01; class Box{static a(){return "我是Box類中的&#xf…

jackson/fastJson boolean類型問題

1.我們以Person對象舉個栗子&#xff0c;person有三個屬性。name&#xff0c;age和isGay Data public class Person {public Person(String name, int age, boolean isGay) {this.name name;this.age age;this.isGay isGay;}private String name;private Integer age;priva…

django模板系統(下)

主要內容&#xff1a;母版&#xff0c;繼承母版&#xff0c;塊&#xff0c;組件&#xff0c;靜態文件 母版 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"x-ua-compatible" conten…

狗窩里的小日子 ...

來&#xff0c;把平時作的菜菜整理下下&#xff1a; 1. 2. 3. 4. 5. 6. 7. 8.

面試開發人員的有效方法

伯樂在線 寫道 "Alan Skorkin是一名軟件開發人員&#xff0c;這是他分享的另一篇有關面試和開發人員的文章(中文)。Skorkin 認為&#xff0c;“當要雇傭開發者時&#xff0c;傳統的面試方法顯得力不從心&#xff0c;這是必須要面對的現實。為什么不行&#xff1f;原因也許…

Android直接用手機打包apk!

你沒有看錯&#xff0c;用手機瀏覽器訪問Jenkins&#xff0c;就可以打包apk&#xff0c;并生成下載二維碼&#xff0c;發送郵件通知測試人員下載&#xff0c;從此解放雙手&#xff0c;告別打包測試。先上本人手機郵箱收到的打包成功通知效果圖&#xff1a; 廢話少說&#xff0c…

java中byte、short、char、boolean實際都是按照int處理的!

byte、char、short、boolean四種類型在匯編期或運行期間采取和int類型一樣的存儲方式&#xff0c;在計算時會先轉換為int類型&#xff0c;后進行計算。所以兩個short類型數據做算數運算&#xff0c;結果卻為int類型。這主要是因為jvm的字節碼為了簡潔高效&#xff0c;設計時只使…

4、2 核心組件

1、Stage&#xff1a;虛的  一組RDD構成的鏈條并行的task集合&#xff0c;同一Stage的所有任務有著相同的Shuffle依賴。階段的劃分按照shuffle標記來進行的。一個階段含多個RDD&#xff0c;先有RDD后有Stage一個階段含多個taskstage通過ShuffleDependency劃分&#xff0c;一個…