本文档主要描述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模式的授权流程如下图所示。
Web 服务应用接入流程
调用流程:
用户登录与授权
用户访问Web服务应用,Web服务应用将用户重定向到认证服务器,用户决定是否授权Web服务应用。
获取Access Token
用户授权后,认证服务器将用户重定向回Web服务应用指定的重定向URI(redirection URI),并附上授权码(code)。
Web服务应用收到授权码后,向认证服务器请求令牌,获取访问令牌(access_token)。
访问资源
用户使用访问令牌(access_token)通过Web应用前端访问业务API。
前提条件
需要一个支持OAuth2.0协议能力的服务。
已开通网盘与相册服务(开发者版)。如果您还未开通开发者版服务,具体操作,请参见开始使用 PDS。
操作步骤
步骤一:获取应用的ID和Secret
进入网盘与相册服务(开发者版)的域列表。
找到您需要操作的域,在该域的右侧列单击详情。
创建应用。
说明如果未创建应用,请创建应用后再进行后续操作。
进入域详情页面后,选择应用列表,单击创建应用。
输入和选择页面提示内容,单击确定。
应用的类型请选择为WebServer(Web服务端应用)。
在应用列表中获取目标应用ID(client_id)和 Secret(client_secret)。
重要Secret要注意保密不要泄露。
步骤二:OAuth2.0登录授权
设置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:英文。
Consent 页面
在此步骤中,用户可以决定是否授权给 Web 服务应用。如果不同意授权,则流程终止。 如果同意授权,将重定向到第一步请求中的
redirect_uri
, 比如:https://example.com/callback?code=xxxx&state=abc
。通过code获取AccessToken
Web服务应用分为前端和后端两部分。前端需配置重定向URI
https://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
。调用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 | 是 | 应用 |
grant_type | 是 | 固定值为 |
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 | 是 | 生成的 |
refresh_token | body | string | 是 | 用来刷新 |
expires_time | body | string | 是 |
|
expire_in | body | long | 是 |
|
token_type | body | string | 是 | token类型。固定值为 |
常见问题
相关文档
网盘与相册服务(开发者版) API调用相关信息。请参考调用方式文档。
如需将移动端和桌面端通过OAuth2.0接口接入到网盘与相册服务,请参考移动端和桌面端应用的OAuth2.0接入流程文档进行操作。
如需将Web浏览器应用通过OAuth2.0接口接入到网盘与相册服务,请参考Web浏览器应用的OAuth2.0接入流程文档进行操作。