全部产品
Search
文档中心

Function Compute:Mengonfigurasi autentikasi tanda tangan untuk pemicu HTTP

更新时间:Nov 11, 2025

Function Compute mendukung autentikasi tanda tangan untuk Pemicu HTTP. Saat autentikasi tanda tangan diaktifkan pada suatu pemicu, gerbang Function Compute akan mengautentikasi permintaan tersebut. Dengan demikian, fungsi Anda tidak perlu lagi memverifikasi tanda tangan permintaan, sehingga Anda dapat fokus pada logika bisnis. Topik ini menjelaskan cara mengonfigurasi autentikasi tanda tangan untuk Pemicu HTTP melalui Konsol serta cara memverifikasi akses ke pemicu menggunakan tanda tangan.

Aktifkan autentikasi tanda tangan untuk Pemicu HTTP

Bagian ini menjelaskan cara mengaktifkan autentikasi tanda tangan untuk Pemicu HTTP yang telah ada. Pastikan Anda telah membuat fungsi terlebih dahulu. Untuk informasi selengkapnya, lihat Buat fungsi.

  1. Masuk ke Konsol Function Compute. 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 Triggers. Lalu, pada kolom Actions dari pemicu yang dituju, klik Edit.

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

Akses URL Pemicu HTTP menggunakan tanda tangan

Metode tanda tangan untuk Pemicu HTTP mengikuti mekanisme tanda tangan SDK Alibaba Cloud. Untuk informasi selengkapnya, lihat Mekanisme tanda tangan. SDK Alibaba Cloud menyediakan metode tanda tangan untuk berbagai bahasa. Prosesnya adalah sebagai berikut:

  1. Buat string tanda tangan menggunakan SDK Alibaba Cloud.

  2. Atur string tanda tangan tersebut pada Header Authorization permintaan HTTP.

  3. Gunakan klien HTTP apa pun untuk mengirim permintaan.

SDK Tanda Tangan untuk berbagai bahasa

Gunakan tautan berikut untuk menginstal SDK tanda tangan Alibaba Cloud dalam berbagai bahasa.

Bahasa

SDK

Go

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

Contoh permintaan berikut hanya bersifat referensi. Untuk detail lengkap mengenai mekanisme tanda tangan, lihat Mekanisme tanda tangan.

# -*- 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 Anda menggunakan STS.

# Parameter method harus dalam huruf kapital, seperti POST atau GET. Jika Anda menggunakan metode GET, ubah requests.post menjadi requests.get.
method = 'POST'
body = 'hello world'
url = 'https://xx.cn-shanghai.fcapp.run/hello?foo=bar'   # URL 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 Anda menggunakan metode GET, ubah requests.post menjadi requests.get.
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 Anda menggunakan STS.
    
    // Parameter method harus dalam huruf kapital, seperti POST atau GET. Jika Anda menggunakan metode GET, ubah axios.post menjadi axios.get.
    const method = 'POST';
    const body = 'hello world';
    const url = 'https://xx.cn-shanghai.fcapp.run/hello?foo=bar' // URL 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 Anda menggunakan metode GET, ubah axios.post menjadi axios.get.
    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 Anda menggunakan STS.

        // Parameter method harus dalam huruf kapital.
	method := "POST"
	body := "hello world"
	url := "https://xx.cn-shanghai.fcapp.run/hello?foo=bar" // URL 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 Anda menggunakan STS.
        if (securityToken == null) {
            securityToken = "";
        }

        // Parameter method harus dalam huruf kapital, seperti POST atau GET. Jika Anda menggunakan metode GET, ubah HttpPost menjadi HttpGet.
        String method = "POST";
        String body = "hello world";
        String url = "https://xx.cn-shanghai.fcapp.run/hello?foo=bar";  // URL 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 Anda menggunakan metode GET, ubah HttpPost menjadi HttpGet.
        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);

        // Jalankan 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 tanda tangan.

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

  2. Siapkan file kode main.go di mesin lokal Anda.

    Anda dapat menggunakan kode contoh yang disediakan dalam topik ini. Untuk informasi selengkapnya, lihat Contoh permintaan untuk berbagai bahasa.

  3. Jalankan go run main.go untuk menjalankan kode.

    Jika kode berhasil dijalankan, hasil berikut akan dikembalikan, yang menunjukkan bahwa tanggapan fungsi berhasil diambil.

    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!

Tanya Jawab Umum

Mengapa saya menerima kesalahan "required HTTP header Date was not specified" saat mengakses fungsi melalui Pemicu HTTP dengan autentikasi tanda tangan diaktifkan?

Kesalahan ini menunjukkan kegagalan autentikasi. Penyebab yang mungkin antara lain:

  1. Permintaan tidak ditandatangani.

  2. Permintaan ditandatangani, tetapi Header Date tidak disertakan.

Mengapa saya menerima kesalahan "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" saat mengakses fungsi melalui Pemicu HTTP dengan autentikasi tanda tangan diaktifkan?

Kesalahan ini menunjukkan bahwa tanda tangan telah kedaluwarsa. Tandatangani ulang permintaan menggunakan waktu saat ini.

Mengapa saya menerima kesalahan "The request signature we calculated does not match the signature you provided. Check your access key and signing method" saat mengakses fungsi melalui Pemicu HTTP dengan autentikasi tanda tangan diaktifkan?

Kesalahan ini terjadi karena tanda tangan dalam permintaan tidak sesuai dengan tanda tangan yang dihitung oleh Function Compute, sehingga autentikasi gagal.