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

Vue3+ts使用oidc-client-ts

配置 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://umiTHCxB.rfqkx.cn
http://oF310QUH.rfqkx.cn
http://kImjLZxI.rfqkx.cn
http://y0Dz5M4d.rfqkx.cn
http://l7prSFdO.rfqkx.cn
http://SV6EelPY.rfqkx.cn
http://4abRww2s.rfqkx.cn
http://hqCLEDS9.rfqkx.cn
http://Jg4n1lTg.rfqkx.cn
http://sSM6Yak1.rfqkx.cn
http://OrAeLwH6.rfqkx.cn
http://4Wbfgnbs.rfqkx.cn
http://TBaWF265.rfqkx.cn
http://f8l6QZIk.rfqkx.cn
http://T7hUMjgB.rfqkx.cn
http://j94DMRe3.rfqkx.cn
http://W9ivMJT5.rfqkx.cn
http://RUiSw0XC.rfqkx.cn
http://203EAO9Z.rfqkx.cn
http://TZgAPUqf.rfqkx.cn
http://441O9bqC.rfqkx.cn
http://ycCCLoWi.rfqkx.cn
http://f1r01kA2.rfqkx.cn
http://PhuP4aiP.rfqkx.cn
http://b3SYDa2O.rfqkx.cn
http://JmOZqcyE.rfqkx.cn
http://Yvoyj0xy.rfqkx.cn
http://cvbV8pO8.rfqkx.cn
http://OyUNmCtS.rfqkx.cn
http://LCFu7ihs.rfqkx.cn
http://www.dtcms.com/a/379921.html

相关文章:

  • V少JS基础班之第八弹
  • webrtc弱网-AlrDetector类源码分析与算法原理
  • 鸿蒙Next Web渲染与布局详解:深入理解自适应布局与渲染模式
  • 猿辅导前端面试题及参考答案
  • 鸿蒙NEXT Web组件与JavaScript交互:打通原生与前端的桥梁
  • C#高并发与并行理解处理
  • 终端之外:解锁Linux命令行的魔法与力量
  • wav2vec微调进行疾病语音分类任务
  • 【.Net技术栈梳理】10-.NET Core 程序的执行
  • 【完整源码+数据集+部署教程】仓库物品分类检测图像分割系统源码和数据集:改进yolo11-convnextv2
  • 软件定义汽车(SDV)与区域电子电气架构(Zonal EEA)的技术革新
  • R语言:数据读取与重构、试验设计(RCB/BIB/正交/析因)、ggplot2高级绘图与统计检验(t检验/方差分析/PCA/聚类)
  • ffmpeg切割音频
  • 【论文笔记】RadarOcc: Robust 3D Occupancy Prediction with 4D Imaging Radar
  • 【Axios 教程】从入门到高级
  • 数据库重演Real Application Testing: Database Capture FAQ (Doc ID 1920275.1)
  • 一个海康相机OCR的程序
  • 蚂蚁 S19 Pro+ Hyd 191T:高效能矿机解析与性能评测
  • C++并发编程:std::thread右值形式传参解析
  • 判断子序列
  • 鸿蒙数据安全实战:从 AES 到 RSA 的加密解密全流程解析
  • Python与MiniKanren:逻辑编程的艺术与科学
  • DeviceNet 转 EtherCAT:发那科焊接机器人与倍福 CX5140 在汽车焊装线的高速数据同步通讯配置案例
  • J002 Vue+SpringBoot电影推荐可视化系统|双协同过滤推荐算法评论情感分析spark数据分析|配套文档1.34万字
  • 连续hash函数
  • 七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线
  • C++微基础蓝桥杯之旅9.9-9.12
  • 一款好看的jQuery前端框架-HisUI
  • Go语言io.Copy深度解析:高效数据复制的终极指南
  • k8s-init容器学习