全部产品
Search
文档中心

Function Compute:Autentikasi Tanda Tangan

更新时间:Jul 02, 2025

Anda harus menandatangani semua permintaan API untuk memastikan keamanan. Alibaba Cloud menggunakan tanda tangan permintaan untuk memverifikasi identitas pemanggil API. Setiap permintaan API harus mencakup tanda tangan, baik dikirim melalui HTTP maupun HTTPS.

Algoritma Tanda Tangan

Bagian ini menjelaskan algoritma tanda tangan yang digunakan dalam permintaan API Function Compute. Algoritma ini diimplementasikan dalam SDK untuk menandatangani permintaan API sehingga Anda tidak perlu menghitung tanda tangan secara manual. Untuk informasi lebih lanjut, lihat SDK.

Function Compute memvalidasi permintaan berdasarkan bidang header Authorization. Jika fungsi dikonfigurasi dengan pemicu HTTP dan mengizinkan akses anonim, Function Compute tidak akan memeriksa validitas permintaan. Permintaan hanya akan lolos verifikasi jika klien yang mengirim permintaan menggunakan algoritma tanda tangan yang sama dengan Function Compute. Jika permintaan tidak mencakup bidang header Authorization atau jika bidang tersebut berisi tanda tangan yang tidak valid, Function Compute akan mengembalikan Kode status HTTP 403.

Catatan Tidak ada biaya yang dikenakan ketika Function Compute mengembalikan Kode status HTTP 403. Untuk informasi lebih lanjut, lihat Ikhtisar Penagihan.
signature = base64(hmac-sha256(HTTP_METHOD + "\n" 
                + CONTENT-MD5 + "\n"     
                + CONTENT-TYPE + "\n" 
                + DATE + "\n" 
                + CanonicalizedFCHeaders
                + CanonicalizedResource))

// Bidang header Authorization.                
Authorization = "FC " + accessKeyID + ":" + signature            

