独立应用通过Microsoft Graph API下载OneDrive共享Excel文件的问题
解决Microsoft Graph API访问共享OneDrive Excel文件的问题
一、Graph Explorer中「Item Not found」错误的修复
从/me/insights/shared获取的文件ID属于共享者的OneDrive/SharePoint资源,并非你个人OneDrive(me/drive)内的项,直接用该ID调用/me/drive/items/{drive-item-id}必然找不到资源。
正确访问方式二选一:
- 从
/me/insights/shared返回结果里提取resourceReference.driveId和resourceReference.id,调用:GET https://graph.microsoft.com/v1.0/drives/{drive-id}/items/{item-id}/workbook/worksheets - 使用
shares端点解析共享链接:- 将文件的共享链接做Base64编码(替换特殊字符:
/→_,+→-,删除末尾的=) - 调用:
GET https://graph.microsoft.com/v1.0/shares/{encoded-sharing-url}/driveItem/workbook/worksheets
- 将文件的共享链接做Base64编码(替换特殊字符:
二、Daemon应用(无用户授权)访问共享文件的方案
Daemon应用用客户端凭证流,无用户上下文,因此不能用/me路径,需通过明确的资源标识符访问,步骤如下:
1. 配置应用权限
给应用添加应用权限(而非委派权限),例如:
Files.Read.All:允许访问所有用户的OneDrive文件Sites.Read.All:允许访问SharePoint站点文件
需全局管理员完成权限同意。
2. 获取目标文件的标识信息
提前获取以下任一信息:
- 文件所在的
driveId和itemId(可通过管理员账号在Graph Explorer调用/users/{user-id}/drive/root/children定位,或通过/shares端点解析共享链接获取) - 文件的编码共享链接(按上述Base64编码规则处理)
3. 调用API下载文件
任选一种方式调用下载接口:
方式1:通过driveId和itemId下载
GET https://graph.microsoft.com/v1.0/drives/{drive-id}/items/{item-id}/content
方式2:通过编码共享链接下载
GET https://graph.microsoft.com/v1.0/shares/{encoded-sharing-url}/driveItem/content
注意事项
- Daemon应用仅能访问权限覆盖范围内的资源,若共享文件所在的OneDrive/站点不在权限范围内,会返回访问拒绝错误。
- 若共享文件来自外部组织,需确保租户已开启外部共享权限,且应用权限支持跨组织访问。
内容的提问来源于stack exchange,提问作者Xia
相关产品推荐
相关产品推荐

