OneDrive API:未经身份验证,必须经过身份验证才能使用' / drive'句法

时间:2018-04-26 06:31:35

标签: rest api authentication offline onedrive

我正在使用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;身份验证的语法?

提前致谢!

1 个答案:

答案 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_tokenrefresh_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_tokenrefresh_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并且它有效。