すべてのプロダクト
Search
ドキュメントセンター

Function Compute:署名認証

最終更新日:Sep 10, 2024

セキュリティを確保するには、すべての API リクエストに署名する必要があります。 Alibaba Cloud はリクエストの署名を使用して、API の呼び出し元を確認します。 リクエストが HTTP と HTTPS のどちらで送信されるかに関係なく、各リクエストに署名が含まれている必要があります。

署名アルゴリズム

このトピックでは、Function ComputeのAPIリクエストで使用される署名アルゴリズムについて説明します。 この署名アルゴリズムは、APIリクエストに署名するためにSDKに実装されているため、署名を手動で計算する必要はありません。 詳細は、「SDK」をご参照ください。

Function Computeは、Authorizationヘッダーフィールドに基づいてリクエストが有効かどうかを確認します。 関数がHTTPトリガーで設定され、匿名アクセスを許可している場合、function Computeはリクエストの有効性をチェックしません。 リクエストを送信するクライアントがFunction Computeと同じ署名アルゴリズムを使用している場合にのみ、リクエストは検証に合格します。 リクエストにAuthorizationヘッダーフィールドが含まれていない場合、またはAuthorizationヘッダーフィールドに無効な署名が含まれている場合、Function ComputeHTTPステータスコード403を返します。

説明

Function ComputeHTTPステータスコード403を返しても課金されません。 詳細については、「課金の概要」をご参照ください。

signature = base64(hmac-sha256(HTTP_METHOD + "\n" 
                + CONTENT-MD5 + "\n"     
                + CONTENT-TYPE + "\n" 
                + DATE + "\n" 
                + CanonicalizedFCHeaders
                + CanonicalizedResource))

// The Authorization header field.                
Authorization = "FC " + accessKeyID + ":" + signature            

