调用OneDrive for Business REST API上传文件时遇令牌签名无效错误
排查OneDrive for Business API的「Token contains invalid signature」错误
结合你描述的操作流程,我来帮你梳理几个最可能导致这个签名无效错误的原因,以及对应的排查和解决办法:
1. 租户端点或Token受众不匹配
你在获取Token时用了common端点(https://login.microsoftonline.com/common/oauth2/token),但调用API时用了<tenant>占位符的端点。这里有两个关键点要注意:
- 如果你的应用是单租户应用(注册在特定租户下),获取Token时应该使用具体的租户ID或域名(比如
https://login.microsoftonline.com/yourtenant.onmicrosoft.com/oauth2/token),而不是common——common是多租户应用的端点,可能导致生成的Token受众(aud字段)和你调用的API不匹配。 - 调用OneDrive for Business API的正确端点推荐使用Microsoft Graph的标准路径:
https://graph.microsoft.com/v1.0/me/drive/root:/Abc.txt:/content,而不是旧的租户内API路径。如果坚持用旧路径,要确保Token的aud字段和该端点的域名完全一致(可以用JWT解码工具查看Token内容)。
2. Token获取流程的参数错误
你在Postman调用token接口时,有没有确认以下参数完全正确?
grant_type必须设为authorization_code,不能填错。redirect_uri必须和Azure门户应用注册里的完全一致,包括大小写、结尾的斜杠、HTTP/HTTPS协议,比如注册的是https://yourapp.com/callback,就不能用https://yourapp.com/Callback或省略斜杠。- 必须指定
scope参数,比如scope=Files.ReadWrite offline_access——如果没有指定scope,生成的Token权限不足,或者受众不符合API要求,会直接导致签名验证失败。 - 客户端密钥(
client_secret)有没有复制错误?比如多了空格、少了字符,或者用了证书密钥而不是客户端密码。
3. 权限配置问题
你提到“授予所有权限”,但要注意:
- 确保添加的是Microsoft Graph的权限(不是其他第三方API或旧版SharePoint API的权限),上传文件需要的核心权限是
Files.ReadWrite(委托权限)或Files.ReadWrite.All(应用权限)。 - 如果是应用权限(而非用户委托权限),必须点击“授予管理员同意”按钮,确保权限处于“已授予”状态(在Azure门户的应用注册→API权限页面可以查看)。
4. Azure应用程序的基础设置错误
- 检查应用注册的“身份验证”页面:是否开启了正确的重定向URI类型?Web应用应该选择“Web”类型,而不是“SPA”或“移动和桌面应用”。
- 如果是单租户应用,在“概述”页面的“受支持的账户类型”应该设为“仅此组织目录中的账户”,而不是“任何组织目录中的账户”,否则用
common端点会导致Token生成异常。
快速排查步骤
- 用JWT解码工具打开你的访问令牌,查看
aud(受众)、iss(颁发者)、scope(权限范围)三个字段:aud必须和你调用的API端点域名一致(比如Graph API的aud是https://graph.microsoft.com)。scope必须包含你需要的权限(比如Files.ReadWrite)。
- 重新在Postman中构造token请求,确保所有参数(尤其是
scope、redirect_uri)完全符合要求,示例请求的form-data参数如下:grant_type: authorization_code client_id: <你的A_ID> client_secret: <你的客户端密钥> code: <获取到的授权code> redirect_uri: <和注册一致的重定向URI> scope: Files.ReadWrite offline_access - 尝试改用Microsoft Graph的API端点上传文件,确认是否能正常请求。
内容的提问来源于stack exchange,提问作者Prateek Garg
相关产品推荐
相关产品推荐

