You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AAD Access Token验证失败求助(Vue3+FastAPI架构)

解决Azure AD Token签名验证失败问题

核心问题分析

你当前获取的是ID Token而非用于后端API验证的Access Token,这是导致签名验证失败的核心原因。你的前端代码中acquireTokenPopup未指定目标后端API的权限范围,返回的token实际是用于前端身份识别的ID Token——它的受众(aud字段)是前端应用的Client ID,而非后端API,后端验证时自然会因为签名逻辑不匹配报错。


具体修复步骤

1. 正确获取后端API专用的Access Token

修改前端acquireTokenPopup的配置,指定后端API的应用ID URI或已暴露的权限范围,不能仅用openid/profile:

// 替换为你的后端API在Azure AD中注册的应用ID URI + 权限范围
// 示例:api://<后端应用Client ID>/access_as_user
const token_response = await msalInstance.acquireTokenPopup({
  scopes: ["api://<your-backend-client-id>/access_as_user"]
});

前置要求:后端API需在Azure AD中完成注册,并至少暴露一个API权限范围(如access_as_user),同时给前端应用分配该权限并完成管理员同意。

2. 确认Token类型

获取token后,检查payload中的aud字段:

  • ID Token的aud值是前端应用的Client ID
  • 有效Access Token的aud值是后端API的应用ID URI或Client ID

3. 修正后端验证配置

使用azure_ad_verify_token时,确保配置与Access Token匹配的受众和租户信息:

from azure_ad_verify_token import verify_jwt

token = "前端传入的Access Token"
try:
    decoded_token = verify_jwt(
        token=token,
        valid_audiences=["api://<your-backend-client-id>"], # 必须匹配Access Token的aud字段
        issuer="https://login.microsoftonline.com/<your-tenant-id>/v2.0",
        jwks_uri="https://login.microsoftonline.com/<your-tenant-id>/discovery/v2.0/keys"
    )
except Exception as e:
    print(f"验证失败原因: {str(e)}")

4. 检查API权限分配完整性

确保以下配置都已完成:

  • 前端应用已添加后端API的权限,并完成管理员同意(Azure AD应用注册 -> 前端应用 -> API权限 -> 确认状态为“已授予”)
  • 若权限设置了“需要分配”,需确保当前用户/所属组已被分配到前端应用

5. 关于jwt.io签名无效的说明

jwt.io不会自动加载Azure AD的公钥,需手动匹配token头中的kid获取对应公钥:

  1. 访问你的Azure AD租户的OIDC密钥发现端点(格式为https://login.microsoftonline.com/{租户ID}/discovery/v2.0/keys)
  2. 根据token头里的kid值找到对应的公钥
  3. 将公钥粘贴到jwt.io的“Public Key”输入框,即可完成签名验证

内容的提问来源于stack exchange,提问作者rmbt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:18:23