Photo and Drive Service (PDS) API は、2 つの認証モードをサポートしています。アクセストークンに基づく認証に加えて、PDS API は AccessKey ペアに基づく認証もサポートしています。AccessKey ペアを使用して API リクエストに署名し、署名付きリクエストを送信して API 操作を呼び出すことができます。
1. AccessKey ペアを使用して API 操作を呼び出すサンプルリクエスト
AccessKey ペアを使用して署名されたリクエストを送信することで、以下のエンドポイント内のすべての API 操作を呼び出すことができます。
エンドポイント | 説明 |
| リソース関連の API 操作と認証および認可 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. AccessKey ペアを使用してリクエストに署名する
HTTP リクエストに Authorization ヘッダーを追加して、リクエストに署名を含めることができます。この署名は、リクエストが承認されていることを示します。
2.1 署名の計算方法
次の例では、Alibaba Cloud SDK のリソース指向アーキテクチャ (ROA) リクエストスタイルを使用しています。Alibaba Cloud 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: リクエストの署名に使用する AccessKey シークレット。VERB: HTTP リクエストのメソッド。値を POST に設定します。\n: 改行。Accept: オプション。このヘッダーを指定する場合は、値をapplication/jsonに設定します。Content-MD5: リクエストコンテンツの MD5 ハッシュ。リクエスト本文が空でない場合にのみ、このヘッダーを指定する必要があります。ヘッダーを除くリクエストコンテンツの MD5 ハッシュを計算して、128 ビットの数値を取得します。この数値を Base64 でエンコードして、このヘッダーの値を取得します。このヘッダーを使用して、受信したリクエストコンテンツが送信されたリクエストコンテンツと同じであるかどうかを確認できます。例:eB5eJF1ptWaXm4bijSPyxw==。詳細については、Request for Comments (RFC) 2616 のContent-MD5を参照してください。Content-Type: オプション。このヘッダーは、リクエストコンテンツのタイプを指定します。例:application/octet-stream。Date: 必須。このヘッダーは、リクエストが送信された時刻をグリニッジ標準時 (GMT) で指定します。例:
Sun, 22 Nov 2015 08:16:38 GMT。CanonicalizedHeaders:x-acs-というプレフィックスが付いた HTTP ヘッダー。ヘッダーはアルファベット順に並べられています。CanonicalizedResource: アクセスする PDS リソース。DateヘッダーとCanonicalizedResource文字列は必須です。リクエストの Date ヘッダーで指定された時刻と、リクエストが受信されたときの PDS サーバーの時刻の差が 15 分を超える場合、PDS はリクエストを拒否し、HTTP ステータスコード 403 を返します。
2.2 CanonicalizedHeaders 文字列の作成方法
CanonicalizedHeaders 文字列は、x-acs- というプレフィックスが付いたすべての HTTP ヘッダーで構成されます。CanonicalizedResource 文字列を作成するには、次の手順を実行します。
x-acs-というプレフィックスが付いたすべての HTTP ヘッダーの名前を小文字に変換します。たとえば、X-ACS-Meta-Name: TaoBaoをx-acs-meta-name: TaoBaoに変換します。Security Token Service (STS) によって提供された AccessKey ペアを使用してリクエストが送信される場合は、
security-token値をx-acs-security-token:security-tokenの形式で CanonicalizedHeaders 文字列に追加します。前の手順で取得したすべての HTTP ヘッダーをアルファベット順にソートします。
各ヘッダーと値の間の区切り文字の両側のスペースをすべて削除します。たとえば、
x-acs-meta-name: TaoBaoをx-acs-meta-name:TaoBaoに変換します。区切り文字
\nで 2 つのヘッダーとその値のペアを区切って、CanonicalizedHeaders文字列を取得します。
リクエストに x-acs- というプレフィックスが付いた HTTP ヘッダーが含まれていない場合は、CanonicalizedHeaders 文字列を空のままにすることができます。この場合、空の文字列に末尾の \n 区切り文字を追加する必要はありません。リクエストに x-acs- というプレフィックスが付いた 1 つ以上の HTTP ヘッダーが含まれている場合は、取得した CanonicalizedHeaders 文字列に末尾の \n 区切り文字を追加する必要があります。例: x-acs-meta-a\n および x-acs-meta-a:a\nx-acs-meta-b:b\nx-acs-meta-c:c\n。
2.3 CanonicalizedResource 文字列の作成方法
CanonicalizedResource 文字列は、アクセスする PDS リソースを指定します。CanonicalizedResource 文字列を作成するには、次の手順を実行します。
CanonicalizedResource文字列を空の文字列 "" に設定します。アクセスする PDS リソースを空の文字列に追加します。例:
/v2/domain/list。
2.4 署名の計算規則
署名対象の文字列は UTF-8 でエンコードする必要があります。UTF-8 エンコードされた署名対象の文字列と
AccessKeySecretを使用して署名を計算します。RFC 2104 で定義されている
HMAC-SHA1メソッドを使用して署名を計算します。このメソッドでは、AccessKeySecretがキーとして使用されます。Accept、Content-Type、およびContent-MD5ヘッダーは、リクエストではオプションです。リクエストでこれらのヘッダーが空の場合、リクエストの署名を計算するときに、改行 (\n) に置き換えます。すべての非標準 HTTP ヘッダーの中で、
x-acs-というプレフィックスが付いたヘッダーのみを署名対象の文字列に追加する必要があります。その他の非標準 HTTP ヘッダーは無視されます。署名対象の文字列内の
x-acs-というプレフィックスが付いたヘッダーは、次の規則に準拠する必要があります。ヘッダー名は小文字です。
ヘッダーはアルファベット順にソートされます。
各ヘッダー名と値を区切るコロン (:) の前後にスペースはありません。
各ヘッダーの後には改行 (
\n) が続きます。リクエストに x-acs- というプレフィックスが付いたヘッダーが含まれていない場合は、CanonicalizedHeaders文字列を末尾の \n 区切り文字のない空の文字列として指定します。
2.5 トラブルシューティング
Acceptヘッダーを指定する場合は、値がapplication/jsonであることを確認します。そうでない場合、エラー400 Bad Requestが返されます。エラーコードはInvalidHeaderです。本文の長さが 4 MB を超えていないことを確認します。本文の長さが 4 MB を超える場合、エラー
400 Bad Requestが返されます。エラーコードはInvaliFieldです。Authorizationヘッダーの形式が無効な場合、エラー400 Bad Requestが返されます。エラーコードはInvaliFieldです。AccessKey ID が STS で始まる場合は、
x-acs-security-tokenヘッダーが設定されていることを確認します。そうでない場合、エラー403 Forbiddenが返されます。エラーコードはInvalidHeaderです。AccessKey IDが存在しないか、無効状態の場合、エラー403 Forbiddenが返されます。エラーコードはInvalidParameterです。AccessKey IDが有効状態であるが、PDS がリクエストの署名が無効であることを検出した場合、エラー403 Forbiddenが返されます。エラーコードはSignatureDoesNotMatchです。署名の検証に使用される署名対象の文字列もresponseで返されます。レスポンスに基づいて、署名文字列が正しいかどうかを確認できます。
3. 権限制御
PDS API サーバーは、Alibaba Cloud Resource Access Management (RAM) を使用して権限を検証します。RAM コンソール で使用する RAM ユーザーの AccessKey ペアの権限ポリシーを設定できます。
次の表は、各 API 操作で検証されるアクションとリソースを示しています。
操作 | アクション | リソース |
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 |
|