前端實現單點登錄(SSO)的方案

概念:單點登錄(Single Sign-On, SSO)主要是在多個系統、多個瀏覽器或多個標簽頁之間共享登錄狀態,保證用戶只需登錄一次,就能訪問多個關聯應用,而不需要重復登錄。

💡 方案分類

1. 前端級別 SSO(僅適用于同源)

適用于:同一域名下的多個系統或標簽頁

方案適用范圍共享方式缺點
localStorage同瀏覽器、同源localStorage 共享 token不支持跨瀏覽器或隱身模式
sessionStorage僅當前標簽頁sessionStorage關閉標簽頁即失效
cookie同域、所有瀏覽器服務器 Set-Cookie不能跨域,容量限制
BroadcastChannel同瀏覽器、同域postMessage 事件廣播僅適用于同瀏覽器

2. 前后端結合 SSO(適用于跨域)

適用于:多個子系統,支持不同域名共享登錄

方案適用范圍共享方式適合場景
OAuth 2.0 + JWT跨域、多端通過授權服務器獲取 token第三方登錄(微信、GitHub)
CAS (Central Authentication Service)內部系統CAS 服務器管理登錄態企業內網統一認證
SSO + Cookie(SameSite=None + CORS)跨子域主域 *.example.com 共享 cookie適用于 SaaS 平臺
SSO + Redis + Session跨域token 存 Redis,前端查詢高并發業務

🔹 方案 1:前端 localStorage + BroadcastChannel(適用于同域)

適用于:同一瀏覽器的多個標簽頁
💡 實現思路

  1. 登錄時,將 token 存入 localStorage 并通知其他標簽頁

  2. 新標簽頁打開時,自動獲取 localStoragetoken

  3. 監聽 localStorage 變化,保證 token 實時同步

// 登錄時設置 token
localStorage.setItem('token', 'your-token-value')// 監聽 token 變化,保證新打開的頁面能同步
window.addEventListener('storage', (event) => {if (event.key === 'token') {console.log('新 token:', event.newValue)}
})

? 優點

  • 實現簡單

  • 無需后端支持

  • 適用于同一瀏覽器、同一域名下的多個系統

