使用MSAL Python仅通过id_token_claims完成用户身份验证是否合规?
针对MSAL Python纯身份验证场景的用法解答
首先直接给结论:你当前的用法能完成身份验证,但不是最精简、最符合场景需求的正确姿势,咱们来详细拆解清楚:
1. 当前用法的问题
你现在配置的["https://graph.microsoft.com/.default"]是针对Microsoft Graph API的权限范围,这个scope会触发Azure AD返回Graph的access_token,而这正是你不需要的冗余内容——因为你只需要用于身份验证的id_token,完全没必要请求API权限。
2. 正确的scope配置方式
如果只需要用户身份验证(仅获取id_token),你应该使用OIDC(OpenID Connect)标准的scope,这才是MSAL用于纯身份验证场景的设计初衷:
- 最基础的配置:
["openid"]——只要包含这个scope,Azure AD就会返回id_token,里面包含核心的身份标识字段(比如用户唯一IDsub、租户IDtid等),完全满足纯身份验证需求。 - 如果需要用户的基础信息(比如姓名、邮箱),可以加上
profilescope,变成["openid", "profile"],这样id_token里会附带这些额外字段。
⚠️ 注意:你提到的用client_id作为scope不是标准做法,Azure AD并不支持这种方式,别这么用。
3. 验证id_token_claims的正确性
你提到通过返回结果中的id_token_claims来实现身份验证,这完全没问题——MSAL Python会自动帮你完成id_token的签名验证、过期检查、受众验证等安全步骤,你可以直接信任id_token_claims里的内容,不需要自己手动解码验证(只要你的authority配置正确,MSAL会处理所有安全逻辑)。
总结调整方案
把你的配置里的scope改成:
"scope": ["openid"]
或者需要用户信息的话改成:
"scope": ["openid", "profile"]
这样就能只获取你需要的id_token,不会返回多余的Graph access_token,完全符合你“仅需用户身份验证”的目标。
内容的提问来源于stack exchange,提问作者user3366016
相关产品推荐
相关产品推荐

