一、說明
單點登錄顧名思義就是在多個應用系統中,只需要登錄一次,就可以訪問其他相互信任的應用系統,免除多次登錄的煩惱;本文主要介紹跨域間的 前后端分離
項目怎樣實現單點登錄,並且與 非前后端分離
的差異在那里?需要解決什么問題?。
前后端分離的核心概念是后端僅返回前端所需的數據,不再渲染HTML頁面,前端HTML頁面通過AJAX調用后端的RESTFUL API接口並使用JSON數據進行交互
PS:關於單點登錄主流的實現思路和原理請看文章《Spring Security基於Oauth2的SSO單點登錄怎樣做?一個注解搞定》
二、實現差異
跨域間的前后端分離項目也是基於共享統一授權服務(UAA)的cookie來實現單點登錄的,但是與非前后分離不一樣的是存在以下問題需要解決
- 沒有過濾器/攔截器,需要在前端判斷登錄狀態
- 需要自己實現oauth2的授權碼模式交互邏輯
- 需要解決安全性問題,oauth2的clientSecret參數放在前端不安全
三、實現架構
下面是前后端分離項目的三個角色(前端WEB工程、后端API工程、授權中心UAA)間進行登錄/單點登錄時的交互邏輯架構圖
跨域的單點登錄原理在《Spring Security基於Oauth2的SSO單點登錄怎樣做?一個注解搞定》中已經介紹過了這里就不展開說明了
前端WEB工程有幾個點需要注意:
- 紅色線條為重定向跳轉
- 前端工程可通過是否存在
access_token
判斷登錄狀態 - 前端工程跳轉UAA之前需記錄用戶訪問的頁面地址,方便登錄完成后重定向回去
PS:為什么獲取access_token需要請求后端API工程去完成,而不是前端WEB工程自己直接請求UAA呢?因為安全性問題!這一步需要傳clientSecret參數,而通過后台來配置這個參數就不需要暴露給前端了。
四、完整的demo下載地址
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-demo/sso-demo/web-sso
掃碼關注有驚喜!