All Products
Search
Document Center

Function Compute:Konfigurasikan Autentikasi Signature untuk Pemicu HTTP

Last Updated:Mar 15, 2026

Function Compute mendukung konfigurasi autentikasi signature untuk Pemicu HTTP. Saat permintaan mencapai gerbang Function Compute, gerbang tersebut akan mengotentikasi permintaan pada Pemicu HTTP yang telah diaktifkan autentikasi signature-nya. Fungsi Anda tidak perlu melakukan re-autentikasi terhadap signature permintaan tersebut—fokuslah pada logika bisnis Anda. Topik ini menjelaskan cara mengonfigurasi autentikasi signature untuk Pemicu HTTP melalui Konsol dan memverifikasi akses ke Pemicu HTTP menggunakan signature.

Aktifkan Autentikasi Signature untuk Pemicu HTTP

Topik ini menjelaskan cara mengaktifkan autentikasi signature untuk Pemicu HTTP yang sudah ada. Pastikan Anda telah membuat fungsi terlebih dahulu. Untuk informasi selengkapnya, lihat Buat Fungsi.

  1. Masuk ke Function Compute console. Di panel navigasi sebelah kiri, pilih Function Management > Functions.

  2. Di bilah navigasi atas, pilih Wilayah. Pada halaman Functions, klik fungsi yang dituju.

  3. Pada halaman konfigurasi fungsi, pilih tab Trigger. Lalu, di kolom Actions di sebelah kanan pemicu yang dituju, klik Modify.

  4. Pada panel Edit Trigger, atur Authentication Method menjadi Signature Authentication. Kemudian, klik OK.

Akses Alamat Pemicu HTTP Menggunakan Signature

Pemicu HTTP mengikuti mekanisme signature SDK Alibaba Cloud. Untuk informasi selengkapnya, lihat Mekanisme Signature. SDK Alibaba Cloud menyediakan metode penandatanganan untuk berbagai bahasa. Prosesnya sebagai berikut:

  1. Buat string signature menggunakan SDK Alibaba Cloud.

  2. Atur string signature tersebut di Header HTTP Authorization pada permintaan HTTP.

  3. Kirim permintaan menggunakan klien HTTP apa pun.

SDK Signature untuk Berbagai Bahasa

Alibaba Cloud menyediakan SDK signature untuk berbagai bahasa. Instal menggunakan pintasan berikut.

Jenis Bahasa

SDK

Golang

go get github.com/alibabacloud-go/openapi-util/service

Python

pip install alibabacloud-openapi-util

Node.js

npm install @alicloud/openapi-util

Java

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>openapiutil</artifactId>
  <version>0.2.1</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>tea-openapi</artifactId>
  <version>0.3.1</version>
</dependency>    

Contoh Permintaan untuk Berbagai Bahasa

Topik ini menyediakan contoh permintaan berikut hanya sebagai referensi. Untuk mekanisme signature lengkap, lihat Mekanisme Signature.

# -*- coding: utf-8 -*-

import os
from datetime import datetime
from urllib.parse import urlparse, parse_qs
import requests
from alibabacloud_openapi_util.client import Client as util
from Tea.request import TeaRequest

accessKeyId = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
accessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
securityToken = os.environ.get('ALIBABA_CLOUD_SECURITY_TOKEN', '')   # Opsional. Diperlukan saat menggunakan STS.

# Parameter method harus dalam huruf kapital, seperti POST atau GET. Jika metode permintaan Anda adalah GET, ubah requests.post menjadi requests.get di bawah.
method = 'POST'
body = 'hello world'
url = 'https://xx.cn-shanghai.fcapp.run/hello?foo=bar'   # Alamat Pemicu HTTP Anda
date = datetime.utcnow().isoformat('T')[:19]+'Z'
headers = {
    'x-acs-date': date,
    'x-acs-security-token': securityToken
}

parsedUrl = urlparse(url)
authRequest = TeaRequest()
authRequest.method = method
authRequest.pathname = parsedUrl.path.replace('$', '%24')
authRequest.headers = headers
authRequest.query = {k: v[0] for k, v in parse_qs(parsedUrl.query).items()}

