Teams机器人上传文件至OneDrive遇scp/roles claim错误求助
问题解答
错误原因
scp和roles是Azure AD令牌中的权限标识:
scp:代表用户授权给应用的权限(委托权限),仅在用户参与登录的认证流程中出现在令牌里。roles:代表应用自身拥有的独立权限(应用权限),使用客户端凭证流(client_credentials)获取令牌时,仅会包含该标识。
你遇到的错误是因为获取到的访问令牌中既没有scp也没有roles,导致Microsoft Graph API判定无权限执行操作。
疑问1解答
权限缺失问题出在机器人的Azure AD应用配置中,并非初始认证请求的参数问题。你使用的是客户端凭证流,该流程的令牌应包含roles标识,但目前没有,说明你的Azure AD应用要么未配置对应的应用权限,要么配置后未完成管理员同意步骤。
疑问2解答
需要在Azure AD应用中配置对应权限并完成管理员同意,分两种场景处理:
上传文件到发起请求用户的OneDrive
- 客户端凭证流不适用此场景,需切换为授权码流(需用户登录授权)
- 在Azure AD应用的「API权限」中添加
Files.ReadWrite(委托权限) - 用户授权后获取的令牌会包含
scp标识,即可正常调用上传接口
上传文件到应用自身/指定服务账户的OneDrive
- 在Azure AD应用的「API权限」中添加
Files.ReadWrite.All或Sites.ReadWrite.All(应用权限) - 点击「授予管理员同意」(需全局管理员权限操作)
- 重新获取令牌,此时令牌会包含
roles标识 - 同时需修改上传请求路径,指定具体用户的Drive:
POST /v1.0/users/{目标用户ID}/drive/root:/filename.txt:/content HTTP/1.1 Host: graph.microsoft.com Authorization: Bearer <你的访问令牌> Content-Type: text/plain hello_world
- 在Azure AD应用的「API权限」中添加
额外验证步骤
可将获取到的令牌复制到JWT解析工具中,检查令牌内容是否包含scp或roles字段,以此验证权限配置是否生效。
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

