配置 OIDC 客户端

在项目中创建 authOptions 对象,定义 OIDC 认证所需的配置项:

export const authOptions = {authority: 'https://xxxxxxxxx/UserCenter', // 认证服务器 URLclient_id: 'xxxx', // 客户端 IDredirect_uri: 'http://localhost:3000/callback', // 登录回调地址response_type: 'code', // 授权类型scope: 'IF.DataMaster.Writer IF.DataMaster.Reader IF.DataMaster.Modeler IF.DataMaster.Web', // 权限范围post_logout_redirect_uri: 'https://localhost:3000/', // 登出后重定向地址client_secret: 'xxxxxxxxxxx', // 客户端密钥
};

创建 OIDC 用户管理器

封装 UserManager 实例,管理用户认证状态:

import { OidcClientSettings, UserManager } from 'oidc-client-ts';const userManager = ref<UserManager>();
const oidcSettings = ref<OidcClientSettings>();export async function useUserManager(): Promise<UserManager | undefined> {if (userManager.value) {return userManager.value;}const settings = authOptions;if (settings) {oidcSettings.value = settings;userManager.value = new UserManager(settings);return userManager.value;}return undefined;
}

登录逻辑

调用 signinRedirect 发起 OIDC 登录:

export async function signinlogin() {useUserManager().then((mgr) => {if (mgr) {mgr.signinRedirect();}});
}

处理登录回调

在回调页面解析用户信息并获取 Token:

async function signinCallback() {try {const mgr = await useUserManager();if (!mgr) return null;await mgr.signinCallback();const user = await mgr.getUser();const jwt_token = user?.access_token;if (!jwt_token) return null;const cc_token = await getTokenByJWTString(jwt_token);if (cc_token.startsWith('err@')) {message.error('OIDC 登录失败');return null;}return cc_token;} catch (error) {return Promise.reject(error);}
}

路由守卫集成

在路由守卫中检查 Token,未登录时触发 OIDC 登录:

