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

Azure Access Token验证失败求助:刚生成的令牌签名验证不通过

Azure Access Token验证失败求助:刚生成的令牌签名验证不通过

兄弟,我看你遇到的这个签名验证失败的问题真的挺闹心的——刚生成的token居然验证不通过,我来给你捋捋几个最可能的原因和解决办法:

  • 首先,你的RESOURCE配置完全错了!
    你生成token的时候用的scope是https://graph.microsoft.com/.default,对应的资源是微软Graph API,它的官方标识符就是https://graph.microsoft.com;但你在验证脚本里写的RESOURCE = "api://graph.microsoft.com",这是自定义API的格式,根本不是Graph API的正确标识!这个绝对是最可能的元凶,你把RESOURCE改成"https://graph.microsoft.com"再试试。

  • 其次,acquire_token_on_behalf_of的用法可能不对
    这个方法本来是用于代理流程的——也就是后端代表前端用户去请求另一个资源的token,不是用来单纯验证现有token合法性的工具。如果你只是想确认手里的token是不是真的有效,其实有更简单的方式:

    1. 就像你生成token后做的那样,直接用这个token调用https://graph.microsoft.com/v1.0/me,如果能正常返回用户信息,就说明token是有效的(因为Graph API本身会自动验证签名和权限);
    2. 或者用jwt库结合Azure AD的公钥来直接验证签名,我给你贴个简单的示例代码:
      from jose import jwt
      import requests
      
      TENANT_ID = "你的租户ID"
      AUDIENCE = "https://graph.microsoft.com"
      
      def validate_token(access_token):
          # 获取Azure AD的公钥配置
          openid_config = requests.get(f"https://login.microsoftonline.com/{TENANT_ID}/v2.0/.well-known/openid-configuration").json()
          jwks = requests.get(openid_config["jwks_uri"]).json()
          # 解析token头部拿kid
          header = jwt.get_unverified_header(access_token)
          # 匹配对应的公钥
          rsa_key = next((key for key in jwks["keys"] if key["kid"] == header["kid"]), None)
          if not rsa_key:
              return False, "找不到匹配的公钥"
          try:
              # 验证签名、受众、签发者
              payload = jwt.decode(
                  access_token,
                  rsa_key,
                  algorithms=[header["alg"]],
                  audience=AUDIENCE,
                  issuer=f"https://login.microsoftonline.com/{TENANT_ID}/v2.0/"
              )
              return True, payload
          except Exception as e:
              return False, str(e)
      
  • 再检查几个细节点

    1. 去jwt.ms里解码你生成的token,看看aud字段是不是https://graph.microsoft.com,确保和验证时的受众一致;
    2. 确认你的Azure应用注册已经开启了密码流:在应用注册的「认证」>「高级设置」>「允许使用旧版流」里,勾选"允许用户名/密码流";
    3. 你用的是.default scope,要确保你的应用已经添加了User.Read等必要的Delegated权限,并且已经获得了管理员同意(如果是租户级应用的话)。

先把第一个问题(RESOURCE配置)改了试试,应该能解决大部分问题,如果还不行,再排查后面的细节~

备注:内容来源于stack exchange,提问作者Uomolepre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:28:01