使用MSAL Python库适配O365邮件脚本遇AADSTS900144错误求助
解决AADSTS900144错误:请求体必须包含'client_id'
1. 确认MSAL生成授权URL时已正确传入client_id
get_authorization_request_url的正常工作依赖于初始化客户端时传入正确的client_id,生成URL时该参数会自动附加到查询参数中。检查你的代码是否符合以下示例:
import msal # 初始化客户端,确保client_id与应用注册页的ID完全一致 app = msal.PublicClientApplication( client_id="你的应用client_id", authority="https://login.microsoftonline.com/你的租户ID" ) # 生成授权URL,scope和redirect_uri需匹配应用注册配置 auth_url = app.get_authorization_request_url( scopes=["Mail.Send", "offline_access"], redirect_uri="你的重定向URI" ) print(auth_url)
直接打印生成的URL,确认其中包含client_id=你的应用ID这个查询参数。如果没有,说明初始化客户端时client_id传入错误或方法调用存在遗漏。
2. 检查应用注册的重定向URI类型配置
若URL中已包含client_id但仍报错,可能是应用注册里的重定向URI类型配置错误:
- 桌面/移动端应用(Public Client)需选择"公共客户端/native (移动&桌面)"类型
- Web应用(Confidential Client)需选择"Web"类型
错误的类型配置会导致Azure AD对请求参数的位置产生异常要求。
3. 排查授权码交换token的请求环节
如果错误实际发生在获取授权码后交换access token的步骤中(可能混淆了环节),需确保该POST请求的请求体包含client_id。使用MSAL内置方法可自动处理参数传递:
# 用MSAL方法自动构造请求体,无需手动拼接参数 result = app.acquire_token_by_authorization_code( code="获取到的授权码", scopes=["Mail.Send", "offline_access"], redirect_uri="你的重定向URI" )
该方法会自动在请求体中传入client_id、client_secret(机密客户端场景)等必填参数。
4. 升级MSAL版本
你使用的1.21.0版本较旧,可能存在参数传递的已知问题,建议升级到稳定版本:
pip install --upgrade msal
AADSTS900144错误核心是Azure AD未在指定请求环节收到必填的client_id参数,优先排查授权URL的参数完整性,再依次检查应用配置、token交换步骤。
内容的提问来源于stack exchange,提问作者user118799
相关产品推荐
相关产品推荐