auth = util.get_authorization(authRequest, 'ACS3-HMAC-SHA256', '', accessKeyId, accessKeySecret)
headers['authorization'] = auth

# Jika metodenya adalah GET, ubah requests.post menjadi requests.get di bawah.
resp = requests.post(url, body, headers=headers)

print(resp.text)
const util = require("@alicloud/openapi-util");
const axios = require('axios');

async function main() {
    const accessKeyId = process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'];
    const accessKeySecret = process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'];
    const securityToken = process.env['ALIBABA_CLOUD_SECURITY_TOKEN'] || ''; // Opsional. Diperlukan saat menggunakan STS.
    
    // Parameter method harus dalam huruf kapital, seperti POST atau GET. Jika metode permintaan Anda adalah GET, ubah axios.post menjadi axios.get di bawah.
    const method = 'POST';
    const body = 'hello world';
    const url = 'https://xx.cn-shanghai.fcapp.run/hello?foo=bar' // Alamat Pemicu HTTP Anda
    const date = new Date().toISOString();
    let headers = {
        'x-acs-date': date,
        'x-acs-security-token': securityToken
    };

    const parsedUrl = new URL(url);
    const authRequest = {
        method: method,
        pathname: parsedUrl.pathname.replace('$', '%24'),
        headers: headers,
        query: Object.fromEntries(parsedUrl.searchParams),
    };
    console.log('auth: ', authRequest);
    const auth = util.default.getAuthorization(authRequest, 'ACS3-HMAC-SHA256', '', accessKeyId, accessKeySecret);
    headers['authorization'] = auth;
    
    // Jika metodenya adalah GET, ubah axios.post menjadi axios.get di bawah.
    const resp = await axios.post(url, body, {
        headers: headers,
    });
    console.log('resp: ', resp.data);
}

main().catch(console.error);
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"strings"
	"time"

	openapiutil "github.com/alibabacloud-go/openapi-util/service"
	"github.com/alibabacloud-go/tea/tea"
)

func main() {
	accessKeyId := tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
	accessKeySecret := tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	securityToken := tea.String(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // Opsional. Diperlukan saat menggunakan STS.

        // Parameter method harus dalam huruf kapital.
	method := "POST"
	body := "hello world"
	url := "https://xx.cn-shanghai.fcapp.run/hello?foo=bar" // Alamat Pemicu HTTP Anda
	req, err := http.NewRequest(method, url, strings.NewReader(body))
	if err != nil {
		log.Printf("new request error: %v", err)
		return
	}
	date := time.Now().UTC().Format(time.RFC3339)
	req.Header.Set("x-acs-date", date)
	req.Header.Set("x-acs-security-token", *securityToken)

	authRequest := &tea.Request{
		Method:   &method,
		Pathname: tea.String(strings.ReplaceAll(req.URL.Path, "$", "%24")),
		Headers:  make(map[string]*string),
		Query:    make(map[string]*string),
	}
	for k := range req.URL.Query() {
		authRequest.Query[k] = tea.String(req.URL.Query().Get(k))
	}
	for k := range req.Header {
		authRequest.Headers[k] = tea.String(req.Header.Get(k))
	}
	auth := openapiutil.GetAuthorization(authRequest, tea.String("ACS3-HMAC-SHA256"), nil, accessKeyId, accessKeySecret)
	req.Header.Set("authorization", *auth)

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Printf("post error: %v", err)
		return
	}
	defer resp.Body.Close()
	buf, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Printf("read body error: %v", err)
		return
	}
	log.Printf("resp: %v, body: %s", resp, string(buf))
}
package com.aliyun.sample;

import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;

import com.aliyun.tea.*;

