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

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys