干貨分享|如何將前端代理服務器(BFF)接入身份認證(3完結篇)

續集3

前篇文章在前面發布,同學們可以自行找一下。

本篇文章將繼續通過實例來詳細講解如何將前端代理服務器(BFF)接入身份認證。我們將使用一個示例應用來演示 BFF 與身份認證的集成過程。

3 在 Full BFF 中接入認證平臺

本小節將介紹如何在 Full BFF 中接入身份認證平臺。Full BFF 不僅接管與身份認證平臺的令牌獲取過程,還接管了后續與資源服務器打交道的過程。通過使用 Full BFF,前端也不需要保存身份認證平臺頒發的令牌了,在這種架構下,這將由 BFF 來保存。前端和 BFF 之間通過 Cookie 維持其單獨的會話。

在數字化轉型浪潮中,公司或者機構組織被迫在可維護性和安全性之間做出權衡,雖然在架構中采用原始的樸素 Naive BFF 層,在實現上最簡單,維護起來也更省心,但這犧牲了安全性,在今天的自動化社會中,這種妥協是不可接受的。所以我們需要一個更安全的解決方案,這就是 Full BFF。

許多擁有單頁應用程序、在前端使用 access_tokens 并采用微服務架構的公司,現在正努力將身份驗證轉移到服務器端。這個服務器端本質上就是 Full BFF。

我們再來回顧一個目前可能會面臨的問題,假設一家公司已經實現了一套如圖所示的無BFF 應用架構。

在這種架構中,前端應用程序直接與身份認證平臺打交道,獲取令牌,然后將令牌發送到后端服務,后端服務再將令牌發送到資源服務器,獲取資源。即:

1前端應用程序:

·運行在瀏覽器中。

·通過將未經過身份驗證的用戶轉到身份提供者來發起對用戶的驗證。

·當用戶驗證之后,前端單頁面應用程序發起令牌請求。

·前端單頁面應用將令牌隨著 Authentication 頭發送到后端服務進行 HTTP 調用。

2身份提供者:

·是 OpenID Connect 服務器。

·頒發令牌。

·驗證用戶的憑據,即用戶在此處登錄。

3API/微服務:

·通過令牌保護。典型的是只有在令牌有效時才允許訪問 API。

·API 應用一個規則來決定一個用戶是否已經被授權來訪問/查看資源。換句話說,微服務,會實施訪問控制策略。

這種架構有什么問題呢?下面來看看。

1)在前端進行令牌交換暴露了不必要的攻擊向量

在這樣的架構下,當用戶登錄時,授權碼會發送到前端。前端必須拿這個授權碼來換取令牌。

理論上沒有辦法分辨是誰在拿著授權碼換取令牌。為了確保將令牌發送給想要發送的接收方,就需要使用客戶端密鑰。但是在這個架構下,沒有使用客戶端密鑰。

2)令牌可以被盜用

由于令牌存儲在前端,理論上很容易被盜用。

由于以上架構有著這樣的問題,因此我們更推薦下面的方案。一般來說,要緩解上面提到的架構的安全風險,就需要將驗證環節轉移到服務器端。

這樣的結果就是,解決方案架構會變得更加復雜(這也是在采納該方案時需要仔細權衡的原因)。

為了能夠在服務器端驗證用戶,就需要一個能夠跟蹤用戶會話的組件,這個組件就是 Full BFF,如圖所示。

上圖的架構圖包含:

1瀏覽器端的單頁面應用。

·運行在瀏覽器端。

·和 API 處于同一個域名下。

·并不是用戶驗證的發起方。

2 BFF。

·負責托管單頁面應用資源(index.html 和/dist 目錄)。

·暴露 API。

·擁有 HTTP 會話狀態。

·是驗證用戶的發起方(將用戶重定向到身份提供者)。

3身份提供者。

·是一個 OpenID Connect 服務器。

·頒發令牌。

·驗證用戶的憑據,即用戶在此處登錄。

4API/微服務。

· 被令牌保護。一般來說,只有在令牌有效時才允許訪問 API。

·API 應用一個規則來決定一個用戶是否已經被授權來訪問/查看資源。換句話說,微服務,會實施訪問控制策略。

為什么 Full BFF 架構會更安全呢?主要有以下兩個原因:

(1)令牌交換發生在服務器端。

對于攻擊者來說,沒有任何方式觀察到 BFF 是怎么獲取到令牌的,從而極難進行干預。

同時,由于驗證過程也發生在服務器端,因此在交換令牌的過程中可以安全地包含客戶端密鑰。

這就意味著身份提供者可以驗證究竟是誰正在獲取令牌。

(2)更安全的會話管理。

