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

前端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);
}

相关文章:

前端react集成OIDC

文章目录 OpenID Connect (OIDC)3种 授权模式 【服务端】express 集成OIDC【前端】react 集成OIDCoidc-client-js库 原生集成react-oidc-context 库非组件获取user信息 OAuth 2.0 协议主要用于资源授权。 OpenID Connect (OIDC) https://openid.net/specs/openid-connect-core…...

JavaWeb—XML_Tomcat10_HTTP

一、XML XML是EXtensible MarkupLanguage的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签。 可扩展:三个字表面上的意思是XML允许自定义格式。但这不代表你可以随便写; 在XML基…...

中介者模式在Java中的实现:设计模式精解

中介者模式在Java中的实现&#xff1a;设计模式精解 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于定义一个中介者对象&#xff0c;以封装一系列对象之间的交互&#xff0c;从而使对象之间的交互不再直接发生&#xff0c;减少了系…...

PyQt编程快速上手

Python GUI安装 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;使得自己的程序看上去更加高大上&#xff0c;学会GUI编程可以使得自己的软件有可视化的结果。 如果你想用Python快速制作界面&#xff0c;可以安装PyQt&#xff1a…...

Docker Swarm管理

Docker Swarm管理 前置知识点 Docker Swarm 是 Docker 公司 2014年出品的基于 Docker 的集群管理调度工具&#xff0c;能够将多台主机构建成一个Docker集群&#xff0c;并结合Overlay网络实现容器调度的互访 用户可以只通过 Swarm API 来管理多个主机上的 Docker Swarm 群集包…...

Python | Leetcode Python题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; class Solution:def isSelfCrossing(self, distance: List[int]) -> bool:n len(distance)# 处理第 1 种情况i 0while i < n and (i < 2 or distance[i] > distance[i - 2]):i 1if i n:return False# 处理第 j 次移动的情况…...

Ubuntu视频工具

1. VLC VLC Media Player&#xff08;VLC多媒体播放器&#xff09;&#xff0c;最初命名为VideoLAN客户端&#xff0c;是VideoLAN品牌产品&#xff0c;是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式&#xff0c;并支持DVD影音光盘&#xff0c;VCD影音光…...

HBase snapshot+replication 测试

一、背景 画像标签服务&#xff08;CDP&#xff09;是核心服务&#xff0c;被公司其他系统如现金、电商、风控等核心业务调用。异常的话&#xff0c;影响范围大。 二、目标 存量数据测试通过 snapshot 迁移。增量数据测试通过 replication 同步。 三、测试 方案二测试&#x…...

代码随想录算法训练营第四十一天|图论基础、深度优先搜索理论基础、98. 所有可达路径、797. 所有可能的路径

图论基础 图的种类&#xff1a;有向图 和 无向图&#xff0c;加权有向图&#xff0c; 加权无向图 无向图中有几条边连接该节点&#xff0c;该节点就有几度。 在有向图中&#xff0c;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xff1a;指向该节…...

STM32学习笔记09-SPI通信

目录 SPI通信简介 硬件电路 移位示意图 SPI基本时序单元 SPI时序 W25Q64简介 硬件电路 W25Q64框图 Flash操作注意事项 SPI外设简介 SPI框图 SPI基本结构 主模式全双工连续传输 非连续传输 软件/硬件波形对比 SPI应用 软件SPI读写W25Q64 硬件SPI读写W25Q64 SP…...

树------二叉树

什么是树&#xff1a; 树是一种特殊的结构&#xff0c;由多个节点连接构成&#xff0c;并且不包含回路&#xff0c;也可以认为树是不包含回路的无向连通图&#xff0c;具体如下图所示。 当我们要确定一棵树的形态时&#xff0c;要指定一个根节点&#xff0c;没有父亲节点的节点…...

如何对加密后的数据进行模糊查询(面试题)

目录 前言1. 基本知识2. 国内做法 前言 这道题在面试比较常见&#xff0c;但是在算法逻辑层面中&#xff0c;直接对加密数据进行模糊查询是不可行的&#xff0c;因为加密算法会使数据变成不可读的形式 需要在加密过程中采取特殊的策略来支持模糊查询 以下只是结合网上现有的资…...

【MYSQL】当前读和快照读

前言 复习下隔离级别&#xff1a; 1、读未提交&#xff1a;一个事务还没提交时&#xff0c;它做的变更就能被别的事务看到。 2、读提交&#xff1a;一个事务提交之后&#xff0c;它做的变更会被其他事务看到 3、可重复读&#xff1a;一个事务执行过程中看到的数据&#xff0c;…...

C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。

1.题目要求&#xff1a; 将一个5X5的矩阵中最大的元素放在中心&#xff0c;四个角分别放四个最小的元素&#xff08;顺序为从左到右&#xff0c;从上到下&#xff0c;从小到大存放&#xff09;&#xff0c;写一函数实现之。 2.数组法实现 #define _CRT_SECURE_NO_WARNINGS 1…...

Android gradle 构建

Understanding Tasks - Gradle task kapt 是 Kotlin 语言的注解处理器&#xff0c;它是 Android Studio 中用于处理 Kotlin 注解的工具。它通过在编译期间生成代码来增强 Kotlin 代码的功能。需要 Kotlin 编译器来解析和处理注解&#xff1b;使用 APT 来生成代码&#xff0c…...

vulnhub系列:devguru

vulnhub系列&#xff1a;devguru 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描端口&#xff0c;开放端口&#xff1a;22、80、8585 nmap 192.168.23.147 -p- -sV -Pn -O访问80端口 dirb目录扫描&#xff0c;存在 git 源…...

Robot Operating System——高质量图像传输

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::Image 是 ROS (Robot Operating System) 中的一个消息类型&#xff0c;用于表示未压缩的图像数据。它通常用于传输和处理高质量的图像数据。 应用场景 机器人视觉 图像处理&#xff1a;在机器人视觉系统中&#xff0c;未压缩…...

NLP_情感分类_预训练加微调方案

文章目录 项目背景代码导包一些模型以及训练的参数设置定义dataset定义模型读取数据声明训练及测试数据集将定义模型实例化打印模型结构模型训练测试集效果 同类型项目 项目背景 项目的目的&#xff0c;是为了对情感评论数据集进行预测打标。在训练之前&#xff0c;需要对数据…...

全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典

全网最适合入门的面向对象编程教程&#xff1a;36 Python 的内置数据类型-字典 摘要&#xff1a; 字典是非常好用的容器&#xff0c;它可以用来直接将一个对象映射到另一个对象。一个拥有属性的空对象在某种程度上说就是一个字典&#xff0c;属性名映射到属性值。在内部&#…...

DataWind看板绘制案例

摘要​: 1. 在不清楚DataWind看板怎么画的情况,可以先把表格给实现了,然后找几个有价值的数据进行看板实现 2. 还是不知道怎么画的情况,就去模仿其他人的案例; 3. 多看看DataWind提供的函数用法,就可以把表达式的使用运用起来了;​ 飞书官方文档:https://www.volcen…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...