使用Python+Flask认证Microsoft Graph时遭遇500 Internal Server Error
看到你截图里的错误 AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret',这个问题的原因很明确——你在请求获取Microsoft Graph令牌时,没有正确传递客户端凭证参数。我给你梳理几个具体的解决步骤:
检查令牌请求的参数完整性
在调用Microsoft Graph的令牌端点(https://login.microsoftonline.com/common/oauth2/v2.0/token)时,必须在POST请求体里包含client_secret(如果你用的是机密客户端模式,网页应用默认都是这个模式)。确保你的Flask代码里的请求数据没有漏掉这个参数,比如:token_payload = { "grant_type": "authorization_code", "code": request.args.get("code"), "redirect_uri": "http://localhost:5000/callback", # 替换成你的重定向URI "client_id": "你的Azure应用客户端ID", "client_secret": "你的Azure应用客户端密钥" # 这个参数绝对不能少! } response = requests.post(TOKEN_ENDPOINT, data=token_payload)确认请求参数的格式
注意令牌请求的参数必须以application/x-www-form-urlencoded格式传递,也就是用requests.post的data参数,而不是json参数。如果用json传参,Azure的认证服务会识别不到这些表单参数,同样会抛出这个错误。核对应用注册类型
如果你在Azure门户里注册的是公共客户端应用(比如桌面APP),那确实不能用client_secret,但Flask网页应用属于机密客户端,你需要确保应用注册的"身份验证"设置里,将应用类型标记为"Web",这样才能正常使用客户端密钥。
给你一个完整的令牌请求示例,你可以对照自己的代码调整:
from flask import Flask, request, redirect, session import requests app = Flask(__name__) app.secret_key = "your-random-secret-key-here" # 替换成你自己的应用配置 CLIENT_ID = "your-azure-client-id" CLIENT_SECRET = "your-azure-client-secret" REDIRECT_URI = "http://localhost:5000/callback" TOKEN_ENDPOINT = "https://login.microsoftonline.com/common/oauth2/v2.0/token" @app.route("/callback") def callback(): auth_code = request.args.get("code") if not auth_code: return "Authorization code is missing from the request!" # 正确构造令牌请求体 token_data = { "grant_type": "authorization_code", "code": auth_code, "redirect_uri": REDIRECT_URI, "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET } # 发送POST请求获取令牌 token_response = requests.post(TOKEN_ENDPOINT, data=token_data) if token_response.ok: token_info = token_response.json() session["access_token"] = token_info["access_token"] return "Login successful! You can now call Microsoft Graph APIs." else: return f"Token request failed: {token_response.json()}" if __name__ == "__main__": app.run(debug=True)
如果按照上面的步骤修改后还是有问题,你可以把你的令牌请求代码片段贴出来,我再帮你排查细节~
内容的提问来源于stack exchange,提问作者Aly Zayn

