Web服务端应用的OAuth2.0接入流程

本文档主要描述Web服务应用如何通过OAuth2.0接口接入网盘与相册服务。

OAuth2.0简介

OAuth2.0允许用户在不告知第三方自己的账号密码情况下,通过授权方式让第三方服务可以获取自己的资源信息。

OAuth2.0支持Authorization Code、Implicit、Resource Owner Password Credentials、Client Credentials四种授权方式,其中Authorization Code模式的安全系数最高,本文以Authorization Code的授权模式为例介绍。

OAuth2.0中的Authorization Code模式的授权流程如下图所示。

a2

Web 服务应用接入流程

image

调用流程:

  1. 用户登录与授权

    用户访问Web服务应用,Web服务应用将用户重定向到认证服务器,用户决定是否授权Web服务应用。

  2. 获取Access Token

    1. 用户授权后,认证服务器将用户重定向回Web服务应用指定的重定向URI(redirection URI),并附上授权码(code)。

    2. Web服务应用收到授权码后,向认证服务器请求令牌,获取访问令牌(access_token)。

  3. 访问资源

    用户使用访问令牌(access_token)通过Web应用前端访问业务API。

前提条件

  • 需要一个支持OAuth2.0协议能力的服务。

  • 已开通网盘与相册服务(开发者版)。如果您还未开通开发者版服务,具体操作,请参见开始使用 PDS

操作步骤

步骤一:获取应用的ID和Secret

  1. 进入网盘与相册服务(开发者版)域列表

  2. 找到您需要操作的域,在该域的右侧列单击详情

  3. 创建应用。

    说明

    如果未创建应用,请创建应用后再进行后续操作。

    1. 进入域详情页面后,选择应用列表,单击创建应用

    2. 输入和选择页面提示内容,单击确定

      应用的类型请选择为WebServer(Web服务端应用)。

      image

  4. 在应用列表中获取目标应用ID(client_id)和 Secret(client_secret)。

    重要

    Secret要注意保密不要泄露。