如果要將令牌保存在瀏覽器端,一般就是保存在一個安全 Cookie、本地存儲或者會話存儲中。

如果攻擊者找到了辦法復制它們,就基本上劫持了會話。要防止這樣的情況,前端就需要實現所有這些機制:預防會話劫持、防止 CSRF 攻擊、防止 XSS 攻擊等。

實現會話管理最好的方式是不要自行實現。微軟(或者其他大型公司)已經為我們完成了這向工作。

工作原理分析:簡單來說,BFF 就是一個反向代理服務器。但是 Full BFF 強調它不僅將流量傳遞到下游領域服務,它還在轉發請求時添加 Authentication 頭部。

Full BFF 會處理兩種類型的請求。多數請求是由單頁面應用發起的 API 請求。BFF 處理 API 請求的流程如圖所示。

Full BFF 會將請求轉發到 API,同時將令牌添加到 Authentication 頭部。API 會驗證令牌,然后返回響應。

Full BFF 還有網站托管能力,這意味著用戶可以通過瀏覽器訪問該 BFF。當用戶瀏覽至該 BFF時,有一個特殊的端點:/login 端點。通過該端點,用戶得以驗證。驗證用戶的處理流程可以使用圖來展示。

完結啦!BFF 的發展歷程,以及每個階段的 BFF 如何接入身份認證平臺,本篇文章就已經全部講清楚了。以后還會為大家帶來喜歡的干貨文章,請多多關注哦!

本文摘自《數字身份認證技術與實踐》,獲出版社和作者授權發布。

數字身份認證技術與實踐——jd

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

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

相關文章

Raylib 坐標系適應與GPU繪制參數

通過750 - 鼠標坐標&#xff0c;把原點在左上角的鼠標坐標變成左下角 實現輸入數據后的坐標系同GPU原點在左下角坐標相同&#xff0c; 比數組0&#xff0c;0對應左上角好&#xff0c; 此時實際上數組0&#xff0c;0對應左下角 #include <raylib.h> // 感受&#xff1a…

【SpringBoot配置文件讀取】無法讀取yaml文件中文字符

1. yaml配置文件 注意要將該文件編碼格式改為UTF-8 spring:application:name: 好好學習admin:name: 李斯age: 24books:- name: 數據結構desc: 數據書- name: 編譯原理desc: 編譯書2.配置實體類 Data設置get&#xff0c;set方法Component注冊為BeanConfigurationProperties(p…

開發者聊科學作息時間表

非常有幸對科學作息時間表app的開發者做一次采訪。 問&#xff1a;你對科學作息時間表app滿意么&#xff1f; 答&#xff1a;非常不滿意&#xff0c;我們的設想是讓他更智能&#xff0c;更多的提醒方式&#xff0c;更好的交互體驗。如果作為一個鬧鐘他是非常不合格的&#xff0…

輕松駕馭Python 3.11:Windows環境下的安裝與配置全攻略

引言 Python是一種功能強大且易于學習的編程語言&#xff0c;廣泛應用于Web開發、數據分析、人工智能和自動化等領域。為了在Windows中使用Python&#xff0c;首先需要安裝Python解釋器并進行環境配置。本文將詳細介紹如何在Windows中安裝Python 3.11并進行環境配置。 目錄 …

R可視化數據必要格式——長格式

一、引言 我們在對數據進行可視化時遇到最頭疼、最常見的問題是什么&#xff1f;數據問題。 因為我們往往不會從零自己編程進行可視化&#xff0c;往往是現有模板或積累&#xff0c;而正確的數據格式對應正確的圖形包要求&#xff0c;一定會正確出圖&#xff0c;所以只有一個問…

調試 hipcc 的llvm llc gpu目標代碼生成模塊

源碼&#xff1a; hello_vectorAdd.hip: __global__ void vectorAdd(const float *A, const float *B, float *C) {int i blockDim.x * blockIdx.x threadIdx.x;C[i] A[i] B[i] 0.0f; } Makefile: x.O1.s: hello_vectorAdd.hip../../local_amdgpu/bin/clang ./hello_vec…

力扣hot100-普通數組2

文章目錄 題目&#xff1a;輪轉數組方法1-使用額外的數組方法2-三次反轉數組 除自身以外數組的乘積方法1-用到了除法方法2-前后綴乘積法 題目&#xff1a;輪轉數組 原題鏈接&#xff1a;輪轉數組 方法1-使用額外的數組 方法1是自己寫出來的。方法2參考的別人的&#xff0c;…

通配符和正則表達式之間的關系

