前端react集成OIDC

news2024/11/15 17:21:27

文章目录

    • 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. 授权码流程
    前端登录,
    后端返回授权码(密钥),【前端需要安全存储密钥】
    授权码换ID Token、Access Token,【可以反复刷新token】
    前端保存并携带Token
    在这里插入图片描述
  2. 隐式流程
    前端登录,
    后端返回ID Token、Access Token,
    前端保存并携带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: 'bop.session',
        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',
  // 认证信息存储到 localStorage
  userStore: 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_token
     const response = await axios.get('/api/data', {
       headers: {
         'Authorization': `Bearer ${user.access_token}`
       }
    }
  }
}

react-oidc-context 库

封装了oidc-client-ts

const oidcConfig = {
  authority: 'OIDC 提供商的 URL',
  client_id: ' OIDC 提供商处注册的唯一 client_id',
  redirect_uri: 'OIDC 认证后回调url',
  client_secret: 'client 密钥',
  automaticSilentRenew: true,
  loadUserInfo: true,
  // 认证信息存储到 localStorage
  userStore: 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 {...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]);
  
  // 登录成功后跳转
  if (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
非组件获取user信息

组件内可以使用 const auth = useAuth(); 获取auth对象,然后得到user
非组件不能使用hook,只能从userStore配置中获取
user信息

import { User } from 'oidc-client-ts';

function getUser() {
  const oidcStorage = localStorage.getItem(
    `oidc.user:${AUTH_URL}:${AUTH_CLIENT_ID}`
  );
  if (!oidcStorage) {
    return null;
  }
  return User.fromStorageString(oidcStorage);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【安当产品应用案例100集】007-工业控制系统防勒索解决方案-安当RDM防勒索

《工业控制系统网络安全防护指南》是由工业和信息化部于2024年1月19日发布&#xff0c;旨在指导企业提升工业控制系统网络安全防护水平&#xff0c;确保新型工业化发展的安全根基。该指南适用于使用和运营工业控制系统的企业&#xff0c;包括但不限于可编程逻辑控制器&#xff…

【生成式人工智能-十-文字、图片、声音生成策略】

人工智能生成文字、图片、声音的方法 生成的本质生成的策略文字AR (Autoregressive Generation)图像和视频 NAR(Non-Autoregressive Generation)解决NAR生成品质低的问题 AR NAR 生成的本质 文字、图像、声音的生成的本质&#xff0c;就是给模型一个输入&#xff0c;模型把基…

大模型应用中的幻觉问题是什么?

大模型应用中的幻觉问题是什么&#xff1f; 在现代自然语言处理领域&#xff0c;大语言模型&#xff08;如GPT系列&#xff09;以其惊人的生成能力和语言理解能力被广泛应用。然而&#xff0c;随着这些模型的广泛使用&#xff0c;幻觉问题逐渐显现出其对实际应用的潜在影响。本…

怎样快速查询数家公司是否存在关联关系?

▶关联关系的查询是企业稳健运营和长期发展的关键环节 企业在关键时期需要查询数家公司是否存在关联关系&#xff0c;以确保合规性和透明度。这通常发生在年度审计、税务申报、并购活动、上市准备、风险评估和法律诉讼时。监管合规性检查、内部控制加强、市场策略制定、资金管…

加速区域市场扩张,ATFX任命Amer Zino为中东和北非业务发展总监

全球领先的差价合约经纪商ATFX再度向世界展示了其吸纳行业顶尖复合型人才的决心和能力。日前&#xff0c;ATFX旗下机构业务ATFX Connect宣布一项重磅人事任命&#xff0c;行业杰出领袖Amer Zino加入公司&#xff0c;出任中东和北非业务发展总监一职&#xff0c;并将常驻工作地阿…

【ARM】ULINK Pro如何和SWD接口进行连接调试

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决ULINK Pro和JTAR接口进行连接问题。 2、 问题场景 因为ULINK Pro本身自带的接口是Cortex-M ETM Interface 20-pin Connector。所以无法和JTAR接口直接进行连接。 图2-1 3、软硬件环境 1&#xff09;、软件版…

综合交易系统---强大的问财自定义实盘交易系统上线

这几天知识星球的朋友的需要&#xff0c;我重新写了问财自定义实盘交易系统&#xff0c;同时把数据库上线了&#xff0c;网页 https://gitee.com/li-xingguo11111/xg_data 调用网页的源代码数据服务器地址 http://124.220.32.224:8888/ 问财实盘设置&#xff0c;打开总结交易系…

【从零开始一步步学习VSOA开发】VSOA数据报

VSOA数据报 概念 Datagram 是 VSOA 的一种数据传输类型&#xff0c;通常这种类型用于传输一些不需要确认的数据&#xff0c;例如传输视频流数据或构建 VPN 网络。 Datagram 可以简单快速的在网络中传输数据。它即不需要建立连接&#xff0c;也不需要维护连接&#xff0c;因此…

GESP 一级 比赛

出错了 - 洛谷https://www.luogu.com.cn/contest/190441#problems 邀请码&#xff1a;zura 有讲解哦&#xff01;

SCAU学习笔记 - 高级语言程序设计课后习题

写在前面 趁着暑假赶紧把C语言的习题也补了 也欢迎看到这篇博客的小灯们来到华南农业大学喵 专栏里还有后续其他部分课程的学习笔记 如何提交自己的代码 首先给各位说一下这门课程的要求&#xff0c;首先是我们学校的校内OJ&#xff0c;我们计算机类专业的学生用的是前面这个…

突破 ES 引擎局限性在用户体验场景中的优化实践

回顾&#xff1a;ES 慢上游响应问题优化在用户体验场景中的实践-CSDN博客 上文介绍了用户体验管理平台&#xff08;简称 VoC&#xff09;在针对 ES 慢上游响应场景下的优化实践&#xff0c;本文继续介绍针对第二个痛点问题——ES 引擎局限性的性能优化实践进行介绍。 下文以搜…

MaxKB:基于 LLM大语言模型的知识库问答系统实操

1.MaxKB介绍 MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品命名内涵为 “Max Knowledge Base”&#xff0c;为用户提供强大的学习能力和问答响应速度&#xff0c;致力于成为企业的最强大脑。与同类基于 LLM 的知…

数值分析【4】

目录 ​编辑第六章 数值积分微分 龙贝格 高斯求积 查表&#xff1f; 插值求导 两点 ​编辑 三点​编辑 第七章 ode 龙哥库塔 线性多步法 第八章 eig 幂法&#xff1a;v-》Av-》AAv-》……​编辑 反幂法 每次成得是A逆&#xff0c;这样得到摸最小的特征值​编辑 Q…

【IEEE独立出版】第四届计算机科学与区块链国际学术会议 (CCSB 2024)

第四届计算机科学与区块链国际学术会议 (CCSB 2024) 2024 4th International Conference on Computer Science and Blockchain 2024年9月6-8日 中国-深圳 老牌会议 | 涵盖计算机学科 | 往届均完成见刊、稳定检索 | 论文录用速度快 | 有ISBN号! *关于IEEE出版社 电气电子工…

使用ant design的modal时,发现自定义组件的样式(组件高度)被改变了!

一 问题描述 在项目中&#xff0c;自定义了一个组件&#xff0c;分别在界面和 antd的modal中都有使用到。但是突然发现&#xff0c;界面中的组件样式跟modal中的组件样式高度不一样。modal中的组件整体要比页面中的组件要高一点。 项目中的自定义组件比较复杂&#xff0c;因此&…

C#使用Puppeteer

Puppeteer Puppeteer是一个Node.js库&#xff0c;它提供了高级API来通过DevTools协议(Chrome DevTools Protocol https://devtools.chrome.com)控制Chrome或Chromium。 Puppeteer默认情况下无头运行(headless)。 可以配置为运行完整的Chrome或Chromium&#xff0c;运行效果如…

【中项】系统集成项目管理工程师-第11章 项目范围管理-11.2收集需求

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

开源AI搜索平台Search4All

什么是 Search4All &#xff1f; Search4All 是个人 AI 搜索协助工具&#xff0c;是 Perplexity 的开源替代品。能让你的 LLM API 支持联网&#xff0c;搜索、新闻、网页总结&#xff0c; 软件特点&#xff1a; 集成对 LLM 的支持&#xff0c;例如 OpenAI、Groq 和 Claude。本…

【学习笔记】Day 8

写在开头&#xff1a; 最近老板突然提出一个全新的组会主题&#xff0c;是关于 “最近我犯的傻”&#xff0c;其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿&#xff0c;结果今天直接拉了个大的。什么叫无心插柳柳成荫啊&#xff0c;悲。 一…

亿达科创亮相智造数字科技大会

8月8日&#xff0c;IMC2024第七届智造数字科技大会在京启幕。大会以“乘‘数’而上”为题&#xff0c;邀请300智能制造行业数字化转型技术大咖、领军者及实践者共聚一堂&#xff0c;解读智造行业转型进程。亿达科创受邀参会&#xff0c;分享企业前沿数字技术、解决方案与创新实…