umi4 实现msal aad 登录loginRedirect方式并获取令牌

news2024/11/27 21:45:54

在 Umi 4 中使用 Ant Design Pro Layout 以及 MSAL (Microsoft Authentication Library) 实现登录并获取令牌进入到首页,你需要按照以下步骤进行操作:

  1. 安装所需依赖:
    使用 npm 或 yarn 安装所需的包:

    npm install @azure/msal-browser @azure/msal-react ant-design/pro-layout

    yarn add @azure/msal-browser @azure/msal-react ant-design/pro-layout

2. 配置 MSAL:
在项目中创建一个新文件,例如 src/msalConfig.js。在此文件中,配置 MSAL 实例并导出它:

import { PublicClientApplication } from "@azure/msal-browser";  

const msalConfig = {  
  auth: {  
    clientId: "your-client-id",  
    authority: "https://login.microsoftonline.com/your-tenant-id",  
    redirectUri: "http://localhost:8000",  
  },  
};  

const msalInstance = new PublicClientApplication(msalConfig);  

export { msalInstance };  

请将 your-client-id 和 your-tenant-id 替换为在 Azure Portal 中注册的应用程序的相应值。

3、更新 src/app.tsx 以包含 MsalProvider

import React from 'react';  
import { history } from 'umi';  
import { msalInstance } from './msalConfig';  
import { MsalProvider } from '@azure/msal-react';  

export function render(oldRender) {  
  oldRender();  
}  

export function rootContainer(container) {  
  return React.createElement(  
    MsalProvider,  
    {  
      instance: msalInstance,  
    },  
    container  
  );  
}  

4. 创建一个登录组件,例如 src/pages/login/index.js,并实现 MSAL loginRedirect 方法:

import React from "react";  
import { useMsal } from "@azure/msal-react";  

const Login = () => {  
  const { instance } = useMsal();  

  const handleLogin = () => {  
    const loginRequest = {  
      scopes: ["openid", "profile", "User.Read"],  
    };  
    instance.loginRedirect(loginRequest);  
  };  

  return (  
    <div>  
      <button onClick={handleLogin}>Login with Microsoft</button>  
    </div>  
  );  
};  

export default Login;  

5. 使用 Ant Design Pro Layout 和 Outlet 路由标签实现登录跳转:
在 src/layouts/index.js 中,使用 ProLayout 和 Outlet 标签并在成功登录并获取到令牌后执行跳转到首页:

import React, { useEffect } from "react";  
import ProLayout from "@ant-design/pro-layout";  
import { Outlet } from "react-router-dom";  
import { useMsal } from "@azure/msal-react";  
import { useHistory } from "react-router-dom";  

const Layout = () => {  
  const { instance } = useMsal();  
  const history = useHistory();  

  useEffect(() => {  
    const handleRedirect = async () => {  
      const response = await instance.handleRedirectPromise();  
      if (response) {  
        // 登录成功,跳转到首页  
        history.push("/");  
      }  
    };  

    handleRedirect();  
  }, [instance, history]);  

  return (  
    <ProLayout>  
      <Outlet />  
    </ProLayout>  
  );  
};  

export default Layout;  

使用此代码,当用户成功登录

注意,我们做的是单页面应用在 Azure 的时候按照以下步骤

 

 将redirectUri 设置为你的代码里的回调地址

拓展、

. 在成功登录后,你可以使用 msal-browser 的 instance 对象获取访问令牌并使用 Microsoft Graph API 获取用户信息。将以下代码添加到 src/layouts/index.js 文件中的 useEffect 函数内部:

useEffect(() => {  
  const handleRedirect = async () => {  
    const response = await instance.handleRedirectPromise();  
    if (response) {  
      // 登录成功,跳转到首页  
      history.push("/");  
        
      // 获取访问令牌  
      const accessTokenRequest = {  
        scopes: ["User.Read"],  
        account: instance.getAccountByUsername(response.account.username),  
      };  
      const accessTokenResponse = await instance.acquireTokenSilent(accessTokenRequest);  
      const accessToken = accessTokenResponse.accessToken;  

      // 使用访问令牌获取用户信息  
      const userResponse = await fetch("https://graph.microsoft.com/v1.0/me", {  
        headers: {  
          Authorization: `Bearer ${accessToken}`,  
        },  
      });  
      const userInfo = await userResponse.json();  
      console.log(userInfo);  
    }  
  };  

  handleRedirect();  
}, [instance, history]);  

这段代码首先使用 acquireTokenSilent 方法获取访问令牌,然后使用 fetch API 调用 Microsoft Graph API 的 /me 端点以获取用户信息。获取到的用户信息将被输出到控制台。

现在,当用户成功登录并获取令牌后,应用程序将获取用户信息并将其输出到控制台。你可以根据需要自定义此代码以将用户信息存储在状态管理库(如 Redux 或 MobX)中或直接在组件状态中。

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

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

相关文章

从零开始Vue3+Element Plus后台管理系统(十)——自定义水印指令与全局注册

在实际项目开发中&#xff0c;自定义指令用得还是比较多的&#xff0c;比如&#xff1a;复制粘贴、输入框防抖、输入框禁止特殊字符、权限校验、背景水印、拖拽等等… 指令确实是个优雅的存在。 Vue3中定义一个普通的自定义指令的详细说明参见官网&#xff1a;https://cn.vue…

sentinel配置持久化到apollo

背景 sentinel-dashborad的配置默认是存储到内存中的&#xff0c;生产环境肯定不能这样使用&#xff0c;官网支持zookeeper、nacos、apollo的配置&#xff0c;本文就来介绍apollo的持久化 apollo sentinel-dashboard 整合 apollo 进行规则的持久化配置&#xff0c;主要方式是…

Kettle获取接口数据到表

kettle从接口服务获取数据 主要用到kettle输入菜单下的控件&#xff1a;生成记录、JSON input 查询菜单下的控件&#xff1a;HTTP client 输出菜单下的控件&#xff1a;表输出、插入/更新 生成记录&#xff1a;设置一个变量&#xff0c;用这个变量来保存要去访问接口的URL地址…

数据结构学习之队列

前言&#xff1a;在我们学习了栈之后&#xff0c;明白了它的结构的特殊性即LAST IN FIRST OUT(后进先出)&#xff0c;与之相对应的也有一个特殊的结构队列&#xff08;queue&#xff09;--FIRST IN FIRST OUT(先进先出)&#xff0c;他们都是面对特殊情况下的数据的结构&#xf…

支持导入 Postman ,用这个插件就可以了

首先安装 导入 Postcat 插件&#xff0c;之后就可以愉快的导入 Postman 格式的文件了。 右上角——选择导入——选择Postman 格式——拖入文件 导入即可&#xff01;再也不用担心 Postcat 格式的 api 文件能把自己难住了&#xff01; 如果你日常会用到 api 管理工具的话&#x…

5G和物联网将如何重塑汽车行业?物联网将给汽车行业带来哪些变革?

“ 物联网(Internet of Things)的诞生给无数行业带来了变革&#xff0c;其中就包括汽车行业。物联网对于汽车发展的重要性是毋庸置疑的。从网联汽车到智能交通系统&#xff0c;物联网正在为汽车行业开辟下一个汽车时代。汽联网(Internet of Vehicles)正在成型。” 我们今天看到…

k8s部署mysql并使用nfs持久化数据

k8s部署mysql并使用nfs持久化数据 一、配置nfs服务器1.1 修改配置文件1.2. 载入配置1.3. 检查服务配置 二、创建K8S资源文件2.1 mysql-deployment.yml2.2 mysql-svc.yml 一、配置nfs服务器 参考文章: pod使用示例https://cloud.tencent.com/developer/article/1914388nfs配置…

