前端單點登錄SSO面試回答

JWT鑒權機制

1.JWT用于登錄身份驗證

2.用戶登錄成功后,后端通過JWT機制生成一個token,返回給客戶端

3.客戶端后續的每次請求都需要攜帶token,放在header的authorization中

4.后端從authorization中拿到token后,通過secretKey進行解密驗證省份

JWT生成的Token由三部分組成:header.payload.signature

**header:**主要是聲明采用的加密算法

? alg:指定生成signature采用的加密算法,默認是HS256

? typ:令牌類型,jwt

**payload:**載荷,消息體,這里存放實際的內容

? exp:設置過期時間

? uid:用戶uid

除了設置過期時間和用戶的uid,還可以添加自定義私有字段,使用base64url進行編碼組成JWT的第二部分

signature:

Signature = HMACSHA256(base64Url(header)+.+base64Url(payload),secretKey)

優點:

  • json具有通用性,所以可以跨語言
  • 組成簡單,字節占用小,便于傳輸
  • 服務端無需保存會話信息,很容易進行水平擴展
  • 一處生成,多處使用,可以在分布式系統中,解決單點登錄問題
  • 可防護CSRF攻擊

缺點:

  • payload部分僅僅是進行簡單編碼,所以只能用于存儲邏輯必需的非敏感信息
  • 需要保護好加密密鑰,一旦泄露后果不堪設想
  • 為避免token被劫持,最好使用https協議

共享登錄SSO

同域名下的單點登錄

cookiedomain屬性設置為當前域的父域,并且父域的cookie會被子域所共享。path屬性默認為web應用的上下文路徑

利用 Cookie 的這個特點,沒錯,我們只需要將Cookiedomain屬性設置為父域的域名(主域名),同時將 Cookiepath屬性設置為根路徑,將 Session ID(或 Token)保存到父域中。這樣所有的子域應用就都可以訪問到這個Cookie

不過這要求應用系統的域名需建立在一個共同的主域名之下,如 tieba.baidu.commap.baidu.com,它們都建立在 baidu.com這個主域名之下,那么它們就可以通過這種方式來實現單點登錄

不同域名下的單點登錄使用PostMessage

單點登錄完全用前端來實現,前端拿到Token之后,前端通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個域下的 LocalStorage 中,前端每次在向后端發送請求之前,都會主動從 LocalStorage 中讀取Token并在請求中攜帶,這樣就實現了同一份Token 被多個域所共享;此種實現方式完全由前端控制,幾乎不需要后端參與,同樣支持跨域

// 獲取 token
var token = result.data.token;// 動態創建一個不可見的iframe,在iframe中加載一個跨域HTML
var iframe = document.createElement("iframe");
iframe.src = "http://app1.com/localstorage.html";
document.body.append(iframe);
// 使用postMessage()方法將token傳遞給iframe
setTimeout(function () {iframe.contentWindow.postMessage(token, "http://app1.com");
}, 4000);
setTimeout(function () {iframe.remove();
}, 6000);// 在這個iframe所加載的HTML中綁定一個事件監聽器,當事件被觸發時,把接收到的token數據寫入localStorage
window.addEventListener('message', function (event) {localStorage.setItem('token', event.data)
}, false);

認證中心來實現單點登錄

當用戶首次訪問時,需要在認證中心登錄:

 SSO 機制實現流程

1.當用戶訪問網站a.com下面的pageA頁面,

2.由于沒有登錄,則系統A會返回給瀏覽器302重定向,并帶上回調地址 www.sso.com?return_uri=a.com/pageA,以便登錄后直接進入對應頁面。

3.重定向302之后,瀏覽器去訪問重定向地址,認證中心驗證未登錄,則展示form,提示用戶登錄

4.用戶在認證中心輸入賬號密碼,提交登錄

5.認證中心驗證賬號密碼有效,然后重定向 a.com?ticket=123 帶上授權碼 ticket,并將認證中心 sso.com 的登錄態寫入 Cookie

