前端react集成OIDC

文章目录

    • OpenID Connect (OIDC)
      • 3种 授权模式
    • 【服务端】express 集成OIDC
    • 【前端】react 集成OIDC
      • oidc-client-js库 原生集成
      • react-oidc-context 库
        • 非组件获取user信息

OAuth 2.0 协议主要用于资源授权。

OpenID Connect (OIDC)

https://openid.net/specs/openid-connect-core-1_0.html

开放身份连接,是基于 OAuth 2.0协议的一个扩展。通过扩展身份层,来实现去中心化的身份验证服务。
它允许客户端验证用户身份,并获取一些基本用户信息。

使用 OIDC,应用程序可以简化身份验证和授权流程
实现单点登录或先鉴权用户再返回资源

  • 主要包括以下角色:
    OpenID Provider(OP): 指授权服务器,负责签发 Id Token。Authing 是 OpenID Provider。
    End User(EU):资源所有者,即用户;
    ID Token:包含 EU 身份认证信息的 JWT 格式数据,是用户的身份凭证;

  • 主要特点包括:
    身份验证: OIDC 允许客户端应用程序验证用户的身份,确保只有授权的用户才能访问应用程序。
    用户信息: OIDC 提供了一种标准化的方式来获取有关已验证用户的基本信息,如用户名、电子邮件地址等。
    单点登录 (SSO): OIDC 支持单点登录,使用户只需登录一次就可以访问多个应用程序。
    安全性: OIDC 建立在 OAuth 2.0 的安全基础之上,提供了更强的安全性和隐私保护。

3种 授权模式

  1. 授权码流程
    1 前端登录,
    2 后端返回授权码(密钥),【前端需要安全存储密钥】
    3 授权码换token,ID Token、Access Token,【可以反复刷新token】
    4 前端保存并携带Token
    在这里插入图片描述
  2. 隐式流程
    1 前端登录,
    2 后端返回token,ID Token、Access Token,
    3 前端保存并携带Token
    在这里插入图片描述
    适用于 浏览器前端 无法安全存储密钥
  3. 混合流程

【服务端】express 集成OIDC

express-openid-connect 库

  • 应用配置
const { auth } = require('express-openid-connect');const app = express();app.use(auth({issuerBaseURL: 'OIDC url',baseURL: '授权登录成功后回调 url',clientID: 'AUTH_CLIENT_ID',secret: 'AUTH_CLIENT_SECRET',idpLogout: true,session: {store: redisStore,name: '',cookie: {domain: process.env.COOKIE_DOMAIN,},},}));
  • requiresAuth() 对指定接口进行 身份验证
var router = require('express').Router();
const { requiresAuth } = require('express-openid-connect');app.get('/profile', requiresAuth(), (req, res) => {res.send(`hello ${req.oidc.user.name}`);
});

【前端】react 集成OIDC

oidc-client-js库 原生集成

  • 安装 oidc-client-js / oidc-client-ts
npm install oidc-client-js
  • 初始化 OIDC 客户端实例
