如何借助MSAL从Azure AD OAuth令牌获取用户详情(邮箱、姓名)
用MSAL实现前端携带Access Token保护Spring Boot API
完全可以通过MSAL实现这个需求,核心思路是前端用MSAL获取针对后端API的Access Token,请求时携带令牌,后端验证令牌合法性来保护接口。以下是具体实现步骤:
前端(React + MSAL)操作
- 确保已集成MSAL React库,获取Access Token时必须指定后端API的专属scope(格式为
api://<你的后端Azure AD客户端ID>/.default),这样令牌才会被后端认可 - 发起API请求时,在请求头中添加
Authorization: Bearer {accessToken},将令牌传递给后端 - 示例代码(基于Axios):
import { useMsal } from "@azure/msal-react"; import axios from "axios"; const callProtectedApi = async () => { const { instance } = useMsal(); const account = instance.getActiveAccount(); const request = { account: account, scopes: ["api://<backend-client-id>/.default"] // 替换为你的后端scope }; try { const response = await instance.acquireTokenSilent(request); const apiResponse = await axios.get("/api/protected", { headers: { Authorization: `Bearer ${response.accessToken}` } }); return apiResponse.data; } catch (error) { // 处理令牌获取失败(比如需要交互式登录) instance.acquireTokenPopup(request); } };
后端(Spring Boot)操作
- 添加Spring Security和Azure AD资源服务器依赖到
pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
- 在
application.yml中配置Azure AD信息:
spring: security: oauth2: resourceserver: jwt: issuer-uri: https://login.microsoftonline.com/<你的租户ID>/v2.0 audience: api://<你的后端Azure AD客户端ID>
- 配置SecurityFilterChain,验证JWT令牌并保护API:
import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() // 所有请求都需要认证 ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt .jwtAuthenticationConverter(new AzureADJwtAuthenticationConverter()) // 可选:自定义令牌转换逻辑 ) ); return http.build(); } }
关键说明
- 后端的Azure AD客户端ID需要提前在Azure门户注册,确保前端请求的scope和后端配置的audience一致
- MSAL会自动处理令牌的缓存、刷新逻辑,前端无需手动管理令牌生命周期
- 后端通过验证令牌的签名、过期时间、受众(audience)和scope,确保请求来自合法用户
内容的提问来源于stack exchange,提问作者Aniruddh M
相关产品推荐
相关产品推荐

