久々にプログラミング関係を更新。
今回は、MicrosoftのAzureへREST APIを使用してBLOB操作してみた。
PHP版です。
今回は、指定したコンテナーに登録されているBLOB一覧を取得するサンプルです。
■ Microsoft Azureのサイト
https://msdn.microsoft.com/ja-jp/library/azure/dd135734.aspx
操作には、Azureへ認証キーなどを渡す必要があります。
■ API
リクエストは、「GET」で、以下のURLへ操作を行います。
Request | GET |
URL | https://myaccount.blob.core.windows.net/mycontainer?comp=list&restype=container |
リクエストには、いくつかのヘッダーを指定してやらないといけません。
Authorization | 必須 |
Data または x-ms-date | どちらか必須。 形式はこんな感じ。 Tue, 28 Jun 2016 07:16:18 GMT |
x-ms-version | 必須 |
x-ms-version | 必須 |
x-ms-client-request-id | 任意 |
■ Authorization
これが一番厄介。面倒くさい。
https://msdn.microsoft.com/ja-jp/library/azure/dd179428.aspx
形式は以下の通り。
1 |
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>" |
方法は、通常版とライト版があるようです。
- 通常版→ SharedKey
- ライト版→SharedKeyLite
今回は、通常版でのSignatureの作成方法
- 署名文字列を作成します。
1234567891011121314StringToSign = VERB + "\n" +Content-Encoding + "\n" +Content-Language + "\n" +Content-Length + "\n" +Content-MD5 + "\n" +Content-Type + "\n" +Date + "\n" +If-Modified-Since + "\n" +If-Match + "\n" +If-None-Match + "\n" +If-Unmodified-Since + "\n" +Range + "\n" +CanonicalizedHeaders +CanonicalizedResource ;
実際に作ってみた(サンプル)。
1234567891011121314151617GETx-ms-date:Tue, 28 Jun 2016 07:16:18 GMTx-ms-version:2015-04-05/myaccount/mycontainercomp:listrestype:container - 署名文字列を暗号化します。
1Signature = Base64(HMAC-SHA256(UTF8(StringToSign)))
PHPの場合は、以下の通り。
12Signature = base64_encode(hash_hmac('sha256', StringToSign, base64_decode(アクセスキー), true));
■ サンプルソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?php $account = 'myaccount'; $accessKey = 'accessKey'; $container = 'mycontainer'; $storage_version = '2015-04-05'; $date = gmdate('D, d M Y H:i:s T', time()); $url = "https://{$account}.blob.core.windows.net/{$container}?comp=list&restype=container"; // 署名文字列の作成 $stringToSign = array(); $stringToSign[] = "GET"; // VERB $stringToSign[] = ""; // Content-Encoding $stringToSign[] = ""; // Content-Language $stringToSign[] = ""; // Content-Length $stringToSign[] = ""; // Content-MD5 $stringToSign[] = ""; // Content-Type $stringToSign[] = ""; // Date $stringToSign[] = ""; // If-Modified-Since $stringToSign[] = ""; // If-Match $stringToSign[] = ""; // If-None-Match $stringToSign[] = ""; // If-Unmodified-Since $stringToSign[] = ""; // Range // CanonicalizedHeaders $canonicalizedHeaders = array('x-ms-date:'.$date, 'x-ms-version:'.$storage_version); asort($canonicalizedHeaders); if (count($canonicalizedHeaders) > 0) { $stringToSign[] = implode("\n", $canonicalizedHeaders); } // CanonicalizedResource $canonicalizedResource = '' . '/' . $account; $canonicalizedResource .= parse_url($url, PHP_URL_PATH); $canonicalizedResource .= "\n"; $canonicalizedResource .= "comp:list"; $canonicalizedResource .= "\n"; $canonicalizedResource .= "restype:container"; $stringToSign[] = $canonicalizedResource; $stringToSign = implode("\n", $stringToSign); // 署名を暗号化 $signature = base64_encode(hash_hmac('sha256', $stringToSign, base64_decode($accessKey), true)); // Authorizationヘッダー $authorization = "SharedKey {$account}:{$signature}"; // リクエストヘッダー $headers = array_merge($canonicalizedHeaders, array( "Authorization: " . $authorization, "Content-Length: 0",)); // curl設定を初期化 $ch = curl_init(); curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'GET', // HTTP リクエスト CURLOPT_HTTPHEADER => $headers, // HTTP ヘッダフィールドの配列 CURLOPT_RETURNTRANSFER => true, // 戻り値を文字列で返す ) ); $body = curl_exec($ch); curl_close($ch); ?> |
上記を行うと、$bodyにXML形式でBLOB一覧が入っています。
以上!yuでした。