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是不是真的有效,其实有更简单的方式:- 就像你生成token后做的那样,直接用这个token调用
https://graph.microsoft.com/v1.0/me,如果能正常返回用户信息,就说明token是有效的(因为Graph API本身会自动验证签名和权限); - 或者用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)
- 就像你生成token后做的那样,直接用这个token调用
再检查几个细节点
- 去jwt.ms里解码你生成的token,看看
aud字段是不是https://graph.microsoft.com,确保和验证时的受众一致; - 确认你的Azure应用注册已经开启了密码流:在应用注册的「认证」>「高级设置」>「允许使用旧版流」里,勾选"允许用户名/密码流";
- 你用的是
.defaultscope,要确保你的应用已经添加了User.Read等必要的Delegated权限,并且已经获得了管理员同意(如果是租户级应用的话)。
- 去jwt.ms里解码你生成的token,看看
先把第一个问题(RESOURCE配置)改了试试,应该能解决大部分问题,如果还不行,再排查后面的细节~
备注:内容来源于stack exchange,提问作者Uomolepre
相关产品推荐
相关产品推荐

