Tous les produits
Search
Centre de documentation

Function Compute:Configure Signature Authentication for HTTP Triggers

Dernière mise à jour :Aug 12, 2026

Function Compute prend en charge l'authentification par signature pour les déclencheurs HTTP. Lorsqu'une requête atteint la passerelle Function Compute, celle-ci valide la signature avant d'invoquer votre fonction. Le code de votre fonction n'a donc pas besoin de réauthentifier la requête.

Quand utiliser l'authentification par signature : Choisissez cette méthode si seuls les appelants disposant d'une AccessKey Alibaba Cloud valide doivent invoquer le déclencheur. Pour les déclencheurs accessibles publiquement, désactivez l'authentification et gérez les autorisations directement dans le code de votre fonction.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une fonction Function Compute associée à un déclencheur HTTP. Pour en créer une, consultez Créer une fonction.

  • Un AccessKey ID et un AccessKey Secret Alibaba Cloud.

Activer l'authentification par signature pour un déclencheur HTTP

  1. Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, cliquez sur Functions.

  2. Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction à gérer.

  3. Sur la page de configuration de la fonction, cliquez sur l'onglet Trigger. Dans la colonne Actions du déclencheur cible, cliquez sur Modify.

  4. Dans le panneau Edit Trigger, définissez Authentication Method sur Signature Authentication, puis cliquez sur OK.

Appeler un déclencheur HTTP avec authentification par signature

Les déclencheurs HTTP utilisent le mécanisme de signature du SDK Alibaba Cloud (ACS3-HMAC-SHA256). Pour consulter la spécification complète, reportez-vous à Mécanisme de signature.

Fonctionnement

Pour appeler un déclencheur HTTP protégé par authentification par signature, procédez comme suit :

  1. Générez une chaîne de signature à l'aide du SDK de signature Alibaba Cloud.

  2. Insérez cette chaîne dans l'en-tête Authorization de la requête HTTP.

  3. Envoyez la requête via n'importe quel client HTTP.

En-têtes requis :

En-tête Obligatoire Description
x-acs-date Oui Heure UTC actuelle au format ISO 8601. Définissez cet en-tête avant de générer la signature.
x-acs-security-token En cas d'utilisation de Security Token Service (STS) Jeton de sécurité temporaire issu de STS. Transmettez une chaîne vide si vous n'utilisez pas STS.
authorization Oui Chaîne de signature générée par le SDK de signature. Définissez cet en-tête après avoir généré la signature.

Installer le SDK de signature

Langage Installation
Go go get github.com/alibabacloud-go/openapi-util/service
Python pip install alibabacloud-openapi-util
Node.js npm install @alicloud/openapi-util
Java (Maven) Consultez l'extrait de dépendance ci-dessous

Dépendances Maven pour 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>

Exemples de code

Tous les exemples ci-dessous signent une requête POST à l'aide de ACS3-HMAC-SHA256 et placent le résultat dans l'en-tête authorization. Remplacez https://xx.cn-shanghai.fcapp.run/hello?foo=bar par l'adresse de votre déclencheur HTTP.

<details> <summary>Python</summary>

# -*- 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', '')   # Optional. Required when using STS.

# The method parameter must be uppercase, such as POST or GET. If your request method is GET, change requests.post to requests.get below.
method = 'POST'
body = 'hello world'
url = 'https://xx.cn-shanghai.fcapp.run/hello?foo=bar'   # Your HTTP trigger address
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

# If the method is GET, change requests.post to requests.get below.
resp = requests.post(url, body, headers=headers)

print(resp.text)

</details>

<details> <summary>Java</summary>

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");  // Optional. Required when using STS.
        if (securityToken == null) {
            securityToken = "";
        }

        // The method parameter must be uppercase, such as POST or GET. If your request method is GET, change HttpPost to HttpGet below.
        String method = "POST";
        String body = "hello world";
        String url = "https://xx.cn-shanghai.fcapp.run/hello?foo=bar";  // Your HTTP trigger address
        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);

        // If the method is GET, change HttpPost to HttpGet below.
        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);

        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);
        }
    }
}

</details>

<details> <summary>Go</summary>

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")) // Optional. Required when using STS.

	// The method parameter must be uppercase.
	method := "POST"
	body := "hello world"
	url := "https://xx.cn-shanghai.fcapp.run/hello?foo=bar" // Your HTTP trigger address
	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))
}

</details>

<details> <summary>Node.js</summary>

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'] || ''; // Optional. Required when using STS.

    // The method parameter must be uppercase, such as POST or GET. If your request method is GET, change axios.post to axios.get below.
    const method = 'POST';
    const body = 'hello world';
    const url = 'https://xx.cn-shanghai.fcapp.run/hello?foo=bar'; // Your HTTP trigger address
    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),
    };
    const auth = util.default.getAuthorization(authRequest, 'ACS3-HMAC-SHA256', '', accessKeyId, accessKeySecret);
    headers['authorization'] = auth;

    // If the method is GET, change axios.post to axios.get below.
    const resp = await axios.post(url, body, {
        headers: headers,
    });
    console.log('resp: ', resp.data);
}

main().catch(console.error);

</details>

Vérifier la configuration

Cette procédure utilise Go pour vérifier le bon fonctionnement de bout en bout de l'authentification par signature.

  1. Installez le SDK de signature Go :

    go get github.com/alibabacloud-go/openapi-util/service
  2. Enregistrez l'exemple Go ci-dessus sous le nom main.go. Mettez à jour la variable url avec l'adresse de votre déclencheur HTTP.

  3. Exécutez le code :

    go run main.go

Une réponse réussie ressemble à ceci :

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!

Dépannage

« required HTTP header Date was not specified »

Cause : La requête ne comporte pas de signature valide ou l'en-tête x-acs-date est absent.

Résolution : Définissez l'en-tête x-acs-date à l'heure UTC actuelle avant d'appeler le SDK de signature, puis ajoutez la signature retournée dans l'en-tête authorization.

« the difference between the request time '...' and the current time '...' is too large »

Cause : La signature a expiré. Les signatures sont limitées dans le temps afin d'éviter les attaques par rejeu.

Résolution : Signez de nouveau la requête en utilisant l'horodatage actuel et réessayez immédiatement.

« The request signature we calculated does not match the signature you provided. Check your access key and signing method »

Cause : La signature présente dans la requête ne correspond pas à celle calculée par Function Compute.

Résolution : Vérifiez les points suivants :

  • L'AccessKey ID et l'AccessKey Secret sont corrects et appartiennent au même compte.

  • L'algorithme de signature utilisé est bien ACS3-HMAC-SHA256.

  • La méthode de requête, le chemin, les en-têtes et les paramètres de requête transmis au SDK de signature correspondent exactement à la requête HTTP réellement envoyée.