当前位置: 首页 > article >正文

前端单点登录

前端实现单点登录(SSO)

单点登录(Single Sign-On,简称 SSO)是一种认证机制,允许用户在多个系统之间只需登录一次,就可以访问所有相关系统,而不需要重复输入账号和密码。它的目标是提升用户体验,同时简化认证流程。


单点登录的基本原理

单点登录的核心思想是:用户登录后,认证信息会在多个系统之间共享,用户只需登录一次,就可以访问所有系统。

通常,单点登录的实现依赖于一个统一认证中心,它负责管理用户的登录状态和认证信息。前端的主要任务是与认证中心交互,并在多个系统之间共享登录状态。

单点登录的工作流程

  1. 用户访问系统 A
    用户打开系统 A 的页面,前端检查用户是否已经登录。如果没有登录,前端会将用户重定向到认证中心。
  2. 用户登录认证中心
    用户在认证中心输入账号和密码,认证中心验证用户信息。如果验证成功,认证中心会生成一个令牌(Token)或票据(Ticket),并将其返回给前端。
  3. 前端保存令牌并访问系统 A
    前端拿到令牌后,将其保存(通常存储在 cookielocalStorage 中),并携带令牌向系统 A 发起请求。系统 A 会向认证中心验证令牌的有效性,验证通过后允许用户访问。
  4. 用户访问系统 B
    用户从系统 A 跳转到系统 B,前端会检查用户的登录状态。如果发现用户已经登录(令牌有效),则直接允许访问系统 B;如果没有登录,则重定向到认证中心进行登录。

前端实现单点登录的关键点

1. 统一认证中心

单点登录的核心是认证中心,前端需要与认证中心交互。认证中心通常提供以下功能:

  • 登录接口:用户输入账号密码后,认证中心返回令牌。
  • 验证接口:系统 A 和系统 B 可以向认证中心验证令牌的有效性。
  • 刷新接口:令牌过期后,前端可以通过认证中心刷新令牌。

2. 令牌的存储与传递

令牌是用户登录状态的凭证,前端需要妥善保存令牌,并在请求时携带令牌。常见的存储方式包括:

  • cookie:将令牌存储在浏览器的 cookie 中,设置为 httpOnlysecure,可以提高安全性。
  • localStorage:将令牌存储在 localStorage 中,适合单页面应用(SPA)。

3. 跨域问题

在单点登录中,认证中心和各个系统可能运行在不同的域名下(比如 auth.example.comsystemA.example.com)。前端需要处理跨域问题,常见的解决方法包括:

  • CORS:后端开启跨域资源共享(Cross-Origin Resource Sharing),允许前端跨域访问。
  • iframe + postMessage:通过嵌套 iframe 和消息传递实现跨域通信。

实现单点登录的流程

以下是一个简单的单点登录实现流程:

1. 检查登录状态

当用户访问系统 A 时,前端会检查用户是否已经登录。如果没有登录,则重定向到认证中心。

function checkLogin() {const token = localStorage.getItem('userToken');if (!token) {// 如果没有令牌,重定向到认证中心window.location.href = 'https://auth.example.com/login?redirect=' + encodeURIComponent(window.location.href);} else {// 如果有令牌,验证令牌是否有效validateToken(token);}
}async function validateToken(token) {const response = await fetch('https://auth.example.com/validate', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ token }),});if (response.ok) {console.log('Token is valid');} else {// 如果令牌无效,重定向到认证中心window.location.href = 'https://auth.example.com/login?redirect=' + encodeURIComponent(window.location.href);}
}

2. 登录认证中心

用户在认证中心输入账号和密码,认证中心验证成功后返回令牌。

async function login(username, password) {const response = await fetch('https://auth.example.com/login', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ username, password }),});if (response.ok) {const data = await response.json();localStorage.setItem('userToken', data.token); // 保存令牌window.location.href = data.redirectUrl; // 跳转到原始页面} else {console.error('Login failed');}
}

3. 令牌验证与共享

当用户从系统 A 跳转到系统 B 时,系统 B 的前端会检查令牌,并向认证中心验证令牌的有效性。

function checkLoginForSystemB() {const token = localStorage.getItem('userToken');if (!token) {// 如果没有令牌,重定向到认证中心window.location.href = 'https://auth.example.com/login?redirect=' + encodeURIComponent(window.location.href);} else {// 验证令牌validateToken(token);}
}

跨域单点登录的解决方案

如果认证中心和系统 A/B 运行在不同的域名下,前端需要处理跨域问题。以下是两种常见的解决方案:

1. 使用 CORS

后端开启跨域资源共享,允许前端跨域访问认证中心的接口。

// 后端设置 CORS
app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', '*');res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');next();
});

2. 使用 iframe + postMessage

通过嵌套 iframe 和消息传递实现跨域通信。

// 在认证中心页面中
window.addEventListener('message', (event) => {if (event.origin === 'https://systemA.example.com') {const token = 'userTokenFromAuthCenter';event.source.postMessage({ token }, event.origin);}
});// 在系统 A 页面中
const iframe = document.createElement('iframe');
iframe.src = 'https://auth.example.com';
document.body.appendChild(iframe);window.addEventListener('message', (event) => {if (event.origin === 'https://auth.example.com') {const { token } = event.data;localStorage.setItem('userToken', token);}
});

