PDS 提供的 API,有两套鉴权体系。除了可以使用 AccessToken 访问之外,还可以使用阿里云 AccessKey 签名访问。
使用 AccessKey 签名的方式,可以调用以下 Endpoint 的所有接口, 请看API参考。
Endpoint | 描述 |
---|---|
https://${domainID}.api.aliyunpds.com |
资源 API |
https://${domainID}.auth.aliyunpds.com |
认证授权 API |
举例:
POST /v2/drive/list
Host: ${domainID}.api.aliyunpds.com
Authorization: acs ${ACCESS_KEY_ID}:${SIGNATURE}
Content-Type: application/json; charset=UTF-8
{
"owner": "xxxx"
}
用户可以在HTTP请求中增加 Authorization 的Header来包含签名(Signature)信息,表明这个消息已被授权。
这里参考了 aliyun sdk 的 RoaRequest,确保 aliyun sdk可以调通
Authorization = "acs " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ Accept + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedHeaders
+ CanonicalizedResource))
AccessKeySecret
表示签名所需的密钥。VERB
表示HTTP 请求的Method,当前只支持 POST 。\n
表示换行符。Accpet
可以不设置,如果设置,当前只支持:application/json
。Content-MD5
如果body为空,可以不设置。否则必须设置,表示请求内容数据的MD5值,对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码而得到。该请求头可用于消息合法性的检查(消息内容是否与发送时一致),如 eB5eJF1ptWaXm4bijSPyxw==
。详情请参见 RFC2616 Content-MD5
。Content-Type
可以为空,表示请求内容的类型,如 application/octet-stream
。Sun, 22 Nov 2015 08:16:38 GMT
。CanonicalizedHeaders
表示以 x-acs-
为前缀的 HTTP Header
的字典序排列。CanonicalizedResource
表示用户想要访问的ccp资源。其中,Date
和 CanonicalizedResource
不能为空;如果请求中的Date时间和CCP服务器的时间差15分钟以上,OSS服务器将拒绝该服务,并返回HTTP 403错误。所有以 x-acs-
为前缀的HTTP Header被称为CanonicalizedHeaders
。它的构建方法如下:
x-acs-
为前缀的HTTP请求头的名字转换成小写 。如X-ACS-Meta-Name: TaoBao
转换成x-oss-meta-name: TaoBao
。AccessKeyId
和AccessKeySecret
发送时,还需要将获得的security-token
值以 x-acs-security-token:security-token
的形式加入到签名字符串中。x-oss-meta-name: TaoBao
转换成:x-oss-meta-name:TaoBao
。\n
分隔符分隔拼成最后的CanonicalizedOSSHeaders
。说明
CanonicalizedHeaders
可以为空,无需添加最后的\n
。- 如果只有一个,则如
x-acs-meta-a\n
,注意最后的\n
。- 如果有多个,则如
x-acs-meta-a:a\nx-oss-meta-b:b\nx-oss-meta-c:c\n
,注意最后的\n
。
用户发送请求中想访问的OSS目标资源被称为CanonicalizedResource
。它的构建方法如下:
CanonicalizedResource
置成空字符串 “”。/BucketName/ObjectName
(如果没有ObjectName则CanonicalizedResource
为 /BucketName/
,如果同时也没有BucketName则为/
)。&
为分隔符生成子资源字符串。在CanonicalizedResource
字符串尾添加 ?
和子资源字符串。此时的CanonicalizedResource
如:/BucketName/ObjectName?acl&uploadId=UploadId
。AccessKeySecret
计算最终签名。HMAC-SHA1
方法,其中Key为 AccessKeySecret
。Accept
,Content-Type
和Content-MD5
在请求中不是必须的,但是如果请求需要签名验证,空值的话以换行符 \n
代替。x-acs-
开头的header
,需要加入签名字符串;其他非HTTP标准header将被忽略(如下方签名示例中的x-acs-magic
是需要加入签名字符串的)。x-acs-
开头的header在签名验证前需要符合以下规范:\n
,如果没有Header,CanonicalizedOSSHeaders
就设置为空。Accept
,则检查是否为 application/json
,否则返回400 Bad Request
。错误码:InvalidHeader
400 Bad Request
。错误码为:InvaliField
Authorization
值的格式不对,返回400 Bad Request
。错误码:InvaliField
。x-acs-security-token
,否则返回403 Forbidden
。错误码为:InvalidHeader
AccessKeyId
不存在或inactive,返回403 Forbidden
。错误码:InvalidParameter
。AccessKeyId
是active的,但ccp判断用户的请求发生签名错误,则返回403 Forbidden
。错误码:SignatureDoesNotMatch
;并在返回给用户的response
中告诉用户正确的用于验证加密的签名字符串。用户可以根据 CCP 的response
来检查自己的签名字符串是否正确。API 服务端通过阿里云RAM(访问控制服务)来校验权限。您可以在 RAM控制台 设置子账号的 AccessKey 的权限策略。
以下是 API 鉴权参考表:
API | 鉴权 Action | 鉴权 Resource |
---|---|---|
ListStores(/v2/domain/liststores) | ccp:ListStores | acs:ccp:$regionid:$accountid:domain/$domainid/store/* |
ListStoreFiles(/v2/storefile/list) | ccp:ListStoreFiles | acs:ccp:$regionid:$accountid:domain/$domainid |
CreateDrive(/v2/drive/create) | ccp:CreateDrive | acs:ccp:$regionid:$accountid:domain/$domainid/drive/* |
ListDrives(/v2/drive/list) | ccp:ListDrives | acs:ccp:$regionid:$accountid:domain/$domainid/drive/* |
GetDrive(/v2/drive/get) | ccp:GetDrive | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
UpdateDrive(/v2/drive/update) | ccp:UpdateDrive | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
DeleteDrive(/v2/drive/delete) | ccp:DeleteDrive | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
ListMyDrives(/v2/drive/list_my_drives) | ccp:ListMyDrives | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
ListMyShares(/v2/drive/list_my_shares) | ccp:ListMyShares | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
CreateUser(/v2/user/create) | ccp:CreateUser | acs:ccp:$regionid:$accountid:domain/$domainid/user/* |
GetUser(/v2/user/get) | ccp:GetUser | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
ListUsers(/v2/user/list) | ccp:ListUser | acs:ccp:$regionid:$accountid:domain/$domainid/user/* |
UpdateUser(/v2/user/update) | ccp:UpdateUser | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
DeleteUser(/v2/user/delete) | ccp:DeleteUser | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
SearchUser(/v2/user/search) | ccp:SearchUser | acs:ccp:$regionid:$accountid:domain/$domainid/user/* |
GetUserAccessToken(/v2/user/get_access_token) | ccp:GetUserAccessToken | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
CreateShare(/v2/share/create) | ccp:CreateShare | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
GetShare(/v2/share/get) | ccp:GetShare | acs:ccp:$regionid:$accountid:domain/$domainid/share/$shareid |
ListShares(/v2/share/list) | ccp:ListShares | acs:ccp:$regionid:$accountid:domain/$domainid/share/* |
UpdateShare(/v2/share/update) | ccp:UpdateShare | acs:ccp:$regionid:$accountid:domain/$domainid/share/$shareid |
CreateFile(/v2/file/create) | ccp:CreateFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
CreateFileWithSignature(/v2/file/create_with_signature) | ccp:CreateFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid or acs:ccp:$regionid:$accountid:domain/$domainid/share/$shareid |
ListFiles(/v2/file/list) | ccp:ListFiles | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
CompleteFile(/v2/file/complete) | ccp:CreateFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
CompleteFileWithStoreInfo(/v2/file/complete_with_store_info) | ccp:CreateFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
GetFileSignature(/v2/file/get_signature) | ccp:GetFileSignature | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
GetFileUploadUrl(/v2/file/get_upload_url) | ccp:CreateFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
GetFileDownloadUrl(/v2/file/get_download_url) | ccp:GetFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
DeleteFile(/v2/file/delete) | ccp:DeleteFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
CopyFile(/v2/file/copy) | ccp:CopyFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
MoveFile(/v2/file/move) | ccp:MoveFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
UpdateFile(/v2/file/update) | ccp:UpdateFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
GetFile(/v2/file/get) | ccp:GetFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
DownloadFile(/v2/file/get) | ccp:GetFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
BatchDeleteFile(/v2/file/batch_delete) | ccp:DeleteFile | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
GetAsyncTask(/v2/async_task/get) | ccp:GetAsyncTask | acs:ccp:$regionid:$accountid:domain/$domainid/user/$userid |
ListImageTags(/v2/image/list_tags) | ccp:ListImageTags | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
ListImageFaceGroups(/v2/image/list_facegroups) | ccp:ListImageFaceGroups | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
ListFaceGroupImages(/v2/image/list_facegroup_images) | ccp:ListFaceGroupImages | acs:ccp:$regionid:$accountid:domain/$domainid/drive/$driveid |
Batch(/v2/batch) | ccp:Batch | acs:ccp:$regionid:$accountid:* |
企业IT基础设施平台的重新构建是一项复杂的任务。重新构建平台通常由一系列变化...
每日精选内容推荐 云原生分布式数据库PolarDB技术深度解密 无论是部署量还是规模...
现在由于主机空间的VPS技术发展,使用 VPS主机 的站长是越来越多。对于才接触VPS...
2020年11月24日,第四届全国工业大数据创新竞赛决赛答辩在深圳举行。宝安区委常...
约束与限制 只有运行中的云服务器云主机才允许用户登录。 Windows操作系统用户名...
随着互联网普及信息化的发展,虚拟主机市场在不断扩大。90%的企业网站选择虚拟主...
作者 七琦 审校 泰一 前言 在现实生活中 会议所处的环境是极具多样性的 包括开阔...
2020年12月18日,在为期三周的亚马逊re:Invent全球大会即将闭幕之际,亚马逊全球...
2020年11月编程语言排行:C、Python、Java,9-20名也有不同程度的变化:R语言、P...
TOP云 (west.cn)5月5日消息,五一节假日期间,当大家在各个景点排队打卡时,有...