如何在Flask中配置Entra ID联合身份凭证认证
解决联合身份凭证对接Entra ID应用的令牌获取错误AADSTS7000218
你在对接使用联合身份凭证的Entra ID应用时,未使用客户端密钥,调用接口获取认证令牌时触发以下错误:
invalid_client
AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.
以下是基于你用到的Python WebApp示例项目的调整方案:
核心问题
联合身份凭证模式下,Azure AD要求用**客户端断言(client_assertion)**替代客户端密钥完成身份验证,你的代码目前未正确生成并传入该参数,因此触发缺失参数的错误。
具体调整步骤
1. 确认Entra ID应用的联合身份凭证配置
- 确保已在Entra ID应用的「联合身份凭证」页面添加了正确的身份提供者,配置好受众、发行者等参数
- 记录凭证对应的**发行者(issuer)和受众(audience)**信息
2. 生成客户端断言
在Python代码中生成符合要求的JWT作为client_assertion:
- 先安装依赖:
pip install pyjwt cryptography
- 编写生成断言的代码:
import jwt from datetime import datetime, timedelta # 替换为你的实际配置 client_id = "你的Entra ID应用客户端ID" issuer = "联合身份凭证的发行者" audience = "https://login.microsoftonline.com/你的租户ID/v2.0" private_key_path = "你的私钥文件路径" # 读取私钥 with open(private_key_path, "r") as f: private_key = f.read() # 生成JWT断言 payload = { "aud": audience, "iss": issuer, "sub": client_id, "exp": datetime.utcnow() + timedelta(minutes=10), "iat": datetime.utcnow() } client_assertion = jwt.encode(payload, private_key, algorithm="RS256")
3. 调整令牌请求逻辑
替换原有的客户端密钥请求,传入client_assertion和对应类型参数:
import requests token_url = f"https://login.microsoftonline.com/你的租户ID/oauth2/v2.0/token" request_data = { "grant_type": "client_credentials", "client_id": client_id, "scope": "你要访问的API范围(比如https://graph.microsoft.com/.default)", "client_assertion": client_assertion, "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" } response = requests.post(token_url, data=request_data) if response.status_code == 200: access_token = response.json().get("access_token") else: print(f"请求失败: {response.text}")
4. 适配原示例项目
如果基于ms-identity-python-webapp示例修改:
- 找到示例中获取令牌的代码段(通常在
auth.py或同类文件中) - 移除原有的
client_secret参数,替换为上述的客户端断言生成和传入逻辑 - 配置文件中存储私钥路径、发行者、受众等参数,而非客户端密钥
验证配置
调整完成后重新运行代码:
- 成功获取
access_token即表示配置正确 - 若仍报错,检查以下内容:
- 私钥是否与Entra ID应用中联合身份凭证的公钥匹配
- JWT payload中的
iss、aud、sub参数是否与配置一致 - 请求的
scope是否已授权给Entra ID应用
内容的提问来源于stack exchange,提问作者Robert Sim
相关产品推荐
相关产品推荐