总结

单点登录的实现需要前端与认证中心紧密配合,主要包括以下步骤:

  1. 检查用户登录状态。
  2. 重定向到认证中心进行登录。
  3. 保存令牌并验证令牌的有效性。
  4. 处理跨域问题,确保令牌可以在多个系统之间共享。

相关文章:

前端单点登录

前端实现单点登录(SSO) 单点登录(Single Sign-On,简称 SSO)是一种认证机制,允许用户在多个系统之间只需登录一次,就可以访问所有相关系统,而不需要重复输入账号和密码。它的目标是提…...

Spring AI 介绍

Python一直是AI领域的主要语言, 主要原因是因其语法简洁易学、拥有丰富且强大的AI专用库及框架、具备跨平台兼容性且社区生态活跃,能高效支撑AI算法开发、数据处理及模型部署。 Spring开发了AI开发的框架Spring AI,对于Java的开发者来说,也可以快速入手AI相关的开发了。 S…...

onlyoffice 源码 调试说明 -ARM和x86双模式安装支持

很多用户在调试onlyoffice源码最大的问题是如何搭建环境,这个难度很高,下面提供一键安装的方式,让普通用户也能快速调试源码。 OnlyOffice Document Server 基于源码运行的容器调试模式,凭借 Docker 容器化技术的核心优势,为开发者提供了跨平台、高兼容性…...

EXCEL在一列数据前统一添加负号

1.全选数据列 2.右键,设置单元格格式。输入-0,要保留三位小数就输入-0.000. 3.添加完成效果。...

从零开始打造个人主页:HTML/CSS/JS实战教程

本教程分为环境搭建、HTML 结构编写、CSS 样式布局、JavaScript 交互实现、部署上线等五大部分,覆盖从基础到进阶的核心知识点,并结合示例代码与最佳实践,帮助你快速上手并掌握前端开发基本技能。 介绍 个人主页是展示自我、分享作品的重要…...

UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview---33.2.6 Strings

33.2.6 Strings UEFI 环境中的 string 是使用 UCS-2 格式定义,每个字符由 16bit 数据表示。对于用户界面,strings 也是一种可以安装到 HIIdatabase 的一种数据。 为了本土化,每个 string 通过一个唯一标识符来识别,而每一个标识…...

高等数学基础(牛顿/莱布尼茨公式)

牛顿/莱布尼茨公式主要是为定积分的计算提供了高效的方法, 其主要含义在于求积分的函数( f ( x ) f(x) f(x))连续时候总是存在一条积分面积的函数( F ( x ) F(x) F(x))与之对应, 牛顿莱布尼茨公式吧微分和积分联系了起来, 提供了这种高效计算积分面积的方法 参考视频理解: http…...

Node.js路径处理指南:如何安全获取当前脚本目录路径

本文适用于 Node.js 14.x及以上版本,同时覆盖 CommonJS 和 ES Modules 模块系统 文章目录 一、为什么需要关注路径问题?二、三种核心方法详解方法1:经典方案 __dirname (CommonJS)方法2:ES Modules 解决方案方法3:动态…...

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试

RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试 **背景与目标** 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】二.操作步骤2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)2.1.1 创建容器2.1.2 安装依赖2.1.3 下载推…...

