OneDrive认证时报错KeyError: 'expires_in'问题如何解决?
报错原因
KeyError: 'expires_in'的核心原因是你使用的ms-graph-python-client库预期的授权响应字段,和微软Graph API实际返回的字段不匹配,微软没有在token返回结果中提供expires_in字段,常见触发场景有两个:
- Azure AD注册应用时选择了错误的账户类型,仅选择个人微软账户或者仅组织账户,导致响应结构变化
- 库的版本过老,没有适配微软后续对OAuth2响应的调整,部分场景下微软会用
expires_on字段替代expires_in返回,旧版库没有做兼容逻辑
解决步骤
- 第一步:核对Azure应用配置
进入Azure AD应用注册后台,确认账户类型选择的是「任何组织目录中的帐户和个人Microsoft帐户」,同时确认回调地址和代码里配置的完全一致,包含前缀、端口、路径,没有拼写错误。另外检查权限配置,确保已经添加了Files.ReadWrite.All和offline_access两个必要权限,缺失offline_access也会导致token返回字段不全。 - 第二步:不修改源码的补丁方案
调用登录逻辑之前,先给库的对应方法打兼容补丁,代码如下:from ms_graph.client import Client # 覆写原有_state方法,添加字段兼容 original_state_method = Client._state def patched_state(self, token_dict): if 'expires_in' not in token_dict: # 优先取expires_on,没有就默认1小时有效期 token_dict['expires_in'] = token_dict.get('expires_on', 3600) return original_state_method(self, token_dict) Client._state = patched_state # 后面正常初始化客户端调用即可 graph_client = Client( client_id="你的应用client_id", client_secret="你的应用client_secret", redirect_uri="你的回调地址" ) graph_client.login() - 第三步:直接修改源码(补丁无效时用)
找到库安装路径下的ms_graph/client.py文件,定位到第144行的报错位置,将原代码中的int(token_dict['expires_in'])修改为:int(token_dict.get('expires_in', token_dict.get('expires_on', 3600)))
内容的提问来源于stack exchange,提问作者imicron3
相关产品推荐
相关产品推荐