? 缺點

  • 不能跨瀏覽器、跨設備共享

  • 不能跨域名(如 a.com 無法共享 b.comtoken


🔹 方案 2:SSO + Cookie 共享(適用于跨子域)

適用于:跨子域(如 admin.example.comuser.example.com
💡 實現思路

  1. 后端設置 cookie,作用域為 *.example.com

  2. 前端所有子系統 訪問 cookie 共享登錄狀態

  3. 跨域設置 SameSite=None; Secure

后端(Node.js 示例)

 
res.cookie('token', 'your-token', {domain: '.example.com', // 設置作用域path: '/',httpOnly: true,secure: true,sameSite: 'None' // 允許跨域
})

前端

fetch('https://auth.example.com/check-login', {credentials: 'include' // 允許跨域攜帶 Cookie
}).then(res => res.json()).then(data => {console.log('登錄狀態:', data)})

? 優點

  • 支持多個子域共享登錄

  • 安全性較高

  • 用戶體驗好

? 缺點

  • 不能跨主域(如 example.com 不能共享 other.com

  • 需要 HTTPS

  • 瀏覽器 SameSite 限制較多


🔹 方案 3:OAuth 2.0 + JWT(適用于跨域、第三方登錄)

適用于:多端、第三方應用、社交登錄(如 Google、GitHub、微信)
💡 實現思路

  1. 用戶在 SSO 服務器 登錄,返回 token

  2. 其他系統使用 token 請求 SSO,獲取用戶信息

  3. 通過 OAuth 標準協議授權

前端 OAuth 登錄

window.location.href = `https://sso.example.com/oauth/authorize?client_id=your-client-id&redirect_uri=${encodeURIComponent(window.location.href)}`

后端驗證 token

app.get('/auth/user', async (req, res) => {const token = req.headers.authorization?.split(' ')[1]const user = verifyToken(token) // 解析 JWTres.json(user)
})

? 優點

  • 支持跨域、跨設備

  • 可用于第三方應用

  • 安全性高

? 缺點

  • 需要后端支持 OAuth 2.0

  • token 需要存 cookielocalStorage


🔹 方案 4:SSO + Redis + Session(適用于企業系統)

適用于:企業級 SSO(如釘釘、企業微信)
💡 實現思路

  1. 用戶登錄后,后端將 session 存入 Redis

  2. 不同系統請求 SSO,校驗 session 是否有效

  3. 用戶登出時,刪除 Redis session

后端

const sessionStore = new Redis() // 連接 Redisapp.post('/login', (req, res) => {const token = generateToken(req.body.user)sessionStore.set(token, JSON.stringify(req.body.user), 'EX', 3600) // 存入 Redisres.json({ token })
})app.get('/check-session', async (req, res) => {const token = req.headers.authorization?.split(' ')[1]const session = await sessionStore.get(token)if (session) {res.json(JSON.parse(session))} else {res.status(401).json({ message: '未登錄' })}
})

? 優點

  • 可以跨域、跨瀏覽器共享登錄

  • 適用于大規模企業級系統

  • 支持 SSO 統一管理

? 缺點

  • 需要后端支持 Redis

  • 實現較復雜


📌 方案對比

方案適用范圍共享方式安全性適合場景
localStorage同瀏覽器localStorage前端應用
BroadcastChannel同瀏覽器postMessage單頁面應用
Cookie + SameSite跨子域cookie內部 SaaS 系統
OAuth 2.0 + JWT跨域、第三方token公共平臺
SSO + Redis跨系統、跨瀏覽器session企業 SSO

🎯 最佳實踐

  • 小型前端應用(SPA) ? localStorage + BroadcastChannel

  • 企業 SaaS(跨子域) ? Cookie + SameSite=None

  • 第三方登錄(跨域) ? OAuth 2.0 + JWT

  • 企業級 SSO(跨瀏覽器、多系統) ? Redis + Session

推薦組合
? SSO + OAuth 2.0 + Redis + JWT,適用于高安全性、多端登錄

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

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

相關文章

zabbix監控網站(nginx、redis、mysql)

目錄 前提準備: zabbix-server主機配置: 1. 安裝數據庫 nginx主機配置: 1. 安裝nginx redis主機配置: 1. 安裝redis mysql主機配置: 1. 安裝數據庫 zabbix-server: 1. 安裝zabbix 2. 編輯配置文…

無人機等非合作目標公開數據集2025.4.3

一.無人機遙感數據概述 1.1 定義與特點 在遙感技術的不斷發展中,無人機遙感數據作為一種新興的數據源,正逐漸嶄露頭角。它是通過無人駕駛飛行器(UAV)搭載各種傳感器獲取的地理空間信息,具有 覆蓋范圍大、綜合精度高、…

大數據時代的隱私保護:區塊鏈技術的創新應用

一、引言 在當今數字化時代,大數據已經成為推動社會發展的關鍵力量。從商業決策到社會治理,從醫療健康到金融服務,數據的價值日益凸顯。然而,隨著數據的大量收集和廣泛使用,隱私保護問題也日益突出。如何在充分利用大…

LeetCode 2442:統計反轉后的不同整數數量

目錄 核心思想:數字的“拆分”與“重組” 分步拆解(以輸入 123 為例) 關鍵操作詳解 為什么能處理中間或末尾的0? 數學本質 總結 題目描述 解題思路 代碼實現 代碼解析 復雜度分析 示例演示 總結 核心思想:…

Python爬蟲第3節-會話、Cookies及代理的基本原理

目錄 一、會話和Cookies 1.1 靜態網頁和動態網頁 1.2 無狀態HTTP 1.3 常見誤區 二、代理的基本原理 2.1 基本原理 2.2 代理的作用 2.3 爬蟲代理 2.4 代理分類 2.5 常見代理設置 一、會話和Cookies 大家在瀏覽網站過程中,肯定經常遇到需要登錄的場景。有些…

Flutter項目之登錄注冊功能實現

目錄: 1、頁面效果2、登錄兩種狀態界面3、中間按鈕部分4、廣告區域5、最新資訊6、登錄注冊頁聯調6.1、網絡請求工具類6.2、注冊頁聯調6.3、登錄問題分析6.4、本地緩存6.5、共享token6.6、登錄頁聯調6.7、退出登錄 1、頁面效果 import package:flutter/material.dart…

木馬學習記錄

一句話木馬是什么 一句話木馬就是僅需要一行代碼的木馬,很簡短且簡單,木馬的函數將會執行我們發送的命令 如何發送命令&發送的命令如何執行? 有三種方式:GET,POST,COOKIE,一句話木馬中用$_G…

(C語言)單鏈表(1.0)(單鏈表教程)(數據結構,指針)

目錄 1. 什么是單鏈表? 2. 單鏈表的代碼表示 3. 單鏈表的基本操作 3.1 初始化鏈表 3.2 插入結點(頭插法) 3.3 插入結點(尾插法) 3.4 遍歷鏈表 4. 單鏈表的優缺點 代碼:*L(LinkList)malloc(sizeof(…

Sentinel-自定義資源實現流控和異常處理

目錄 使用SphU的API實現自定義資源 BlockException 使用SentinelResource注解定義資源 SentinelResourceAspect 使用Sentinel實現限流降級等效果通常需要先把需要保護的資源定義好,之后再基于定義好的資源為其配置限流降級等規則。 Sentinel對于主流框架&#…

Linux信號處理解析:從入門到實戰

Linux信號處理全解析:從入門到實戰 一、初識Linux信號:系統級的"緊急電話" 信號是什么? 信號是Linux系統中進程間通信的"緊急通知",如同現實中的交通信號燈。當用戶按下CtrlC(產生SIGINT信號&…

Java的Selenium的特殊元素操作與定位之select下拉框

如果頁面元素是一個下拉框,我們可以將此web元素封裝為Select對象 Select selectnew Select(WebElement element); Select對象常用api select.getOptions();//獲取所有選項select.selectBylndex(index);//根據索引選中對應的元素select.selectByValue(value);//選…

藍橋云客 刷題統計

刷題統計 問題描述 小明決定從下周一開始努力刷題準備藍橋杯競賽。他計劃周一至周五每天做 a 道題目,周六和周日每天做 b 道題目。請你幫小明計算,按照計劃他將在第幾天實現做題數大于等于 n 題? 輸入格式 輸入一行包含三個整數 a, b 和 …

三防筆記本有什么用 | 三防筆記本有什么特別

在現代社會,隨著科技的不斷進步,筆記本電腦已經成為人們工作和生活的重要工具。然而,在一些特殊的工作環境和極端條件下,普通筆記本電腦往往難以滿足需求。這時,三防筆記本以其獨特的設計和卓越的性能,成為…

智能體和RPA都需要程序思維,如何使用影刀的變量?

歡迎來到濤濤聊AI, 不管AI還是RPA,都需要用到編程思想才能完成批量工作。今天研究了下影刀的變量。 變量類型 根據變量值選擇相應的類型,可選擇任意一種影刀所支持的數據類型 變量值 指定變量中保存的值,會根據不同的類型設置…

【藍橋杯】算法筆記3

1. 最長上升子序列(LIS) 1.1. 題目 想象你有一排數字,比如:3, 1, 2, 1, 8, 5, 6 你要從中挑出一些數字,這些數字要滿足兩個條件: 你挑的數字的順序要和原來序列中的順序一致(不能打亂順序) 你挑的數字要一個比一個大(嚴格遞增) 問:最多能挑出多少個這樣的數字? …

性能測試之jmeter的基本使用

簡介 Jmeter是Apache的開源項目,基于Java開發,主要用于進行壓力測試。 優點:開源免費、支持多協議、輕量級、功能強大 官網:https://jmeter.apache.org/index.html 安裝 安裝步驟: 下載:進入jmeter的…

【NLP 面經 7、常見transformer面試題】

目錄 1. 為何使用多頭注意力機制? 2. Q和K使用不同權重矩陣的原因 3. 選擇點乘而非加法的原因 4. Attention進行scaled的原因 5. 對padding做mask操作 6. 多頭注意力降維原因 7. Transformer Encoder模塊簡介 8. 乘以embedding size的開方的意義 9. 位置編碼 10. 其…

【深度學習】CNN簡述

文章目錄 一、卷積神經網絡(CNN)二、CNN結構特性1. CNN 典型結構2. 局部連接3. 權重共享4.空間或時間上的次采樣 三、理解層面 一、卷積神經網絡(CNN) 卷積神經網絡(Convolutional Neural Network,CNN)是一種用于處理…

理解OSPF 特殊區域NSSA和各類LSA特點

本文基于上文 理解OSPF Stub區域和各類LSA特點 在理解了Stub區域之后,我們再來理解一下NSSA區域,NSSA區域用于需要引入少量外部路由,同時又需要保持Stub區域特性的情況 一、 網絡總拓撲圖 我們在R1上配置黑洞路由,來模擬NSSA區域…

論文閱讀筆記:Denoising Diffusion Implicit Models (5)

0、快速訪問 論文閱讀筆記:Denoising Diffusion Implicit Models (1) 論文閱讀筆記:Denoising Diffusion Implicit Models (2) 論文閱讀筆記:Denoising Diffusion Implicit Models &#xff08…