2025年渗透测试面试题总结-华顺信安[实习]安全服务工程师(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 华顺信安[实习]安全服务工程师 1. 自我介绍 2. 红蓝队经验 3. Shiro漏洞知识体系 4. APP渗透测试方法…...

按键精灵ios/安卓辅助工具高级函数OcrEx文字识别(增强版)脚本开发介绍

函数名称 OcrEx文字识别(增强版) 函数功能 返回指定区域内所有识别到的字符串、左上角坐标、区域宽高、可信度,无需自制字库,识别范围越小,效率越高,结果越准确 注意:安卓版按键APP需在设置…...

Unity3D HUD UI性能优化方案

前言 在Unity3D中实现高性能的HUD UI需要综合考虑渲染效率、CPU开销和内存管理。以下是分步的优化方案: 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 1. 降低Draw Call:合批与图集 …...

掌握Git:版本控制与高效协作指南

一、初始Git 提出问题:无论是在工作还是学习,我们在编写各种文档的时候,更改失误,失误后恢复到原来版本,不得不复制出一个副本。 每个版本由各自的内容,但最终只有一个报告需要被我们使用。 但在此之前的…...

VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae

1、前言 大杂烩~每次开发一行代码,各个AI争先恐后抢着提供帮助 备注:四款插件都需要先去官网注册账号,安装好之后有个账号验证。 2、插件详解 2.1、AI分析的答案 GitHub Copilot 定位:老牌 AI 代码补全工具,深度集成…...

交叉熵损失函数,KL散度, Focal loss

目录 交叉熵损失函数(Cross-Entropy Loss) 二分类交叉熵 多分类交叉熵 KL散度(Kullback-Leibler Divergence) 交叉熵损失函数和KL散度总结 Focal loss Focal loss 和 交叉熵损失函数 的区别 交叉熵损失函数(Cross-Entropy…...

php、laravel框架下如何将一个png图片转化为jpg格式

要在 PHP 的 Laravel 框架下将 PNG 图片转化为 JPG 格式,可以使用两种方法:内置的 GD 库或第三方包 Intervention/image。 方法 1:使用 GD 库 GD 库是 PHP 内置的图像处理工具,无需额外安装即可使用。 实现步骤: 使…...

足式机器人经典控制常用的ROS库介绍

一. 核心工具 & 功能 1. ros-noetic-rosbash 作用: 提供与 ROS 相关的 Shell 命令(如 roscd, rosls, roscp 等),用于快速操作 ROS 包、节点和文件。 典型场景: 快速在终端中切换 ROS 工作空间、查看或复制 ROS 包内的文件。 2. ros-noet…...

在tp6模版中加减法

实际项目中,我们经常需要标签变量加减运算的操作。但是,在ThinkPHP中,并不支持模板变量直接运算的操作。幸运的是,它提供了自定义函数的方法,我们可以利用自定义函数解决:ThinkPHP模板自定义函数语法如下&a…...

【Part 3 Unity VR眼镜端播放器开发与优化】第一节|基于Unity的360°全景视频播放实现方案

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化,以及高分辨率视频性能优化等实战技巧。 📝 希望通过这个专栏&am…...

Python打卡DAY30

知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) # 直接导入 from random import randint print(randint(1, 10)) # 导入自定义库 import modu…...

IDEA连接github(上传项目)

【前提:菜鸟学习的记录过程,如果有不足之处,还请各位大佬大神们指教(感谢)】 1.先配置好git环境。 没配置的小伙伴可以看上一篇文章教程。 安装git,2.49.0版本-CSDN博客 2.在idea设置git 打开IDEA设置-…...

重构研发效能:项目管理引领软件工厂迈向智能化

1.项目管理智能化,激活软件工厂新引擎 在高速发展的软件开发时代,企业如何高效管理多个项目、协调团队合作、优化资源配置,已成为推动技术进步的关键。尤其是在多任务、多项目并行的复杂环境下,智能项目组合管理工具正成为软件工…...

基于 STM32 单片机的实验室多参数安全监测系统设计与实现

一、系统总体设计 本系统以 STM32F103C8T6 单片机为核心,集成温湿度监测、烟雾检测、气体泄漏报警、人体移动监测等功能模块,通过 OLED 显示屏实时显示数据,并支持 Wi-Fi 远程传输。系统可对实验室异常环境参数(如高温、烟雾、燃气泄漏)及非法入侵实时报警,保障实验室安…...

Vue3 中使用 provide/inject 实现跨层级组件传值失败的原因及解决方案

1、基础用法 父组件&#xff1a; <script setup> import { ref, provide } from vue; import ChildComponent from ./ChildComponent.vue; const parentData ref(初始数据); // 提供数据 provide(parentData, parentData); </script>子组件&#xff1a; <sc…...

小白的进阶之路系列之二----人工智能从初步到精通pytorch中分类神经网络问题详解

什么是分类问题? 分类问题涉及到预测某物是一种还是另一种。 例如,你可能想要: 问题类型具体内容例子二元分类目标可以是两个选项之一,例如yes或no根据健康参数预测某人是否患有心脏病。多类分类目标可以是两个以上选项之一判断一张照片是食物、人还是狗。多标签分类目标…...

Semaphore解决高并发场景下的有限资源的并发访问问题

在高并发编程的领域中&#xff0c;我们常常面临着对有限资源的激烈抢夺问题。而 Java 的 java.util.concurrent 包提供的 Semaphore &#xff0c;为我们提供了精准控制对有限资源并发访问的强大能力。 一、Semaphore&#xff1f; Semaphore&#xff0c;直译为 “信号量”&#…...

Vue3——Pinia

目录 什么是 Pinia&#xff1f; 为什么选择 Pinia&#xff1f; 基本使用 安装pinia 配置pinia 定义store 使用 持久化插件 什么是 Pinia&#xff1f; Pinia 是一个轻量级的状态管理库&#xff0c;专为 Vue 3 设计。它提供了类似 Vuex 的功能&#xff0c;但 API 更加简…...

02 基本介绍及Pod基础排错

01 yaml文件里的字段错误 # 多打了一个i导致的报错 [rootmaster01 yaml]# cat 01-pod.yaml apiVersion: v1 kind: Pod metadata:name: likexy spec:contaiiners:- name: aaaimage: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 [rootmaster01 yaml]# kubectl …...

Android Edge-to-Edge

Android Edge-to-Edge显示&#xff1a;开发者综合指南 一、什么是Android Edge-to-Edge ​ Android Edge-to-Edge是一种先进的用户界面&#xff08;UI&#xff09;设计理念&#xff0c;旨在最大化利用设备的显示区域。它允许应用程序的内容延伸至屏幕的各个边缘&#xff0c;包…...

⼆叉搜索树详解

1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结…...