You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Files.ReadWrite.All权限通过Graph API写入OneDrive后下载文件遭拒

问题解决:Flutter应用OneDrive个人版上传成功但下载返回未认证错误

核心分析

上传成功但下载失败且返回unauthenticated错误,结合个人OneDrive(消费者版)特性,核心原因大概率是访问令牌的受众/权限适配问题,或是API请求方式、授权端点的适配偏差。

解决步骤

1. 验证访问令牌的有效性与权限

使用jwt.ms这类令牌解析工具解析你的访问令牌,检查两个关键字段:

  • aud:必须为https://graph.microsoft.com,确保令牌是针对Microsoft Graph生成的
  • scp:必须包含Files.ReadWrite.All或至少Files.Read,确认下载所需的读权限已被正确授予

2. 切换为Item-ID方式下载文件

避免路径寻址可能带来的解析异常,先通过元数据获取文件的item-id,再用ID发起下载请求:

// 1. 获取文件元数据,提取item-id
final metadataResponse = await httpClient.get(
  Uri.https("graph.microsoft.com", "v1.0/me/drive/root:/path/to/file.txt"),
  headers: {"Authorization": "Bearer $oAuthToken"},
);
final itemId = jsonDecode(metadataResponse.body)["id"];

// 2. 使用item-id下载文件内容
final downloadResponse = await httpClient.get(
  Uri.https("graph.microsoft.com", "v1.0/me/drive/items/$itemId/content"),
  headers: {"Authorization": "Bearer $oAuthToken"},
);

3. 修正@microsoft.graph.downloadUrl的访问逻辑

该链接虽为预授权短期链接,但个人OneDrive可能需要附加令牌验证,尝试在请求头中携带Bearer令牌访问:

final downloadUrl = jsonDecode(metadataResponse.body)["@microsoft.graph.downloadUrl"];
final downloadResponse = await httpClient.get(
  Uri.parse(downloadUrl),
  headers: {"Authorization": "Bearer $oAuthToken"},
);

4. 切换为消费者专属授权端点

个人OneDrive建议使用consumers端点而非common,确保令牌适配消费者账户体系:

serviceConfiguration: AuthorizationServiceConfiguration(
  authorizationEndpoint: 'https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize',
  tokenEndpoint: 'https://login.microsoftonline.com/consumers/oauth2/v2.0/token'
),

5. 确认应用注册配置正确性

  • 在Azure应用注册中,确保应用类型为个人Microsoft账户
  • 检查API权限列表,已添加Microsoft Graph的Files.ReadWrite.All(委托权限),且用户登录时已完成权限授权

内容的提问来源于stack exchange,提问作者James Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:43:13