什么是單點登錄
單點登錄(Single Sign On)乘综,簡稱為 SSO孕惜,是比較流行的企業(yè)業(yè)務整合的解決方案之一牍白。SSO的定義是在多個應用系統(tǒng)中戒洼,用戶只需要登錄一次就可以訪問所有相互信任的應用系統(tǒng)。
單點登錄所達到的效果如下圖所示枢劝,在多應用的情況下井联,由統(tǒng)一的認證服務負責登錄態(tài),用戶可以做到一站登錄您旁,多應用打通烙常,多個應用之間可能是不同的域名,無法共享cookie。
要達到單點登錄的效果蚕脏,需要認證機制來支持侦副,一是認證系統(tǒng)要授權應用系統(tǒng)使用自己的登錄態(tài),二是要保證整個流程的安全性驼鞭,這里不得不提到授權協(xié)議秦驯,單點登錄一般借助OAuth的授權流程來保證安全性。
什么是OAUTH2:
OAuth(Open Authorization挣棕,開放授權)是一個開放標準的授權協(xié)議译隘,允許用戶授權第三方應用訪問他們存儲在資源服務上受保護的信息,而不需要將用戶名和密碼提供給第三方應用洛心,解耦了認證和授權固耘。OAuth作為一種國際標準,目前傳播廣泛并被持續(xù)采用词身。OAuth2.0是OAuth協(xié)議的延續(xù)版本厅目,更加安全,更易于實現(xiàn)法严。 OAuth 2.0是目前最流行的授權機制损敷,用來授權第三方應用,獲取用戶數(shù)據(jù).
OAuth2四種授權模式
客戶端必須得到用戶的授權(authorization grant)渐夸,才能獲得令牌(access token)嗤锉。OAuth 2.0 規(guī)定了四種獲得令牌的流程,可以選擇實際情況選擇最適合的一種墓塌,向第三方應用頒發(fā)令牌瘟忱。
授權碼模式(authorization-code):最常用的流程,安全性也最高苫幢,它適用于那些有后端的 Web 應用访诱。授權碼通過前端傳送,令牌則是儲存在后端韩肝,而且所有與資源服務器的通信都在后端完成触菜。這樣的前后端分離,可以避免令牌泄漏哀峻。
簡化模式(implicit): 有些 Web 應用是純前端應用涡相,沒有后端。這時就不能用上面的方式了剩蟀,必須將令牌儲存在前端催蝗。RFC 6749 就規(guī)定了第二種方式,允許直接向前端頒發(fā)令牌育特。這種方式?jīng)]有授權碼這個中間步驟丙号,所以稱為(授權碼)"隱藏式"(implicit)。
密碼模式(password): 直接使用Resource owner提供的username和password來直接請求access_token(直接發(fā)起Access Token Request然后返回Access Token Response信息)。這種模式一般適用于Resource server高度信任第三方Client的情況下 犬缨。我們暫不討論這種模式喳魏。
客戶端模式(client credentials):Client直接以自己的名義而不是Resource owner的名義去要求訪問Resource server的一些受保護資源。
適用于服務器間通信場景怀薛,直接根據(jù)client的ID和密鑰即可獲取token刺彩,無需用戶參與。這種模式比較合適消費api的后端服務枝恋。我們暫不討論這種模式迂苛。
SSO集成oauth2的機制,SSO整體流程一般如下圖所示:
java生態(tài)下主流SSO框架
spring security + oauth2:
1.概念
資源服務器
security:
oauth2:
client:
client-id: demo-client
client-secret: demo-secret
user-authorization-uri: http://localhost:8080/oauth/authorize
access-token-uri: http://localhost:8080/oauth/token
resource:
jwt:
key-uri: http://localhost:8080/oauth/token_key
key-value: demo
authorization:
check-token-access: http://localhost:8080/oauth/check_token
鑒權服務: