リクエストごとに送信者認証を実行します。 したがって、HTTP または HTTPS プロトコルの使用に関係なく、署名情報を要求に含める必要があります。AccessKeyID と AccessKeySecret を使用して、送信者の要求を認証するために対称暗号化を実行します。

AccessKey はログオンパスワードと同等です。ただし、AccessKey は API の呼び出しに使用され、ログオンパスワードは ECS コンソールへのログオンに使用されます。 AccessKeyID がビジター ID である場合、AccessKeySecret は、署名文字列を暗号化し、サーバーに送信された署名文字列を検証するための秘密キーです。データ侵害の可能性を防ぐために、アクセスキーを機密にしておかなければなりません。

注意
私たちは、認証プロセスをスキップするために、複数のプログラミング言語用の SDK とサードパーティの SDK を提供しています。 詳細については、 SDK を参照してください。

手順 1. 標準化されたリクエスト URL を作成する

  1. リクエストパラメータを辞書順にソートします。 リクエストパラメータには、API 固有のパラメータと、Signature パラメータ以外のコモンパラメーターが含まれます。
    注意
    たとえば、GET メソッドを使用してリクエストを行う場合、これらのパラメータは URL のセクションに続けて疑問符 ? を付け、アンパサンド &で接続します。
  2. UTF-8 文字セットを使用し、 RFC3986 の規則に従ってリクエストパラメータをエンコードします。
    • A~Z、a~z 文字、 数字 (0~9)、ハイフン -、アンダースコア _、ピリオド .、チルダ ~はエンコードしないでください。

    • 他の文字を %XY 形式でエンコードし、文字の 16 進 ASCII 値を表す XY を使用します。 たとえば、半角の二重引用符 () は %22 としてエンコードされます。

    • 拡張された UTF-8 文字を %XY%ZA… 形式でエンコードします。

    • 空白 ( ) をプラス記号 (+) の代わりに %20 にエンコードします。

      また、application/x-www-form-urlencoded MIME タイプの URL エンコードをサポートするライブラリを使用することもできます。

      たとえば、Java 言語の java.net.URLEncoder です。 その場合は、エンコードされた文字列の percentEncode Java メソッドを使用し、プラス記号 (+) を %20、アスタリスク () を %2A%7E をチルダ (~)に置き換えます。 次の例を参照してください。

      1. private static final String ENCODING = UTF-8”;private static String percentEncode(String value) throws UnsupportedEncodingException {return value ! = null ? URLEncoder.encode(value, ENCODING).replace(“+”, “%20”).replace(““, “%2A”).replace(“%7E”, “~”) : null;}
  3. エンコードされたパラメータとその値を等号 (=) で接続します。
  4. エンコードされたパラメータをアンパサンド (&) で連結します。

今度は、正規化されたクエリ文字列を取得します。その構造は、 リクエスト構造のトピックで説明したものと同じでなければなりません。

手順 2. 署名文字列を作成する

  1. 正規化されたクエリ文字列を使用して変数 StringToSign を作成します。上記の percentEncode を使用して、前の手順で作成した標準化要求文字列を次の規則に従って処理できます。
    1. StringToSign= HTTPMethod + “&” + //HTTPMethod: HTTP method used for making request, for example GET. percentEncode(“/“) + “&” + //percentEncode(“/“): Encode backslash (/) to %2F. percentEncode(CanonicalizedQueryString) //Encode the canonicalized query string created in the Step 1.
  2. RFC2104 の規則に従って StringToSign の HMAC-SHA1 値を計算することによって、可変シグネチャを作成する。ここでは、Java Base64 エンコーディング方式を使用します。
    1. Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
    注意
    署名を計算する際の RFC2104 AccessKeySecret の後ろにアンパサンド (&)があり、アンパサンドの 16 進 ASCII 値が 38 です。
  3. 正規のクエリ文字列 URL にRFC3986 の規則に従って Signature の値をエンコードします。

サンプル 1. パラメータ連結方法

DescribeRegions を例として呼び出します。 AccessKeyID = testid と AccessKeySecret = testsecret がコンソールに作成されています。

  1. 正規化されたクエリ文字列を作成します。
    1. http://ecs.aliyuncs.com/?Timestamp=2016-02-23T12:46:24Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&SignatureVersion=1.0
  2. 正規化されたクエリ文字列を使用して計算される変数 StringToSign を作成します。
    1. GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeRegions&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&Timestamp%3D2016-02-23T12%253A46%253A24Z&Version%3D2014-05-26
  3. HMAC-SHA1 の値を計算します。 AccessKeySecret = testsecretを持つため、RFC2104 のルールで使用されるキーは testsecret&で、HMAC-SHA1 の値は OLeaidS1JvxuMvnyHOwuJ+uX5qY= です。ここでは、Java Base64 エンコーディング方式を使用します。
    1. Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
  4. Signatureの値を RFC3986 の規則に従って符号化し、手順 1Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D を URL に追加します。
    1. http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=XML&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%253A46%253A24Z

これで、Web ブラウザ、カール、wget、その他のツールを使用して、 DescribeRegions を呼び出すための HTTP リクエストを送信し、Alibaba Cloud リージョンのリストを表示できます。

サンプル 2. プログラミング言語メソッド

DescribeRegions を呼び出して、Alibaba Cloud リージョンのリストを記述しているとします。コンソールにAccessKeyID = testid と AccessKeySecret = testsecret が作成され、すべての要求パラメータが Java Map Map<String, String> オブジェクトに格納されます。

  1. 定義済みのエンコード方法。
    1. private static final String ENCODING = UTF-8”;private static String percentEncode(String value) throws UnsupportedEncodingException { return value ! = null ? URLEncoder.encode(value, ENCODING).replace(“+”, “%20”).replace(“*”, “%2A”).replace(“%7E”, “~”) : null;}
  2. パラメータ Timestamp の書式を事前定義します。パラメータ TimestampISO8601 に準拠していなければなりません。また、日付時刻に協定世界時 (UTC) のオフセットを使用してください。
    1. private static final String ISO8601_DATE_FORMAT = YYYY-MM-DDTHH:mm:ssZ’”;private static String formatIso8601Date(Date date) { SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT); df.setTimeZone(new SimpleTimeZone(0, GMT”)); return df.format(date);}
  3. リクエスト文字列を作成します。
    1. final String HTTP_METHOD = GET”;Map parameters = new HashMap();// Add request parametersparameters.put(“Action”, “DescribeRegions”);parameters.put(“Version”, “2014-05-26”);parameters.put(“AccessKeyId”, “testid”);parameters.put(“Timestamp”, formatIso8601Date(new Date()));parameters.put(“SignatureMethod”, “HMAC-SHA1”);parameters.put(“SignatureVersion”, “1.0”);parameters.put(“SignatureNonce”, UUID.randomUUID().toString());parameters.put(“Format”, “XML”);// Sort the parametersString[] sortedKeys = parameters.keySet().toArray(new String[]{});Arrays.sort(sortedKeys);final String SEPARATOR = “&”;// Create the variable stringToSignStringBuilder stringToSign = new StringBuilder();stringToSign.append(HTTP_METHOD).append(SEPARATOR);stringToSign.append(percentEncode(“/“)).append(SEPARATOR);StringBuilder canonicalizedQueryString = new StringBuilder();for(String key : sortedKeys) {// Encode the key and its value canonicalizedQueryString.append(“&”) .append(percentEncode(key)).append(“=”) .append(percentEncode(parameters.get(key)));}// Encode the variable canonicalizedQueryStringstringToSign.append(percentEncode( canonicalizedQueryString.toString().substring(1)));
  4. signature に署名してエンコードする。AccessKeySecret = testsecret を持っているので、HMAC を計算するためのキーは testsecret& であり、計算後の署名の値は OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D です。
    1. // A sample code for calculating the signaturefinal String ALGORITHM = “HmacSHA1”;final String ENCODING = “UTF-8”;key = “testsecret&”;Mac mac = Mac.getInstance(ALGORITHM);mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));byte[] signData = mac.doFinal(stringToSign.getBytes(ENCODING));String signature = new String(Base64.encodeBase64(signData));

    Signature パラメータを追加した後、 RFC3986 の規則に従ってエンコードされたリクエスト URL はすぐに使用できます。

    1. http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=XML&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%253A46%253A24Z
  5. Web ブラウザ、カール、wget、またはその他のツールを使用して HTTP リクエストを送信します。
    1. <DescribeRegionsResponse> <Regions> <Region> <LocalName>Qingdao</LocalName> <RegionId>cn-qingdao</RegionId> </Region> <Region> <LocalName>Hangzhou</LocalName> <RegionId>cn-hangzhou</RegionId> </Region> </Regions> <RequestId>833C6B2C-E309-45D4-A5C3-03A7A7A48ACF</RequestId></DescribeRegionsResponse>

この XML スキーマの出力を解析することにより、Alibaba Cloud のリージョンおよびリージョン ID リストを取得できます。Format=JSON を設定すると、応答結果は JSON 形式になります。 詳細については、 返される結果を参照してください。