管好【SD-WEBUI】中大量的模型:名称+预览图+备注+分组(Part.2)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;模型预览图&#xff08;1.1&#xff09;预览图姿态&#xff08;证件照&#xff09;&#xff08;1.2&#xff09;预览图姿态&#xff08;半身动作&#xff09; &#xff08;二&#xff09;LoRA模型名称&#…

机器人关节电机PWM

脉冲宽度调制(Pulse width modulation,PWM)技术。一种模拟控制方式 机器人关节电机的控制通常使用PWM(脉冲宽度调制)技术。PWM是一种用于控制电子设备的技术,通过控制高电平和低电平之间的时间比例,实现对电子设备的控制。在机器人关节电机中,PWM信号可以控制电机的…

C++ | 高效使用vector

C | 高效使用vector 文章目录 C | 高效使用vector1.善用Reserve2.移动构造和赋值3.释放vector如果vector内存的是指针&#xff0c;需要先释放每个指针所指内存&#xff0c;再释放vectorReference 1.善用Reserve 当需要向vector中添加元素但目前的空间已经放满时&#xff0c;ve…

200G AOC有源光缆在数据中心的应用

随着大数据时代对高速、高带宽的需求日益增长&#xff0c;人们迫切需要一种新型产品作为高性能计算和数据中心的主要传输介质。因此&#xff0c;光通信传输速率的发展也提高了。面对短距离数据中心在光互连产品中的高速、高密度、低成本、低功耗要求&#xff0c;AOC有源光缆提供…

shell脚本----awk命令

文章目录 一、awk工作原理二、awk相关命令三、awk的使用按行输出文本:按字段输出文本&#xff1a;通过管道、双引号调用 Shell 命令&#xff1a; 一、awk工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中…

Flink Kafka-Source

文章目录 Kafka Source1. 使用方法2. Topic / Partition 订阅3. 消息解析4. 起始消费位点5. 有界 / 无界模式6. 其他属性7. 动态分区检查8. 事件时间和水印9. 空闲10. 消费位点提交11. 监控12. 安全 Apache Kafka 连接器 Flink 提供了 Apache Kafka 连接器使用精确一次&#xf…

由浅入深理解java集合(四)——集合 Queue

Queue用于模拟队列这种数据结构&#xff0c;队列通常是指“先进先出”&#xff08;FIFO&#xff09;的容器。新元素插入&#xff08;offer&#xff09;到队列的尾部&#xff0c;访问元素&#xff08;poll&#xff09;操作会返回队列头部的元素。通常&#xff0c;队列不允许随机…

【C++初阶】类与对象(中)之构造函数与析构函数

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

C++继承详解——基类派生类对象赋值转换、菱形虚拟继承

hello&#xff0c;这里是bangbang&#xff0c;今天来讲下继承。 面向对象三大特性&#xff1a;封装、继承、多态。 目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 2. 基类和派生类对…

Java面试知识点(全)-设计模式二

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 13.模板模式 定义一个操作中算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变算法的结构即可重定义该算法的…

7. 深入理解MVCC与BufferPool缓存机制

MySQL性能调优 1. MVCC多版本并发控制机制1.1 undo日志版本链与read view机制详解 2. Innodb引擎SQL执行的BufferPool缓存机制 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 本节课内容&#xff1a; 1、…

PowerShell install 一键部署VMware_Workstation

VMware Workstation 前言 VMware Workstation Pro 是业界标准的桌面 Hypervisor&#xff0c;用于在 Linux 或 Windows PC 上运行虚拟机 download VMware_Workstation VMware_Workstation WindowsVMware_Workstation linux文档downloaddownload参考 前提条件 开启wmi,配置…

2023接口自动化测试框架9项必备功能(建议收藏)

当你准备使用一个接口测试框架或者自造轮子的时候&#xff0c;或许你需要先了解下一个接口自动化测试框架必须具备什么功能。 一、校验 这个很好了解&#xff0c;如果没有校验&#xff0c;单纯的执行接口的话&#xff0c;那就谈不上测试了。所以支持对返回值校验是一个必须的…