如何使用MSAL Python获取V2类型令牌?
确认Authority参数格式
V2端点的Authority必须带/v2.0后缀,格式应为https://login.microsoftonline.com/{tenant-id-or-name}/v2.0。检查你环境变量AUTHORITY是否符合该格式,不带v2.0的话,MSAL会默认使用V1端点,返回的令牌Issuer就是https://sts...开头的V1格式。如果使用通用租户(common/consumers/organizations),也要加上后缀,比如https://login.microsoftonline.com/common/v2.0。规范Scope的格式
V2令牌的scope需采用资源标识符+权限的格式,比如["https://graph.microsoft.com/User.Read"]或["https://graph.microsoft.com/.default"],不能使用V1风格的纯resource字符串。确保你的scopes变量符合V2规范。清理不必要的参数
如果你的场景不是External ID自定义域名,移除oidc_authority参数,该参数会干扰默认的Authority处理逻辑,可能导致切换到V1端点。仅保留正确格式的authority参数即可。验证应用注册的权限模型
除了修改accesstokentype为V2,还要确认应用注册使用的是V2权限模型。在Azure门户的应用注册页面,检查“API权限”中添加的是否为V2类型权限(比如Microsoft Graph的Delegated权限,权限标识为User.Read而非V1的https://graph.microsoft.com/user.read)。强制刷新令牌缓存
若之前通过V1端点获取过令牌,缓存中可能残留旧令牌。可以清空global_token_cache,或者在调用acquire_token_by_username_password时添加force_refresh=True参数强制获取新令牌:
result = global_app.acquire_token_by_username_password( os.getenv("USERNAME"), password, scopes=scopes, force_refresh=True )
内容的提问来源于stack exchange,提问作者Sujith Samuel