import { UserManager, WebStorageStateStore } from 'oidc-client-js';// 配置 userManager
const userManager = new UserManager({authority: 'OIDC 提供商的 URL',client_id: ' OIDC 提供商处注册的唯一 client_id',redirect_uri: 'OIDC 认证后回调url',// 认证信息存储到 localStorageuserStore: new WebStorageStateStore({ store: window.localStorage })
});function Root() {const [pageLoaded, setLoaded] = useState(false);// 在应用程序启动时初始化 OIDC 客户端useEffect(() => {userManager.getUser().then((user) => {if (user && !user.expired) {// 如果已经登录,将 user 对象存储在组件状态中setUser(user);} else {// OIDC 登录userManager.signinRedirect();}setLoaded(true);});}, []);
  • 使用 OIDC 认证的 token
import { userManager } from './oidc-config';async function fetchData() {const user = await userManager.getUser();if (user && !user.expired) {// 如果已登录,在请求头中附带 access_tokenconst response = await axios.get('/api/data', {headers: {'Authorization': `Bearer ${user.access_token}`}}}
}

react-oidc-context 库

react-oidc-context封装了oidc-client-ts,使用更简单

  • AuthProvider 集成 OIDC
import { AuthProvider } from 'react-oidc-context';
import { WebStorageStateStore } from 'oidc-client-ts';const oidcConfig = {authority: 'OIDC 提供商的 URL',client_id: ' OIDC 提供商处注册的唯一 client_id',redirect_uri: 'OIDC 认证后回调url',client_secret: 'client 密钥',automaticSilentRenew: true,loadUserInfo: true,// 认证信息存储到 localStorageuserStore: new WebStorageStateStore({store: localStorage,}),onSigninCallback: (): void => {window.history.replaceState({}, document.title, window.location.pathname);},
};function Root() {const [pageLoaded, setLoaded] = useState(false);return (<React.StrictMode>{!pageLoaded ? <PageLoadingSpinner /> : null}<!-- 在外层使用 AuthProvider 集成OIDC --><AuthProvider {...oidcConfig}><RouterProvider router={routes(setLoaded)} /></AuthProvider></React.StrictMode>);
}ReactDOM.createRoot(document.getElementById('root')!).render(<Root />);
  • 登录逻辑
  const auth = useAuth();useEffect(() => {if (!hasAuthParams() &&!auth.isAuthenticated &&!auth.activeNavigator &&!auth.isLoading) {// OIDC 登录auth.signinRedirect();}}, [auth]);// 登录成功后跳转 pageif (auth.isAuthenticated) {return <>{props.children}</>;}// 登录报错处理if (auth.error) {console.log(auth.error);}

对应的http请求

- 跳转到登录页
{{authority}}/.well-known/openid-configuration
- 获取token
{{authority}}/protocol/openid-connect/token
- 获取user info
{{authority}}/protocol/openid-connect/userinfo
  • 组件Component 内获取登录信息
    组件内可以使用 const auth = useAuth(); 获取auth对象,然后得到user
const auth = useAuth();
const token = auth.user?.access_token;
非组件获取user信息

非组件不能使用hook,只能从userStore配置中获取 user信息

import { User } from 'oidc-client-ts';function getUser() {// 之前把信息存储在了localStorage,就从localStorage获取const oidcStorage = localStorage.getItem(`oidc.user:${AUTH_URL}:${AUTH_CLIENT_ID}`);if (!oidcStorage) {return null;}return User.fromStorageString(oidcStorage);
}

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

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

相关文章

【案例44】Oracle启用“_optimizer_skip_scan_enabled” 参数导致NC系统卡死问题

问题现象 客户反映系统卡顿&#xff0c;很多操作耗时都比较长&#xff0c;通过nmc监控&#xff0c;线程耗时主要集中在数据库上。 问题分析 首先监控数据库服务器资源使用情况&#xff0c;CPU、内存使用正常&#xff0c;没有达到峰值。 监控磁盘IO情况&#xff0c;发现磁盘最…

WPF篇(11)-ToolTip控件(提示工具)+Popup弹出窗口

ToolTip控件 ToolTip控件继承于ContentControl&#xff0c;它不能有逻辑或视觉父级&#xff0c;意思是说它不能以控件的形式实例化&#xff0c;它必须依附于某个控件。因为它的功能被设计成提示信息&#xff0c;当鼠标移动到某个控件上方时&#xff0c;悬停一会儿&#xff0c;…

【C++ 面试 - 基础题】每日 3 题(十一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题&#xff0c;极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 作为一个喜欢折腾的数码党&#xff0c;我平时上网冲浪使用的浏览器绝不会只限于一种&#xff0c;就比如说我在上班的地方只会用到Edge浏…

安科瑞Acrel-2000ES储能能量管理系统在新型电力系统下分布式储能的研究

摘要&#xff1a;传统电力系统的结构和运行模式在以新能源为主体的新型电力系统中发生了巨大的变化&#xff0c;分布式储能作为电力系统中重要的能量调节器&#xff0c;也迎来了新的发展机遇。立足于储能技术发展现状&#xff0c;分析了分布式储能技术特点及在清洁可再生能源方…

priority_queue的介绍 仿函数

1.priority_queue的介绍 1.优先队列是⼀种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第⼀个元素总是它所包含的元素中最⼤的。 2.此上下⽂类似于堆&#xff0c;在堆中可以随时插⼊元素&#xff0c;并且只能检索最⼤堆元素&#xff08;优先队列中位于顶部的元…

接口自动化--Postman(1)

Postman介绍 介绍&#xff1a;Postman是一款接口调试工具特点&#xff1a;支持Mac、Windows和Linux下载&#xff1a;Postman官网下载 【黑马客达天下-登录接口调试】 1、获取验证码 需求&#xff1a;使用Postman访问验证码接口&#xff0c;并查看响应结果地址&#xff1a;h…

北斗三号5G遥测终端机系统在水库大坝安全监测应用

一、概述 我国现有水库大坝9.8万余座&#xff0c;是世界上拥有水库大坝最多的国家。这些水库大坝在防洪、发电、供水、灌溉等方面发挥巨大效益的同时&#xff0c;所存在的安全风险不容忽视。大坝安全监测是大坝安全管理的重要内容&#xff0c;是控制大坝风险的重要措施。大坝安…

Spring入门讲解

这里写目录标题 Spring基础概念关键重点主要特性主要优势Spring与Java EE的对比Spring生态系统概述总结 Spring 基础概念 Spring是一个开源的轻量级Java开发框架&#xff0c;它提供了全面的基础设施支持&#xff0c;简化了企业级应用的开发和部署。Spring的核心理念是依赖注入…

Stable Diffusion 必备插件推荐,菜鸟轻松成高手!

前言 一个刚学AI绘画的小菜鸟如何快速成为Stable Diffusion高手&#xff1f;答案就是SD插件。 只要学会使用SD的各种插件&#xff0c;帮你写正向和负向提示词&#xff0c;修复人脸/身体/手指&#xff0c;高清放大图片&#xff0c;指定人物pose&#xff0c;图片微调等等都可以…

合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别

合合信息TextIn平台明星产品——国内通用票据识别&#xff0c;重磅更新&#xff01; 产品支持票据类型扩展到23大类、30小类&#xff0c;覆盖场景更全面&#xff0c;同时升级优化了多款票据识别模型&#xff0c;平均识别率较前版本提升11.5%&#xff0c;整体识别速度提升21.9%…

手写mybatis拦截器自动填充数据

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.将sun-club-subject模块的登录拦截器放到sun-club-common包中…

Prometheus+Grafana保姆笔记(1)——Prometheus+Grafana的安装

Prometheus Grafana 的组合在微服务项目中可以完成许多DevOps任务&#xff0c;它们共同提供了强大的监控和可视化功能。 我们陆续介绍Prometheus Grafana 的相关用法。 首先介绍PrometheusGrafana的安装。 安装 Prometheus Prometheus 是GO写的&#xff0c;并不依赖于 Ja…

HIT CSAPP——程序人生-Hello’s P2P

本文链接&#xff1a;https://blog.csdn.net/QingFeng_0813/article/details/139468749?spm1001.2014.3001.5502 计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 医学与健康学院 学   号 2022110762 班 级 2252003 …

(回溯) LeetCode 47. 全排列||

原题链接 建议先练习&#xff1a;全排列| 一. 题目描述 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&a…

Java流程控制01:用户交互Scanner

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p33&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p33&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Scanner 类用于扫描输入文本从字符串中提…

Bug 解决 | 组件库报错、或样式丢失不生效

目录 一、前言 二、版本问题 1、使用 VantUI 的 toast 组件报错&#xff1f; 2、引入 VantUI 组件库后&#xff0c;toast 组件样式丢失了&#xff1f; 3、使用 Ant Design Vue 组件库&#xff0c;启动后显示 antd.css 不存在&#xff1f; 4、Vant UI 组件库引入的 tabs 组…

数据中心安全建设整体解决方案(DOC原件22页)

数据中心的安全体系建设并非安全产品的堆砌&#xff0c;它是一个根据用户具体业务环境、使用习惯、安全策略要求等多个方面构建的一套生态体系&#xff0c;涉及众多的安全技术&#xff0c;实施过程需要涉及大量的调研、咨询等工作&#xff0c;还会涉及到众多的安全厂家之间的协…

LangChain 推出 LangGraph Studio:首款用于可视化、交互和调试复杂代理应用的代理 IDE

嘿&#xff0c;听说了吗&#xff1f;Langchain最近发布了一项重大更新&#xff0c;他们推出了官方Agent IDE&#xff0c;并且免费开放了LangGraph平台。这对于AI开发者来说是个好消息&#xff0c;意味着我们现在有了更强大的工具来构建智能应用。 今天&#xff0c;我们就来分享…

编译自定义Linux内核,使WSL支持访问Windows下USB设备

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ WSL 本身并不支持连接 USB 设备&#xff0c;因此你需要安装开源 usbipd-win 项目。 usbip 可以让你在网络上共享和使用 USB 设备。它由两个主要组件组成&…