public class Sample {
    public static void main(String[] args_) throws Exception {
        String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        String securityToken = System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN");  // Opsional. Diperlukan saat menggunakan STS.
        if (securityToken == null) {
            securityToken = "";
        }

        // Parameter method harus dalam huruf kapital, seperti POST atau GET. Jika metode permintaan Anda adalah GET, ubah HttpPost menjadi HttpGet di bawah.
        String method = "POST";
        String body = "hello world";
        String url = "https://xx.cn-shanghai.fcapp.run/hello?foo=bar";  // Alamat Pemicu HTTP Anda
        Map<String, String> headers = new HashMap<String, String>();
        String date = Instant.now().toString();
        headers.put("x-acs-date", date);
        headers.put("x-acs-security-token", securityToken);

        URI uri = new URI(url);
        Map<String, String> query = new HashMap<String, String>();
        for (NameValuePair pair : URLEncodedUtils.parse(uri, StandardCharsets.UTF_8)) {
            query.put(pair.getName(), pair.getValue());
        }
        TeaRequest req = new TeaRequest();
        req.method = method;
        req.pathname = uri.getPath().replace("$", "%24");
        req.headers = headers;
        req.query = query;

        String auth = com.aliyun.openapiutil.Client.getAuthorization(
            req, "ACS3-HMAC-SHA256", "", accessKeyId, accessKeySecret);
        headers.put("authorization", auth);

        // Jika metodenya adalah GET, ubah HttpPost menjadi HttpGet di bawah.
        HttpPost request = new HttpPost(url);
        for (Map.Entry<String, String> entry : headers.entrySet()) {
            request.setHeader(entry.getKey(), entry.getValue());
        }
        StringEntity entity = new StringEntity(body);
        request.setEntity(entity);

        // Eksekusi permintaan
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            org.apache.http.HttpResponse response = httpClient.execute(request);
            String responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
            System.out.println(responseString);
        }
    }
}

Prosedur

Topik ini menggunakan Go sebagai contoh untuk menunjukkan cara mengakses Pemicu HTTP menggunakan signature.

  1. Jalankan go get github.com/alibabacloud-go/openapi-util/service untuk menginstal SDK.

  2. Persiapkan file kode main.go secara lokal.

    Anda dapat menggunakan contoh kode yang disediakan dalam topik ini. Untuk informasi selengkapnya, lihat Contoh Permintaan untuk Berbagai Bahasa.

  3. Jalankan kode dengan mengeksekusi go run main.go.

    Eksekusi yang berhasil akan mengembalikan hasil berikut, yang menunjukkan bahwa respons fungsi telah diperoleh dengan benar.

    2024/02/22 17:21:31 resp: &{200 OK 200 HTTP/1.1 1 1 map[Access-Control-Expose-Headers:[Date,x-fc-request-id] Content-Disposition:[attachment] Content-Length:[14] Content-Type:[text/plain; charset=utf-8] Date:[Thu, 22 Feb 2024 09:21:31 GMT] X-Fc-Request-Id:[1-65d71219-15d63510-fecf237c590c]] 0xc000120040 14 [] false false map[] 0xc000100100 0xc0000e0370}, body: Hello, Golang!

FAQ

Mengapa saat mengakses fungsi melalui Pemicu HTTP setelah mengaktifkan autentikasi signature, muncul prompt: 'required HTTP header Date was not specified'?

Prompt ini menunjukkan kegagalan autentikasi. Kemungkinan penyebabnya sebagai berikut:

  1. Tidak ada signature dalam permintaan.

  2. Signature disertakan dalam permintaan, tetapi Header Date tidak disediakan.

Mengapa saat mengakses fungsi melalui Pemicu HTTP setelah mengaktifkan autentikasi signature, muncul prompt: 'the difference between the request time 'Thu, 04 Jan 2024 01:33:13 GMT' and the current time 'Thu, 04 Jan 2024 08:34:58 GMT' is too large'?

Prompt ini menunjukkan bahwa signature telah kedaluwarsa. Lakukan penandatanganan ulang menggunakan waktu saat ini.

Mengapa saat mengakses fungsi melalui Pemicu HTTP setelah mengaktifkan autentikasi signature, muncul prompt: 'The request signature we calculated does not match the signature you provided. Check your access key and signing method'?

Signature dalam permintaan tidak sesuai dengan signature yang dihitung oleh Function Compute, sehingga autentikasi gagal.