前端实现单点登录(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.mzph.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…