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

2023-10-08 19:50

本文主要是介绍umi4 实现msal aad 登录loginRedirect方式并获取令牌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 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 中注册的应用程序的相应值。

注意:要想实现整个应用程序中管理用户的身份验证状态,在umi4之前layout 有children 属性直接用MsalProvider标签包裹就可以。而umi4没有使用Outlet标签替代children,思考如何实现呢

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

解释app.tsx

这段代码是一个umi插件的入口文件,其中包含了两个函数:renderrootContainer

render函数是umi框架提供的函数,在应用程序启动之前会被调用,用来执行一些额外的初始化操作。在这个示例中,oldRender参数是一个回调函数,它会在render函数执行完毕后被调用,以便继续渲染应用程序。

rootContainer函数则是应用程序的根组件,它接收一个名为container的参数,该参数表示应用程序中所有其他组件的层次结构。在这个示例中,rootContainer函数返回一个MsalProvider组件,它是Azure Active Directory中的一个React组件,用于在整个应用程序中管理用户的身份验证状态。

MsalProvider组件接收一个名为instance的属性,它是一个MSAL实例,用于管理身份验证和令牌获取等操作。在这个示例中,msalInstance是从@/layouts/msalConfig导入的,它是一个MSAL实例的配置文件,包含了应用程序的客户端ID和租户ID等信息。

最后,rootContainer函数使用React.createElement函数将MsalProvider组件和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)中或直接在组件状态中。

案例开源代码umi4+react18+add

这篇关于umi4 实现msal aad 登录loginRedirect方式并获取令牌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167645

相关文章

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题