步骤二:OAuth2.0登录授权

  1. 设置Authorization参数

    用户通过浏览器访问您的Web服务应用,如果用户还没有认证,您的Web服务应用需要构建一个 Authorization请求,这个请求会带上您的Web服务应用的client_id和要访问Scope等信息,以便让用户向PDS Auth服务(Authorization Server)授权给您的Web服务应用。

    请求示例:

    GET /v2/oauth/authorize?client_id=<ID>&redirect_uri=<redirect_uri>&login_type=<login_type>&scope=<scope>&response_type=code&state=[state] HTTP/1.1
    Host: {domainId}.api.aliyunpds.com

    请求参数说明参见下表:

    参数

    是否必选

    描述

    client_id

    应用ID。获取方式,请参见获取应用的ID和Secret

    redirect_uri

    回调URL,指定认证服务授权后重定向的地址,例如 https://example.com/callback

    授权成功后,用户将被重定向至此地址并携带一次性验证码,例如 https://example.com/callback?code=xxxx

    说明

    请确保回调URL与创建应用时提供的OAuth2.0回调URL相匹配。

    scope

    访问范围列表,描述您的Web服务应用需要的访问权限范围,是在创建应用时填写的权限范围的子集,将在用户同意授权页面展示。请参见Scope说明

    说明

    最终获取到的AccessToken的权限,将是整个scope和用户本身的权限的交集。

    response_type

    此处固定值code

    state

    否,但推荐使用

    若请求携带此参数,认证服务器将原样回传以防止CSRF攻击,例如:https://example.com/callback?code=xxxx&state=abc

    login_type

    登录方式选项。取值范围如下:

    • default:供综合登录页面,包括手机号登录和其他方式。

    • phone:仅限手机号登录。

    • ding:适用于钉钉扫码登录。

    • ldap:适用于LDAP或AD域登录。

    • wx:适用于企业微信登录。

    • ram:适用于阿里云子账号登录。

    • lark:适用于飞书登录。

    • saml:适用于第三方账号通过SAML协议登录。

    hide_consent

    首次登录后是否跳过用户授权页面。取值可选范围如下:

    • true(默认):用户将不会看到授权页面,直接进入下一步。

    • false:可以看到授权页面。

    lang

    界面展示的语言。取值范围如下:

    • zh_CN(默认):简体中文。

    • en_US:英文。

  2. Consent 页面

    在此步骤中,用户可以决定是否授权给 Web 服务应用。如果不同意授权,则流程终止。 如果同意授权,将重定向到第一步请求中的redirect_uri, 比如:https://example.com/callback?code=xxxx&state=abc

  3. 通过code获取AccessToken

    Web服务应用分为前端和后端两部分。前端需配置重定向URIhttps://example.com/callback。前端在接收参数?code=xxx后,应解析出code并将其传递给后端。后端通过以下接口获取AccessToken,并回传给前端。

    请求示例:

    POST /v2/oauth/token HTTP/1.1
    Host: {domainId}.api.aliyunpds.com
    Content-Type: application/x-www-form-urlencoded
    
    code=xxx\
    &client_id=your_app_id\
    &client_secret=your_app_secret\
    &redirect_uri=https://example.com/callback\
    &grant_type=authorization_code

    参数

    是否必选

    描述

    code

    一次性code,使用过一次后即失效。

    client_id

    应用ID。获取方式,请参见获取应用的ID和Secret

    client_secret

    创建应用时生成的secret

    redirect_uri

    回调URL,指定认证服务授权后重定向的地址,例如 https://example.com/callback

    说明

    请确保回调URL与创建应用时提供的OAuth2.0回调URL相匹配。

    grant_type

    授权类型。固定值为authorization_code,表示使用授权码授权方式。

    返回:

    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "access_token":"Aiasd76*****",
      "expires_time":"2019-11-11T10:10:10.009Z",
      "expire_in": 7200,
      "token_type":"Bearer",
      "refresh_token":"LSLKdk*******"
    }

    参数

    位置

    类型

    是否必选

    描述

    access_token

    body

    string

    生成的 access_token,有效期2小时。

    refresh_token

    body

    string

    用来刷新 access_token,有效期比较长,一般为7天。

    expires_time

    body

    string

    access_token的失效时间。

    expire_in

    body

    long

    access_token的有效期,默认:7200,单位:秒。

    token_type

    body

    string

    token类型。固定值为 Bearer

  4. 调用PDS服务API

    Web前端可以直接使用access_token调用PDS API。只需在请求头的Authorization中带上access_token

    调用方式,请参见调用方式

刷新AccessToken

请求示例:

POST /v2/oauth/token HTTP/1.1
Host: {domainId}.api.aliyunpds.com
Content-Type: application/x-www-form-urlencoded

refresh_token=xxx\
&client_id=xxx\
&client_secret=xxx\
&grant_type=refresh_token

请求参数说明参见下表:

参数名称

是否必选

描述

refresh_token

用授权码换取访问令牌时获得的刷新令牌。

client_id

应用ID

grant_type

固定值为refresh_token

client_secret

应用的密钥,用作获取访问令牌时鉴定应用身份的密码。

返回:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "access_token":"xxxxxxxxx",
  "refresh_token": "xxxxx",
  "expires_in":7200,
  "expire_time":"2019-11-11T10:10:10.009Z",
  "token_type":"Bearer"
}

名称

位置

类型

必选

说明

access_token

body

string

生成的 access_token,有效期2小时。

refresh_token

body

string

用来刷新 access_token,有效期比较长,一般为7天。

expires_time

body

string

access_token的失效时间。

expire_in

body

long

access_token的有效期,默认:7200,单位:秒。

token_type

body

string

token类型。固定值为 Bearer

常见问题

授权码的有效期是多久?

授权码有效期为10分钟,使用过一次后失效。

访问令牌的有效期是多久?

访问令牌有效期为2小时。

如何处理令牌过期?

可以使用刷新令牌获取新的访问令牌。

相关文档