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
相关产品推荐
相关产品推荐