通配符和正則表達式&#xff08;正則&#xff09;都是用于匹配字符串的工具&#xff0c;但它們的復雜性和用途有所不同。下面是它們之間的主要關系和區別&#xff1a; 通配符 通配符主要用于簡單的模式匹配&#xff0c;常見于文件系統操作中&#xff0c;例如在命令行中查找文…

AttackGen:一款基于LLM的網絡安全事件響應測試工具

關于AttackGen AttackGen是一款功能強大的網絡安全事件響應測試工具&#xff0c;該工具利用了大語言模型和MITRE ATT&CK框架的強大功能&#xff0c;并且能夠根據研究人員選擇的威脅行為組織以及自己組織的詳細信息生成定制化的事件響應場景。 功能介紹 1、根據所選的威脅行…

【MindSpore學習打卡】應用實踐-計算機視覺-FCN圖像語義分割-基于MindSpore實現FCN-8s進行圖像語義分割的教程

圖像語義分割是計算機視覺領域中的一個重要任務&#xff0c;它旨在對圖像中的每個像素進行分類&#xff0c;從而實現對圖像內容的詳細理解。在眾多圖像語義分割算法中&#xff0c;全卷積網絡&#xff08;Fully Convolutional Networks, FCN&#xff09;因其端到端的訓練方式和高…

7.7、指針和函數

代碼 #include <iostream> using namespace std;//實現兩個數字進行交換 void swap01(int a, int b) {int temp a;a b;b temp;cout << "swap01a " << a << endl;cout << "swap01b " << b << endl; }void sw…

08 docker Registry搭建docker私倉

目錄 本地鏡像發布流程 1. docker pull registry 下載鏡像 2. docker run 運行私有庫registry 3. docker commit 構建鏡像 4. docker tag 修改新鏡像&#xff0c;使之符合私服規范tag 5. 修改配置文件使之支持http 6. curl驗證私服庫上有什么鏡像 7. push推送 pull拉取 …

Activity、Window、DecorView的關系

目錄 一、Activity、Window、DecorView的層級關系如下圖所示&#xff1a; 1、Activity 2、Window 3、DecorView 二、DecorView初始化相關源碼 三、DecorView顯示時機 前言&#xff1a; 不同的Android版本有差異&#xff0c;以下基于Android 11進行講解。 一、Activi…

Halide AOT模式

這種模式會提前&#xff0c;會提前編譯好&#xff0c;變成dll什么的&#xff0c;可接受任何輸入的參數運行。 然后這樣調用&#xff0c;必須要make一下前一個file&#xff0c;才有后面的.h

魔行觀察-AI數據分析-蜜雪冰城

摘要 本報告旨在評估蜜雪冰城品牌作為投資對象的潛力和價值&#xff0c;基于其經營模式、門店分布、人均消費、覆蓋省份等關鍵指標進行分析。 數據數據源&#xff1a;魔行觀察&#xff1a;http://www.wmomo.com/#/brand/brandDetails?code10013603 品牌概覽 蜜雪冰城是中國…

拼多多職位數據信息采集

數據信息采集 洛哥爬蟲【視頻】 愛寫爬蟲 我愛扣腳 https://careers.pinduoduo.com/jobs#/from DrissionPage import ChromiumPage, ChromiumOptions def fetch_pinduoduo_jobs():# 創建ChromiumOptions對象co ChromiumOptions()# 提供瀏覽器可執行文件的路徑path rC:\Pro…

Vue 爬坑

都是基于最新的Vue3版本 "vue": "^3.4.29" 1 vue組建樣式設置 <script setup lang"ts"> import HelloWorld from ./components/HelloWorld.vue </script><template><div><a href"https://vitejs.dev" tar…

RPA 第一課

RPA 是 Robotic Process Automation 的簡稱&#xff0c;意思是「機器人流程自動化」。 顧名思義&#xff0c;它是一種以機器人&#xff08;軟件&#xff09;來替代人&#xff0c;實現重復工作自動化的工具。 首先要說一句&#xff0c;RPA 不是 ChatGPT 出來之后的產物&#x…

Ubuntu24.04安裝Skynet環境

安裝依賴 sudo apt-get -y install gcc sudo apt-get -y install g sudo apt-get -y install make sudo apt-get install -y autoconf automake libtool sudo apt-get install -y git 或者可以用&#xff1a; sudo apt-get -y install gcc g make autoconf automake libtool…

升級springboot3

坑爹的發版流水線&#xff0c;管天管地&#xff0c;springboot2過了維護期&#xff0c;就催著我們升級。 導致必須上jdk17 記錄一下升級需要處理的事情 先升級springboot和cloud&#xff0c;這里定下基調&#xff0c;其他的才好跟著升級 https://spring.io/projects/spring-b…