我正在使用OneDrive api在我的Ruby on Rails应用程序中上传文件,OneDrive API开始使用endpoint / drive / root上传文件时出现未经身份验证的错误:/#{filename}:/ content。错误如下:
{"error"=>{"code"=>"unauthenticated", "message"=>"Must be authenticated to use '/drive' syntax"}}
然后我使用范围files.readwrite offline_access跟随OneDrive文档获得了一个新的refresh_token。
对于OneDrive身份验证,我发送POST请求到端点https://login.microsoftonline.com/common/oauth2/v2.0/token以使用带有以下标头和正文的refresh_token获取access_token:
headers = { 'Content-Type' => 'application/x-www-form-urlencoded' }
body = {
'client_id' => "<Client ID>",
'grant_type' => "refresh_token",
'redirect_uri' => "<Redirect URI>",
'client_secret' => "<Client Secret>",
'refresh_token' => "<Refresh Token>",
}
我是否使用正确的端点从refresh_token获取access_token?
我用来将文件上传到OneDrive的基础uri是https://api.onedrive.com/v1.0
任何人都可以帮助我,为什么我会收到未经身份验证的错误,或者我如何使用&#39; / drive&#39;身份验证的语法?
提前致谢!
答案 0 :(得分:0)
<强>解决:强>
在我的情况下,我使用“代码流”进行身份验证,并使用以下网址在参数中获取code
:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=CLIENT_ID&scope=files.readwrite offline_access&response_type=code&redirect_uri=REDIRECT_URI
访问上面的网址时,我打开了一个带有code
参数的重定向网址,我用它来获取access_token
和refresh_token
,但是access_token无法将文件上传到OneDrive并重新调整提到的“未经验证的”错误。
进行研究后,我发现我用于获取code
OneDrive身份验证的网址是Microsoft Graph。 Microsoft帐户的正确URL如下所示:
https://login.live.com/oauth20_authorize.srf?client_id=CLIENT_ID&scope=onedrive.readwrite offline_access&response_type=code&redirect_uri=REDIRECT_URI
在浏览器中访问上述网址会将我重定向到包含代码参数的页面,但它是像K9vb4e786-afg6-1a3b-1234-12abc01234ca
这样的小代码。
我使用此代码使用以下POST请求获取access_token
和refresh_token
:
body = {
client_id: "CLIENT_ID",
redirect_uri: "REDIRECT_URI",
client_secret: "CLIENT_SECRET",
code: "CODE",
grant_type: "authorization_code"
}
headers = { 'Content-Type' => 'application/x-www-form-urlencoded' }
r=HTTParty.post('https://login.live.com/oauth20_token.srf', headers: headers, body: body)
此请求返回了access_token和refresh_token作为响应。我使用此refresh_token
在每个请求中获得access_token
并成功上传文件。
结论:我使用的是Microsoft Graph身份验证流程,即https://docs.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth,这是不正确的。然后我遵循Microsoft帐户身份验证,即https://docs.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/msa-oauth解决了问题。
<强>更新强>
后来我使用Office-365商业帐户进行OneDrive文件上传。对于此帐户,OneDrive身份验证过程是不同的,即https://docs.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/aad-oauth并且它有效。