PDS 提供的 API,有兩套鑒權體系。除了可以使用 AccessToken 訪問之外,還可以使用阿里雲 AccessKey 簽名訪問。
1. AK 調用方式舉例
使用 AccessKey 簽名的方式,可以調用以下 Endpoint 的所有介面。
Endpoint | 描述 |
Endpoint | 描述 |
| 資源、認證授權 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"
}
2. AK 簽名說明
使用者可以在HTTP請求中增加 Authorization 的Header來包含簽名(Signature)資訊,表明這個訊息已被授權。
2.1 計算方法
這裡參考了 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
表示分行符號。Accept
可以不設定,如果設定,當前只支援:application/json
。Content-MD5
如果body為空白,可以不設定。否則必須設定,表示請求內容資料的MD5值,對訊息內容(不包括頭部)計算MD5值獲得128位元位元字,對該數字進行base64編碼而得到。該要求標頭可用於訊息合法性的檢查(訊息內容是否與發送時一致),如eB5eJF1ptWaXm4bijSPyxw==
。詳情請參見 RFC2616Content-MD5
。Content-Type
可以為空白,表示請求內容的類型,如application/octet-stream
。Date 必須設定,表示此次操作的時間,且必須為GMT格式,如
Sun, 22 Nov 2015 08:16:38 GMT
。CanonicalizedHeaders
表示以x-acs-
為首碼的HTTP Header
的字典序排列。CanonicalizedResource
表示使用者想要訪問的pds資源。其中,Date
和CanonicalizedResource
不可為空;如果請求中的Date時間和PDS伺服器的時間差15分鐘以上,PDS伺服器將拒絕該服務,並返回HTTP 403錯誤。
2.2 構建CanonicalizedHeaders的方法
所有以 x-acs-
為首碼的HTTP Header被稱為CanonicalizedHeaders
。它的構建方法如下:
將所有以
x-acs-
為首碼的HTTP要求標頭的名字轉換成小寫 。如X-ACS-Meta-Name: TaoBao
轉換成x-acs-meta-name: TaoBao
。如果請求是以STS獲得的
AccessKeyId
和AccessKeySecret
發送時,還需要將獲得的security-token
值以x-acs-security-token:security-token
的形式加入到簽名字串中。將上一步得到的所有HTTP要求標頭按照名字的字典序進行升序排列。
刪除要求標頭和內容之間分隔字元兩端出現的任何空格。如
x-acs-meta-name: TaoBao
轉換成:x-acs-meta-name:TaoBao
。將每一個頭和內容用
\n
分隔字元分隔拼成最後的CanonicalizedOSSHeaders
。
CanonicalizedHeaders可以為空白,無需添加最後的 \n。 如果只有一個,則如 x-acs-meta-a\n,注意最後的\n。 如果有多個,則如 x-acs-meta-a:a\nx-acs-meta-b:b\nx-acs-meta-c:c\n,注意最後的\n。
2.3 構建CanonicalizedResource的方法
使用者發送請求中想訪問的PDS介面被稱為CanonicalizedResource
。它的構建方法如下:
將
CanonicalizedResource
置成Null 字元串 “”。放入要訪問的PDS介面,如:
/v2/domain/list
。
2.4 計算簽名頭規則
簽名的字串必須為 UTF-8 格式。含有中文字元的簽名字串必須先進行 UTF-8 編碼,再與
AccessKeySecret
計算最終簽名。簽名的方法用RFC 2104中定義的
HMAC-SHA1
方法,其中Key為AccessKeySecret
。Accept
,Content-Type
和Content-MD5
在請求中不是必須的,但是如果請求需要簽名驗證,空值的話以分行符號\n
代替。在所有非HTTP標準定義的header中,只有以
x-acs-
開頭的header
,需要加入簽名字串;其他非HTTP標準header將被忽略。以
x-acs-
開頭的header在簽名驗證前需要符合以下規範:header的名字需要變成小寫。
header按字典序自小到大排序。
分割header name和value的冒號前後不能有空格。
每個Header之後都有一個分行符號
\n
,如果沒有Header,CanonicalizedHeaders
就設定為空白。
2.5 細節分析
如果設定了
Accept
,則檢查是否為application/json
,否則返回400 Bad Request
。錯誤碼:InvalidHeader
檢查Body Length是否超過 4M,如果超過,返回
400 Bad Request
。錯誤碼為:InvaliField
若使用者要求標頭中
Authorization
值的格式不對,返回400 Bad Request
。錯誤碼:InvaliField
。如果ak為STS開頭,則檢查是否設定
x-acs-security-token
,否則返回403Forbidden
。錯誤碼為:InvalidHeader
如果傳入的
AccessKeyId
不存在或inactive,返回403 Forbidden
。錯誤碼:InvalidParameter
。如果
AccessKeyId
是active的,但PDS判斷使用者的請求發生簽名錯誤,則返回403 Forbidden
。錯誤碼:SignatureDoesNotMatch
;並在返回給使用者的response
中告訴使用者正確的用於驗證加密的簽名字串。使用者可以根據 PDS 的response
來檢查自己的簽名字串是否正確。
3. 許可權控制
API 服務端通過阿里雲RAM(存取控制服務)來校正許可權。您可以在 RAM控制台設定子帳號的 AccessKey 的權限原則。
以下是 API 鑒權參考表:
API | 鑒權 Action | 鑒權 Resource |
API | 鑒權 Action | 鑒權 Resource |
ListStores(/v2/domain/liststores) | pds:ListStores |
|
ListStoreFiles(/v2/storefile/list) | pds:ListStoreFiles |
|
CreateDrive(/v2/drive/create) | pds:CreateDrive |
|
ListDrives(/v2/drive/list) | pds:ListDrives |
|
GetDrive(/v2/drive/get) | pds:GetDrive |
|
UpdateDrive(/v2/drive/update) | pds:UpdateDrive |
|
DeleteDrive(/v2/drive/delete) | pds:DeleteDrive |
|
ListMyDrives(/v2/drive/list_my_drives) | pds:ListMyDrives |
|
ListMyShares(/v2/drive/list_my_shares) | pds:ListMyShares |
|
CreateUser(/v2/user/create) | pds:CreateUser |
|
GetUser(/v2/user/get) | pds:GetUser |
|
ListUsers(/v2/user/list) | pds:ListUser |
|
UpdateUser(/v2/user/update) | pds:UpdateUser |
|
DeleteUser(/v2/user/delete) | pds:DeleteUser |
|
SearchUser(/v2/user/search) | pds:SearchUser |
|
GetUserAccessToken(/v2/user/get_access_token) | pds:GetUserAccessToken |
|
CreateShare(/v2/share/create) | pds:CreateShare |
|
GetShare(/v2/share/get) | pds:GetShare |
|
ListShares(/v2/share/list) | pds:ListShares |
|
UpdateShare(/v2/share/update) | pds:UpdateShare |
|
CreateFile(/v2/file/create) | pds:CreateFile |
|
CreateFileWithSignature(/v2/file/create_with_signature) | pds:CreateFile |
|
ListFiles(/v2/file/list) | pds:ListFiles |
|
CompleteFile(/v2/file/complete) | pds:CreateFile |
|
CompleteFileWithStoreInfo(/v2/file/complete_with_store_info) | pds:CreateFile |
|
GetFileSignature(/v2/file/get_signature) | pds:GetFileSignature |
|
GetFileUploadUrl(/v2/file/get_upload_url) | pds:CreateFile |
|
GetFileDownloadUrl(/v2/file/get_download_url) | pds:GetFile |
|
DeleteFile(/v2/file/delete) | pds:DeleteFile |
|
CopyFile(/v2/file/copy) | pds:CopyFile |
|
MoveFile(/v2/file/move) | pds:MoveFile |
|
UpdateFile(/v2/file/update) | pds:UpdateFile |
|
GetFile(/v2/file/get) | pds:GetFile |
|
DownloadFile(/v2/file/get) | pds:GetFile |
|
BatchDeleteFile(/v2/file/batch_delete) | pds:DeleteFile |
|
GetAsyncTask(/v2/async_task/get) | pds:GetAsyncTask |
|
ListImageTags(/v2/image/list_tags) | pds:ListImageTags |
|
ListImageFaceGroups(/v2/image/list_facegroups) | pds:ListImageFaceGroups |
|
ListFaceGroupImages(/v2/image/list_facegroup_images) | pds:ListFaceGroupImages |
|
Batch(/v2/batch) | pds:Batch |
|