6.在 a.com 服務器中,拿著 ticket 向認證中心確認,授權碼 ticket 真實有效。

7.驗證成功后,服務器將登錄信息寫入 Cookie(此時客戶端有 2 個 Cookie 分別存有 a.comsso.com 的登錄態)

SSO 機制實現流程

SSO 機制實現流程

前端常見登錄實現方案 + 單點登錄方案 - 掘金 (juejin.cn)

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

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

相關文章

Spring Boot中使用validator如何實現接口入參自動檢驗

文章目錄 一、背景二、使用三、舉例 一、背景 在項目開發過程中,經常會對一些字段進行校驗,比如字段的非空校驗、字段的長度校驗等,如果在每個需要的地方寫一堆if else 會讓你的代碼變的冗余笨重且相對不好維護,如何更加規范和優…

微服務-GateWay(網關)

所謂網關是什么意思? 相當于就是你們小區家的保安,進出小區都得獲得保安的同意,守護你們小區的生命財產健康,網關也是如此,對每個請求都嚴格把關,將合法的或者是獲得權限的請求進入服務器 網關的功能&…

設計模式之解釋器模式詳解及實例

1、解釋器設計模式概述: 解釋器模式(Interpreter Pattern)是一種設計模式,它主要用于描述如何構建一個解釋器以解釋特定的語言或表達式。該模式定義了一個文法表示和解釋器的類結構,用于解釋符合該文法規則的語句。解…

擴散模型實戰(四):從零構建擴散模型

推薦閱讀列表: 擴散模型實戰(一):基本原理介紹 擴散模型實戰(二):擴散模型的發展 擴散模型實戰(三):擴散模型的應用 本文以MNIST數據集為例,從…

智能樓宇綜合布線實訓室建設方案

一、樓宇智能綜合布線實訓室方案概述 樓宇智能綜合布線實訓室方案旨在為學生提供一個真實的學習和實踐環境,以培養他們在樓宇智能綜合布線領域的實際操作能力和技能。以下是一個概述: 1. 培養目標:培養學生在樓宇智能綜合布線方面的綜合能力…

Shader學習(三)(片元著色器)

1、在片元著色器處理漫反射 // Upgrade NOTE: replaced _World2Object with unity_WorldToObjectShader "Custom/specularfragement" {properties{_sp("Specular",color) (1,1,1,1)_shiness("Shiness",range(1,64)) 8}SubShader{pass {tags{&…

深入理解設計模式-行為型之模板(和回調區別聯系)

概述 模板設計模式(Template Design Pattern)是一種行為型設計模式,它定義了一個算法的骨架,將算法的一些步驟延遲到子類中實現。模板設計模式允許子類在不改變算法結構的情況下重新定義算法的某些步驟。 模板設計模式的核心思想…

網絡通信原理應用層(第五十一課)

1)DNS:域名解析系統,端口號TCP或UDP的53 2)域名注冊網站 -新網 www.xinnet.com -萬網-阿里云 www.net.cn -中國互聯 hulian.top 配置通過域名訪問網站(NETBASE第七課)_IHOPEDREAM的博客-CSDN博客 2、FTP 1)FTP概述 -文件傳輸協議 -控制連接:TCP 21 <

對redis、redisson、springcache總結

<一> redis-緩存中間件 什么是redis redis是c語言開發的&#xff0c;一個高性能key-value鍵值對內存數據庫&#xff0c;可以用來做數據庫、緩存、消息中間件的一種非關系型數據庫。 redis數據存儲在哪里 內存和磁盤中&#xff0c;但是redis的讀寫都在內存中&#xff0c;…

leetcode-413. 等差數列劃分(java)

等差數列劃分 leetcode-413. 等差數列劃分題目描述雙指針 上期經典算法 leetcode-413. 等差數列劃分 難度 - 中等 原題鏈接 - 等差數列劃分 題目描述 如果一個數列 至少有三個元素 &#xff0c;并且任意兩個相鄰元素之差相同&#xff0c;則稱該數列為等差數列。 例如&#xff0…