Parameter berikut terdapat dalam kode contoh di atas:

  • HTTP_METHOD: metode HTTP yang digunakan untuk mengirim permintaan. Tentukan nilainya dalam huruf besar, seperti PUT, GET, POST, atau DELETE.
  • CONTENT-MD5: nilai hash MD5 dari badan permintaan. Jika permintaan tidak mencakup bidang header Content-MD5, biarkan parameter ini kosong.
  • CONTENT-TYPE: jenis badan permintaan. Permintaan untuk Function Compute harus bertipe application/json.
  • DATE: waktu saat Anda ingin melakukan operasi. Parameter ini wajib diisi dan harus sesuai dengan format RFC1123 dalam GMT. Contoh: Mon, 02 Jan 2006 15:04:05 GMT.
    Penting Interval antara waktu pembuatan tanda tangan di klien dan waktu penerimaan permintaan oleh Function Compute tidak boleh melebihi 15 menit. Jika interval melebihi 15 menit, Function Compute akan menolak permintaan tersebut.
  • CanonicalizedFCHeaders: string yang terdiri dari semua bidang header HTTP yang namanya diawali dengan x-fc- dalam permintaan. Untuk informasi lebih lanjut tentang cara menghasilkan string ini, lihat CanonicalizedFCHeaders.
  • CanonicalizedResource: jalur dalam URL permintaan. Dalam banyak kasus, Function Compute mendekode jalur dalam URL permintaan dan kemudian menghapus konten params dari jalur.
    • Jalur dalam URL permintaan berformat $api-version/api-path, di mana:
      • api-version: versi API. Versi API yang digunakan adalah 2016-08-15.
      • api-path: jalur yang digunakan untuk memanggil setiap operasi API. Misalnya, jalur yang digunakan untuk memanggil operasi CreateService adalah /services. Untuk informasi lebih lanjut, lihat Daftar operasi berdasarkan fungsi.
    • Function Compute menggunakan metode berbeda untuk memproses CanonicalizedResource dalam permintaan umum dan dalam permintaan untuk fungsi yang dikonfigurasi dengan pemicu HTTP yang memerlukan autentikasi.
      • Permintaan untuk fungsi yang dikonfigurasi dengan pemicu HTTP yang memerlukan autentikasi: Jika konten params ditentukan, parameter dipisahkan dengan \n. Pasangan kunci-nilai dari parameter dalam params diurutkan secara alfabetis. Jika konten params tidak ditentukan, Function Compute menambahkan \n ke akhir nilai CanonicalizedResource. Contoh:
        // Jalur dalam URL permintaan untuk fungsi yang dikonfigurasi dengan pemicu HTTP yang memerlukan autentikasi.
        /2016-08-15/proxy/service-name/func-name/path-with-%20-space/action?x=1&a=2&x=3&with%20space=foo%20bar
        
        // Jalur yang diperoleh setelah URL didekode.
        /2016-08-15/proxy/service-name/func-name/path-with- -space/action?x=1&a=2&x=3&with space=foo bar
        
        // CanonicalizedResource dalam permintaan untuk fungsi yang dikonfigurasi dengan pemicu HTTP yang memerlukan autentikasi.
        /2016-08-15/proxy/service-name/func-name/path-with- -space/action\na=2\nwith space=foo bar\nx=1\nx=3
        
        // Jalur dalam URL permintaan umum.
        /2016-08-15/service-name/func-name/path-with-%20-space/action?x=1&a=2&x=3&with%20space=foo%20bar
        
        // Jalur yang diperoleh setelah URL didekode.
        /2016-08-15/service-name/func-name/path-with- -space/action?x=1&a=2&x=3&with space=foo bar
        
        // CanonicalizedResource dalam permintaan umum.
        /2016-08-15/service-name/func-name/path-with- -space/action                    
        Catatan Jika kunci dalam params dipetakan ke beberapa nilai, Function Compute mempertimbangkan kunci dan nilai sebagai satu kesatuan saat mengurutkan pasangan kunci-nilai.
      • Permintaan umum: Function Compute melakukan dekode URL pada nilai CanonicalizedResource dalam permintaan dan memperoleh konten sebelum tanda tanya (?). Konten params dibuang.
        Catatan Permintaan umum mencakup semua permintaan kecuali permintaan untuk fungsi yang dikonfigurasi dengan pemicu HTTP yang memerlukan autentikasi.
  • hmac-sha 256: kunci yang digunakan untuk menghasilkan tanda tangan. Rahasia AccessKey Anda harus digunakan sebagai kunci.

    Anda dapat menggunakan pseudocode berikut untuk memverifikasi skema tanda tangan:

    // Buat 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;
    }
    
    // Gunakan HMAC-SHA256 dan Base64 untuk menghitung tanda tangan. Nilai parameter sumber adalah string yang dibuat menggunakan kode di atas. 
    function signString(source, secret) {
      const buff = crypto.createHmac('sha256', secret)
        .update(source, 'utf8')
        .digest();
      return new Buffer(buff, 'binary').toString('base64');
    }                   

CanonicalizedFCHeaders

Untuk menghasilkan nilai untuk CanonicalizedFCHeaders, ikuti langkah-langkah berikut:

  1. Ubah nama setiap bidang header HTTP yang dimulai dengan x-fc- menjadi huruf kecil.
  2. Hasilkan substring untuk setiap bidang header HTTP. Substring berformat ${key}:${value}\n. Misalnya, substring x-fc-invocation-type:Sync\n dihasilkan untuk X-Fc-Invocation-Type:Sync. Substring yang dihasilkan diurutkan secara alfabetis berdasarkan nama bidang header.
    • ${key}: nama bidang header HTTP.
    • ${value}: nilai bidang header HTTP.
  3. Gabungkan substring yang diurutkan untuk membentuk string yang diperlukan.
    Anda dapat menggunakan pseudocode berikut untuk memverifikasi skema tanda tangan:
    // 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;
    }            
    Setelah Anda memperoleh tanda tangan menggunakan metode di atas, Anda dapat menggunakan metode berikut untuk menghasilkan nilai untuk bidang header Authorization:
    Authorization = "FC " + accessKeyID + ":" + signature