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

Ruby on Rails应用调用OneDrive API上传文件遇未认证错误求助

解决OneDrive API上传时的"unauthenticated"错误

我之前在Rails项目里调用OneDrive API上传文件时,也碰到过完全一样的错误,咱们一步步来排查和解决:

1. 确认请求的Authorization头是否正确

这是最常见的问题:不要把refresh_token直接用于API请求,必须用通过refresh_token刷新得到的access_token,并且在请求头里带上Authorization: Bearer <你的access_token>。

举个Rails里用Faraday实现的正确示例:

# 先确保你已经通过refresh_token获取到了有效的access_token
access_token = refresh_access_token # 这里是你用refresh_token换新access_token的自定义方法

conn = Faraday.new(url: 'https://graph.microsoft.com/v1.0') do |faraday|
  faraday.headers['Authorization'] = "Bearer #{access_token}"
  faraday.headers['Content-Type'] = 'application/octet-stream'
  faraday.adapter Faraday.default_adapter
end

# 上传文件的请求(注意对文件名做URL编码处理)
response = conn.put("/drive/root:/#{URI.encode(filename)}:/content") do |req|
  req.body = File.open(file_path, 'rb')
end

2. 验证access_token的有效性和权限范围

  • 检查access_token是否过期:OneDrive的access_token默认有效期是1小时,过期后必须用refresh_token重新获取,不能继续使用旧的token。
  • 解码access_token查看scope:你可以用本地的JWT解码工具检查token的scope字段,确认包含files.readwrite或者files.readwrite.all权限。如果scope里没有这个权限,就算refresh_token正确,新的access_token也没有上传权限。

3. 确认OAuth2认证流程是否完整

确保你的认证流程是正确的:

  • 第一步:引导用户授权,获取授权code(此时scope必须包含files.readwrite offline_access)
  • 第二步:用授权code交换初始的access_token和refresh_token
  • 第三步:每次调用API前,检查access_token是否过期,过期则用refresh_token获取新的access_token
  • 第四步:用最新的access_token调用上传端点

很多人会跳过第三步,直接用初始的access_token,导致过期后出现未认证错误。

4. 检查API端点是否正确

确保你调用的是Microsoft Graph的官方端点:

https://graph.microsoft.com/v1.0/drive/root:/#{filename}:/content

不要使用旧版的OneDrive API端点(比如https://api.onedrive.com/v1.0),虽然旧端点可能兼容,但Graph端点的权限验证逻辑更清晰,也更推荐使用。

如果以上步骤都检查过还是有问题,可以打印出你的请求头和获取access_token的响应,确认access_token确实被正确获取并添加到请求里——有时候可能是代码里的变量名写错,导致access_token没有被正确传入请求头。

内容的提问来源于stack exchange,提问作者Faisal Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:06