16 腦洞大開:GUI測試還能這么玩

頁面對象自動生成技術 頁面對象自動生成技術&#xff0c;屬于典型的“自動化你的自動化”的應用場景。它的基本思路是&#xff0c;你不用再手工維護 Page Class 了&#xff0c;只需要提供 Web 的 URL&#xff0c;它就會自動幫你生成這個頁面上所有控件的定位信息&#xff0c;并…

JMeter接口測試數據分離驅動應用

步驟&#xff1a; 創建csv文件&#xff0c;編寫接口測試用例 新建線程組——創建循環控制器&#xff08;循環次數填用例總數&#xff09; 創建CSV數據文件設置&#xff0c;設置參數。&#xff08;注意&#xff1a;是否允許帶引號&#xff1f;&#xff1a;一定要設置為true&a…

深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想

大家好,我是微學AI,今天給大家介紹一下深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想,文本將介紹AutoCompany模型的概念設計,涵蓋了AI智能公司的各個角色,并結合了GPT-4接口來實現各個角色的功能,設置中央控制器,公司運作過程會生成…

【MFC常用問題記錄】

MFC 記錄 MFC的edit control控件顯示1.控件添加變量M_edit后&#xff1a;2.控件ID為IDC_EDIT1: 線程函數使用 MFC的edit control控件顯示 1.控件添加變量M_edit后&#xff1a; CString str; int x 10; str.Format(_T("%d"),x); M_edit.SetWindowText(str)2.控件ID…

JMM內存模型之happens-before闡述

文章目錄 一、happens-before的定義二、happens-before的規則1. 程序順序規則&#xff1a;2. 監視器鎖規則&#xff1a;3. volatile變量規則&#xff1a;4. 傳遞性&#xff1a;5. start()規則&#xff1a;6. join()規則&#xff1a; 一、happens-before的定義 如果一個操作hap…

【編程二三事】ES究竟是個啥?

在最近的項目中&#xff0c;總是或多或少接觸到了搜索的能力。而在這些項目之中&#xff0c;或多或少都離不開一個中間件 - ElasticSearch。 今天忙里偷閑&#xff0c;就來好好了解下這個中間件是用來干什么的。 ES是什么? ? ES全稱ElasticSearch&#xff0c;是個基于Lucen…

性能優化的重要性

性能優化的重要性 性能優化的重要性摘要引言注意事項代碼示例及注釋性能優化的重要性 性能優化的重要性在 Java 中的體現響應速度資源利用效率擴展性與可維護性并發性能合理的鎖策略線程安全的數據結構并發工具類的應用避免競態條件和死鎖 總結代碼示例 博主 默語帶您 Go to Ne…

一張圖看懂 USDT三種類型地址 Omni、ERC20、TRC20的區別

USDT是當前實用最廣泛&#xff0c;市值最高的穩定幣&#xff0c;它是中心化的公司Tether發行的。在今年的4月17日之前&#xff0c;市場上存在著2種不同類型的USDT。4月17日又多了一種波場TRC20協議發行的USDT&#xff0c;它們各自有什么區別呢?哪個轉賬最快到賬&#xff1f;哪…

谷歌推出首款量子彈性 FIDO2 安全密鑰

谷歌在本周二宣布推出首個量子彈性 FIDO2 安全密鑰&#xff0c;作為其 OpenSK 安全密鑰計劃的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示&#xff1a;這一開源硬件優化的實現采用了一種新穎的ECC/Dilithium混合簽名模式&#xff0c;它結合了ECC抵御標準攻擊的安全性和…

[LeetCode]矩陣對角線元素的和

解題 思路 1: 循環,找到主對角線的下標和副對角線的下標,如果矩陣長或寬為奇數的時候,需要減去中間公共的那一個值,中間公共的那個數的下標為mat[mat.size()/2][mat.size()/2]副對角線的下標為 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…