OneDrive 身份验证和登录

使用 Microsoft Graph

本主题介绍了如何使用适用于 OneDrive 个人版的 Microsoft 帐户授权应用。 不过,已不再推荐使用这种方法。 应使用 Microsoft Graph 开发新应用,并遵循 Microsoft Graph 中的 OneDrive 授权和登录中的授权流程。

入门

若要使用 OneDrive API,需要拥有访问令牌,以便验证应用是否拥有一组特定的用户权限。 此部分将介绍如何:

  1. 注册应用以获取客户端 ID 和客户端密码。
  2. 使用令牌流或代码流通过指定的作用域让用户登录 OneDrive。
  3. 注销用户(可选)。

OneDrive API 使用标准 OAuth 2.0 身份验证方案对用户进行身份验证,并生成访问令牌。 必须通过以下方式之一为每个 API 调用提供访问令牌。

  • HTTP 头:Authorization: bearer {token}

注册应用

必须向 Microsoft 注册应用,并提供应用的一些详细信息,才能验证应用。

注册应用的具体步骤

若要详细了解如何注册应用,请参阅注册应用以使用 OneDrive API

让用户登录

应用必须使用特定作用域与 Microsoft 帐户授权 Web 服务进行通信,从而启动登录流程,并获取访问令牌。 登录流程遵循标准 OAuth 2.0 身份验证流,并要求从 Web 浏览器或 Web 浏览器控件进行调用。

身份验证作用域

作用域决定了在用户登录时应用获得的访问权限类型。 所有作用域都支持网站单一登录。也就是说,如果用户已登录 OneDrive,可以跳过身份验证流,直接转到授权流。

作用域名称 说明 必需
offline_access 允许应用脱机运行,即使用户处于非活动状态,也不例外。 这为应用提供了 refresh_token,可用于在必要时生成其他访问令牌。 此作用域不适用于令牌流。
onedrive.readonly 授予对用户的所有 OneDrive 文件(包括与用户共享的文件)的只读权限。
onedrive.readwrite 授予对用户的所有 OneDrive 文件(包括与用户共享的文件)的读取和写入权限。 必须有此作用域,才能创建共享链接。
onedrive.appfolder 授予对应用的特定文件夹的读取和写入权限。

例如,典型应用可能会请求获取以下作用域:

onedrive.readwrite offline_access

支持的身份验证流

可以选择下列两种支持的身份验证流:

令牌流

最简单的身份验证流是令牌流。 此流可用于快速获取访问令牌,以交互方式使用 OneDrive API。 由于此流不提供刷新令牌,因此不能用于长期访问 OneDrive API。

令牌流关系图

若要使用令牌流启动登录流程,请使用 Web 浏览器或 Web 浏览器控件加载 URL 请求。

GET https://login.live.com/oauth20_authorize.srf?client_id={client_id}&scope={scope}
    &response_type=token&redirect_uri={redirect_uri}

必需的查询字符串参数

参数名 说明
client_id string 为应用创建的客户端 ID 值。
redirect_uri string 身份验证完成时浏览器重定向到的 URL。
response_type string 授权流应生成的响应类型。 对于授权流,此值必须为 token
scope string 应用所需的作用域列表(用空格分隔)。

将此重定向 URL 用于移动和桌面应用 https://login.live.com/oauth20_desktop.srf

响应

成功验证和授权应用后,Web 浏览器会重定向到添加了其他参数的重定向 URL。

https://login.live.com/oauth20_authorize.srf#access_token=EwC...EB
  &authentication_token=eyJ...3EM&token_type=bearer&expires_in=3600
  &scope=onedrive.readwrite&user_id=3626...1d

在上面的示例中,access_tokenauthentication_tokenuser_id 的值已被截断。 access_tokenauthentication_token 的值相当长。

可以使用 access_token 的值向 OneDrive API 发出请求。

代码流

身份验证代码流流程包含三步,通过单独运行调用来验证和授权应用,并生成使用 OneDrive API 所需的访问令牌。 这样,应用还会收到刷新令牌,以便可以在某些情况下长期使用 API,允许未使用应用的用户进行访问。

授权代码流关系图

第 1 步: 获取授权代码

若要使用代码流启动登录流程,请使用 Web 浏览器或 Web 浏览器控件加载此 URL 请求。

GET https://login.live.com/oauth20_authorize.srf?client_id={client_id}&scope={scope}
  &response_type=code&redirect_uri={redirect_uri}

必需的查询字符串参数

参数名 说明
client_id string 为应用创建的客户端 ID。
scope string 应用所需的作用域列表(用空格分隔)。
redirect_uri string 身份验证完成时浏览器重定向到的 URL。
response_type string 授权流应生成的响应类型。 对于授权流,此值必须为 code

响应

成功验证和授权应用后,Web 浏览器会重定向到添加了其他参数的重定向 URL。

https://login.live.com/oauth20_authorize.srf?code=df6aa589-1080-b241-b410-c4dff65dbf7c

第 2 步: 兑换代码以获取访问令牌

收到 code 值后,可以兑换此代码以获取一组令牌,从而进行 OneDrive API 身份验证。 若要兑换代码,请发出以下请求:

POST https://login.live.com/oauth20_token.srf
Content-Type: application/x-www-form-urlencoded

client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
&code={code}&grant_type=authorization_code