export function createPermissionGuard(router: Router) {const userStore = useUserStoreWithOut();router.beforeEach(async (to, from, next) => {const token = userStore.getToken;if (!token && !to.meta.ignoreAuth) {signinlogin(); // 触发 OIDC 登录return;}next();});
}

Hash 路由兼容处理

若使用 Hash 路由,需在回调后清理 URL:

function createRedirectPageGuard(router: Router) {const userStore = useUserStore();router.beforeEach(async (to, _from, next) => {if (window.location.href.includes('/callback?')) {const token = await userStore.signinCallback();userStore.setToken(token as string);const { origin, pathname } = window.location;window.location.href = origin + pathname; // 清理回调参数return;}next();});
}

关键点说明

  • authority:OIDC 认证服务器地址。
  • client_idclient_secret:需与认证服务器配置一致。
  • signinCallback:必须在回调页面调用以完成登录流程。
  • Hash 路由:需手动清理 # 后的回调参数,避免路由冲突。

通过上述步骤,可实现基于 oidc-client-ts 的单点登录集成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96981.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96981.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96981.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 “数据中转站“ 到 “边缘智能中枢“:区域网关的技术突围与开发范式重构

在物联网架构中,区域网关长期被视为 "边缘与云端的桥梁"—— 负责协议转换、数据转发、设备接入等基础功能。但随着边缘计算兴起与 AI 模型轻量化,区域网关正经历从 "被动转发" 到 "主动决策" 的范式跃迁。 本文将从开发视角拆解区域网关的三大…

Django全栈班v1.04 Python基础语法 20250913 早上

print 函数基本用法 print函数会自加换行符&#xff0c;一个print&#xff0c;会打印一行输出。 print("第一行") print("第二行") print("第三行")输出结果&#xff1a;print 输出多个值 一个print可以同时输出多个值&#xff0c;这多个值会在一…

面试鸭Java八股之Kafka

Kafka是什么&#xff1f;它的主要应用场景有哪些? Kafka是一种分布式流事件处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;现在是 Apache 基金会的一部分。它的核心功能主要包括消息队列、流处理和数据集成。Kafka以高吞吐量、低延迟、可扩展和高容错性著称。 Kafka…

ARM32平台Bus Error深度排查:从调用栈到硬件原理的完整拆解

ARM32平台Bus Error深度排查&#xff1a;从调用栈到硬件原理的完整拆解 在嵌入式开发中&#xff0c;Bus Error&#xff08;信号7&#xff09;是个容易让人头疼的问题——它不像SIGSEGV&#xff08;段错误&#xff09;那样直观&#xff0c;常与硬件内存布局、指针破坏等底层问题…

适合工业用的笔记本电脑

在工业领域&#xff0c;生产环境往往复杂多变&#xff0c;从高温、高湿的车间&#xff0c;到布满粉尘的矿山&#xff0c;再到震动频繁的施工现场&#xff0c;普通的笔记本电脑很难在这样的环境中稳定运行&#xff0c;而工业用笔记本电脑的诞生&#xff0c;完美地解决了这一难题…

在LINUX中常见的文件系统类型

常见文件系统类型对比表文件系统类型作用和特点主要使用场景优缺点ext4Linux标准文件系统&#xff0c;日志式&#xff0c;支持大文件和分区Linux根文件系统、/home、/var等主要分区优点&#xff1a;稳定成熟&#xff0c;支持大文件(16TB)&#xff0c;日志功能保证数据安全&…

Unity核心概念⑥:Time

一、Time的主要用途主要用于游戏中参与位移、记时、时间暂停等。二、时间缩放比例1.时间停止&#xff1a;Time.timeScale 0;2.回复正常&#xff1a;Time.timeScale 1;3.二倍速&#xff1a;Time.timeScale 2;三、帧间隔时间帧间隔时间是指最近的一帧用了多少时间。1.用途主要…

Node.js 模块化规范详解

在 Node.js 中&#xff0c;模块化是开发应用程序的核心概念&#xff0c;它使得代码可以按照功能模块进行分割&#xff0c;易于维护、复用和扩展。Node.js 支持两种模块化规范&#xff1a;CommonJS&#xff08;CJS&#xff09;&#xff1a;这是 Node.js 最初使用的模块化规范。E…

前端网络性能优化实践:从 HTTP 请求到 HTTPS 与 HTTP/2 升级

在前端性能优化体系中&#xff0c;服务端与网络层的优化是提升用户体验的关键环节。本文将围绕 HTTP 请求优化、Cookie 管理、服务器缓存配置、gzip 压缩、HTTPS 部署及 HTTP/2 升级等核心内容&#xff0c;系统拆解优化策略与实施方法&#xff0c;为团队技术分享提供完整的知识…

[数据结构——lesson8.树]

目录 引言 学习目标 1.树的概念及结构 1.1树的定义 1.2树的基本概念 1.3 树的表示 (1)双亲表示法 (2)孩子表示法 (3)左孩子右兄弟表示法 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 结束语&#xff1a; 引言 之前我们学习了栈和队列数…

告别双系统——WSL2+UBUNTU在WIN上畅游LINUX

在Windows 11上配置WSL开发环境指南 最近换工作需要深入研究代码&#xff0c;发现WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软为Windows开发者提供的强大工具&#xff0c;可以在Windows上直接运行Ubuntu子系统&#xff0c;无需双系统或虚拟机&#xff08;满…

Python爬虫实战:研究Ticks and spines模块,构建电商数据采集和分析系统

1. 引言 1.1 研究背景 在信息时代,互联网数据呈现爆炸式增长,涵盖社会、经济、文化等多个领域,具有极高的研究与应用价值。如何高效获取目标数据并进行深度分析,成为信息处理领域的重要课题。Python 凭借其丰富的库支持和简洁的语法,在数据爬取与分析领域得到广泛应用:…

前端基础 —— B / CSS基础

一、CSS 基础概述定义&#xff1a;层叠样式表&#xff08;Cascading Style Sheets&#xff09;作用&#xff1a;美化页面、实现样式与结构分离二、CSS 基本语法与引入方式1. 语法规范选择器 {一条/N条声明}选择器决定针对谁修改 (找谁) 声明决定修改啥. (干啥)<style> p…

智能农机无人驾驶作业套圈路径规划

国产轻量级桌面GIS软件Snaplayers实践&#xff1a;智能农机无人驾驶作业套圈路径规划1、选择地块角点坐标文件2、加载地块到地图中3、设置套圈作业路径规划参数4、生成套圈作业路径5、查看套圈路径6、查看套圈路径8、完成本算法已经在国内外等农场已经使用多年。Snaplayers研发…

Java Collection集合框架:体系、核心与选型

目录 一、集合框架的顶层设计&#xff1a;接口与层次 1. 两大核心接口&#xff1a;Collection 和 Map 2. Collection接口的三大派系 二、核心实现类详解 1. List家族实现 2. Set家族实现 3. Queue/Deque家族实现 PriorityQueue&#xff1a; ArrayDeque&#xff1a; 三…

“计算机基础、软件工程、设计模式、数据结构算法、操作系统、数据库、网络、法律法规”是计算机领域从基础理论到工程实践

“计算机基础、软件工程、设计模式、数据结构算法、操作系统、数据库、网络、法律法规”是计算机领域从基础理论到工程实践、再到合规规范的核心知识体系&#xff0c;覆盖了软件开发、系统架构、技术合规等关键维度。以下将对每个领域进行系统拆解&#xff0c;包括核心内容、学…

利用Rancher平台搭建Swarm集群

一、Rancher概述1、rancher平台Rancher是一个开源的企业级容器管理平台&#xff0c;它可以帮助企业在生产环境中轻松快捷地部署和管理容器&#xff0c;也可以轻松管理各种环境的Kubernetes&#xff0c;并提供对DevOps的支持。Rancher目前已经具备全栈化一键部署应用、各种编排调…

Debezium日常分享系列之:MongoDB 新文档状态提取

Debezium日常分享系列之&#xff1a;MongoDB 新文档状态提取变更事件结构行为配置数组编码嵌套结构展平MongoDB $unset 处理确定原始操作添加元数据字段选择性应用转换的选项配置选项已知限制Debezium MongoDB 连接器会发出数据变更消息&#xff0c;以表示 MongoDB 集合中发生的…

OpenCV:图像透视变换

文章目录一、透视变换是什么&#xff1f;二、透视变换的核心原理1. 关键概念&#xff1a;透视变换矩阵2. 核心条件&#xff1a;4对对应点三、OpenCV实现透视变换的关键步骤步骤1&#xff1a;读取并预处理图像步骤2&#xff1a;寻找目标物体的4个顶点步骤3&#xff1a;计算透视变…

commons-csv

maven依赖<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.14.1</version></dependency…