上記のサンプルコードには、次のパラメーターが含まれています。

  • HTTP_METHOD: リクエストの送信に使用されるHTTPメソッド。 PUT、GET、POST、DELETEなどの大文字で値を指定します。

  • CONTENT-MD5: リクエスト本文のMD5ハッシュ値。 リクエストにContent-MD5ヘッダーフィールドが含まれていない場合は、このパラメーターを空のままにします。

  • CONTENT-TYPE: リクエストボディのタイプ。 Function Computeのリクエストは、application/jsonタイプである必要があります。

  • 日付: 操作を実行する時刻。 このパラメーターは空白のままにできません。 値は、GMTのRFC1123型である必要があります。 例: 月2日1月2006日15:04:05GMT

    重要

    クライアントで署名が生成されてからFunction Computeがリクエストを受信するまでの間隔は15分以内です。 間隔が15分を超えると、Function Computeはリクエストを拒否します。

  • CanonicalizedFCHeaders: リクエスト内で名前の先頭にx-fc- が付いているすべてのHTTPヘッダーフィールドで構成される文字列。 文字列の生成方法の詳細については、「CanonicalizedFCHeaders」をご参照ください。

  • CanonicalizedResource: リクエストURLのパス。 ほとんどの場合、Function ComputeはリクエストURLのパスをデコードし、パスからparamsコンテンツを削除します。

    • リクエストURLのパスは、$api-version/api-path形式です。

      • api-version: APIのバージョン。 使用するAPIのバージョンは2016-08-15です。

      • api-path: 各API操作の呼び出しに使用されるパス。 たとえば、CreateService操作の呼び出しに使用されるパスは /servicesです。 詳細については、「関数別の操作の一覧」をご参照ください。

    • Function Computeは、認証を必要とするHTTPトリガーで設定された関数の要求で、共通リクエストではCanonicalizedResourceを処理し、リクエストではCanonicalizedResourceを処理するために、さまざまな方法を使用します。

      • 認証が必要なHTTPトリガーで構成されている関数のリクエスト: paramsコンテンツが指定されている場合、パラメーターは \nで区切ります。 パラメータのキーと値のペアはアルファベット順に並べ替えられます。 paramsコンテンツが指定されていない場合、Function ComputeはCanonicalizedResourceの値の末尾に \nを追加します。 例:

        // The path in the URL of a request for a function that is configured with an HTTP trigger that requires authentication.
        /2016-08-15/proxy/service-name/func-name/path-with-%20-space/action?x=1&a=2&x=3&with%20space=foo%20bar
        
        // The path that is obtained after the URL is decoded.
        /2016-08-15/proxy/service-name/func-name/path-with- -space/action?x=1&a=2&x=3&with space=foo bar
        
        // CanonicalizedResource in a request for a function that is configured with an HTTP trigger that requires authentication.
        /2016-08-15/proxy/service-name/func-name/path-with- -space/action\na=2\nwith space=foo bar\nx=1\nx=3
        
        // The path in the URL of a common request.
        /2016-08-15/service-name/func-name/path-with-%20-space/action?x=1&a=2&x=3&with%20space=foo%20bar
        
        // The path that is obtained after the URL is decoded.
        /2016-08-15/service-name/func-name/path-with- -space/action?x=1&a=2&x=3&with space=foo bar
        
        // CanonicalizedResource in a common request.
        /2016-08-15/service-name/func-name/path-with- -space/action                    
        説明

        パラメーター内のキーが複数の値にマッピングされる場合、Function Computeはキーと値のペアをソートするときに、キーと値を全体として考慮します。

      • 共通リクエスト: Function Computeは、リクエスト内のCanonicalizedResourceの値に対してURLデコードを実行し、疑問符 (?) の前のコンテンツを取得します。 paramsコンテンツは破棄されます。

        説明

        一般的なリクエストには、認証を必要とするHTTPトリガーで設定されている関数のリクエストを除くすべてのリクエストが含まれます。

  • hmac-sha 256: 署名の生成に使用されるキー。 AccessKeyシークレットをキーとして使用する必要があります。

    次の擬似コードを使用して、署名スキームを検証できます。

    // Create a string.
    function composeStringToSign(method, path, headers, queries) {
      var contentMD5 = headers['content-md5']  '';
      var contentType = headers['content-type']  '';
      var date = headers['date'];
      var signHeaders = buildCanonicalHeaders(headers, 'x-fc-');
    
      var u = url.parse(path);
      var pathUnescaped = decodeURIComponent(u.pathname);
      var str = `${method}\n${contentMD5}\n${contentType}\n${date}\n${signHeaders}${pathUnescaped}`;
    
      if (queries) {
        var params = [];
        Object.keys(queries).forEach(function (key) {
          var values = queries[key];
          var type = typeof values;
          if (type === 'string') {
            params.push(`${key}=${values}`);
            return;
          }
          if (type === 'object' && values instanceof Array) {
            queries[key].forEach(function (value) {
              params.push(`${key}=${value}`);
            });
          }
        });
        params.sort();
        str += '\n' + params.join('\n');
      }
      return str;
    }
    
    // Use HMAC-SHA256 and Base64 to calculate the signature. The value of the source parameter is the string that is created by using the preceding code. 
    function signString(source, secret) {
      const buff = crypto.createHmac('sha256', secret)
        .update(source, 'utf8')
        .digest();
      return new Buffer(buff, 'binary').toString('base64');
    }                   

CanonicalizedFCHeaders

CanonicalizedFCHeadersの値を生成するには、次の手順を実行します。

  1. x-fc- で始まる各HTTPヘッダーフィールドの名前を小文字に変換します。

  2. HTTPヘッダーフィールドごとに部分文字列を生成します。 部分文字列は ${key }:${ value}\n形式です。 たとえば、部分文字列x-fc-invocation-type:Sync\nは、X-Fc-Invocation-Type:Syncに対して生成されます。 生成された部分文字列は、ヘッダーフィールドの名前に基づいてアルファベット順にソートされます。

    • ${key}: HTTPヘッダーフィールドの名前。

    • ${value}: HTTPヘッダーフィールドの値。

  3. ソートされた部分文字列を連結して必要な文字列を形成します。

    次の疑似コードを使用して署名スキームを検証できます:

    // javascript
    // prefix = 'x-fc-'
    function buildCanonicalHeaders(headers, prefix) {
        var list = [];
        var keys = Object.keys(headers);
    
        var fcHeaders = {};
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
    
            var lowerKey = key.toLowerCase().trim();
            if (lowerKey.startsWith(prefix)) {
                list.push(lowerKey);
                fcHeaders[lowerKey] = headers[key];
            }
        }
        list.sort();
    
        var canonical = '';
        for (var _i = 0; _i < list.length; _i++) {
            var _key = list[_i];
            canonical += `${_key}:${fcHeaders[_key]}\n`;
        }
    
        return canonical;
    }            

    上記の方法を使用して署名を取得した後、次の方法を使用してAuthorizationヘッダーフィールドの値を生成できます。

    Authorization = "FC " + accessKeyID + ":" + signature