必需的请求正文参数

请求正文是经过正确编码的 URL 字符串,其中包含一些必需参数。

参数名称 说明
client_id string 为应用创建的客户端 ID 值。
redirect_uri string 身份验证完成时浏览器重定向到的 URL。 这应与第一个请求中的 redirect_uri 一致。
client_secret string 为应用创建的客户端密码。
code string 在第一个身份验证请求中收到的授权代码。

注意 对于 Web 应用,重定向 URI 的域部分必须与你在 Microsoft 帐户开发人员中心中指定的重定向 URI 的域部分匹配。

响应

如果调用成功,POST 请求响应中的 JSON 字符串将包含多个属性,包括 access_tokentoken_typerefresh_token(如果请求获取 wl.offline_access 作用域的话)。

{
  "token_type":"bearer",
  "expires_in": 3600,
  "scope":"wl.basic onedrive.readwrite",
  "access_token":"EwCo...AA==",
  "refresh_token":"eyJh...9323"
}

现在,可以存储并使用所提供的 access_token 向 OneDrive API 发出已验证的请求。

重要说明:请安全处理此响应中的 access_tokenrefresh_token 值,就像处理用户密码一样。

访问令牌仅在 expires_in 属性中指定的秒数内有效。 可以使用刷新令牌(若有)或从头开始重复执行身份验证请求流,请求获取新的访问令牌。

第 3 步: 获取新的访问令牌或刷新令牌

如果应用已请求访问 wl.offline_access,这一步将返回 refresh_token,可用于在初始令牌到期后生成其他访问令牌。

若要兑换刷新令牌以获取新的访问令牌,请发出以下请求:

POST https://login.live.com/oauth20_token.srf
Content-Type: application/x-www-form-urlencoded

client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
&refresh_token={refresh_token}&grant_type=refresh_token

必需的请求正文参数

请求正文是经过正确编码的 URL 字符串,其中包含一些必需参数。

参数名称 说明
client_id string 为应用程序创建的客户端 ID。
redirect_uri string 身份验证完成时浏览器发送到的重定向 URL。 这应与第一个请求中使用的 redirect_uri 值匹配。
client_secret string 为应用创建的客户端密码。
refresh_token string 以前收到的刷新令牌。

注意对于 Web 应用,重定向 URI 的域部分必须与在 Live SDK 应用管理站点中指定的重定向 URI 的域部分匹配。

响应

如果调用成功,POST 请求响应中的 JSON 字符串将包含多个属性,包括 access_tokenauthentication_tokenrefresh_token(如果请求获取 wl.offline_access 作用域的话)。

{
  "token_type":"bearer",
  "expires_in": 3600,
  "scope": "wl.basic onedrive.readwrite wl.offline_access",
  "access_token":"EwCo...AA==",
  "refresh_token":"eyJh...9323"
}

现在,可以存储并使用 access_token 向 OneDrive API 发出已验证的请求。

重要说明:请安全处理此响应中的 access_tokenrefresh_token 值,就像处理用户密码一样。

访问令牌仅在 expires_in 属性中指定的秒数内有效。 可以使用刷新令牌(若有)或从头开始重复执行身份验证请求流,请求获取新的访问令牌。

注销用户

若要注销用户,请按照下列步骤操作:

  1. 删除之前从 OAuth 流收到的任何已缓存 access_tokenrefresh_token 值。
  2. 在应用中执行任意注销操作(例如,清除本地状态、删除所有缓存项等)。
  3. 使用以下 URL 调用授权 Web 服务:
GET https://login.live.com/oauth20_logout.srf?client_id={client_id}&redirect_uri={redirect_uri}

此调用将删除所有启用单一登录的 Cookie,并确保在应用下一次启动登录流程时,用户必须输入用户名和密码,才能继续操作。

必需的查询字符串参数

参数名 说明
client_id string 为应用创建的客户端 ID 值。
redirect_uri string 身份验证完成时浏览器重定向到的 URL。 这必须与获取令牌请求中使用的 redirect_uri 值完全一致。

删除 Cookie 后,浏览器将重定向到所提供的重定向 URL。 当浏览器加载重定向页时,不会设置任何身份验证查询字符串参数,可以推断用户已注销。

撤消访问权限

用户可以访问 Microsoft 帐户管理许可页,撤消应用对自己帐户的访问权限。

撤消应用许可后,之前向应用提供的所有刷新令牌都会失效。 需要重复执行身份验证流,从头开始请求获取新的访问令牌和刷新令牌。

错误

如果身份验证出错,Web 浏览器会重定向到报错网页。 虽然报错网页始终都会显示最终用户易懂消息,但也可以参考报错网页 URL 包含的其他信息,此类信息有助于调试所遇到的错误。 这种信息并非总是显示在浏览器内的报错网页内容中。

https://login.live.com/err.srf?lc=1033#error={error_code}&error_description={message}

URL 中包含查询参数,可用来分析错误并采取相应的措施。 这些参数(# 字符后)始终可以添加为书签。 报错网页内容始终都会显示用户易懂的一般错误消息。

如果用户选择不许可应用,流会重定向到 redirect_uri,URL 中也包含相同的错误参数。

错误参数

参数名称 说明
error string 标识所发生的错误的错误代码。
error_description string 错误说明。

下列主题简要概述了 OneDrive API 的其他概念。