La signature POST V1 sécurise les requêtes de téléchargement que les clients envoient à Object Storage Service (OSS) via l'opération PostObject. Le serveur d'application calcule une signature à partir d'une politique de téléchargement et transmet ces deux éléments au client, qui les soumet dans des champs de formulaire. OSS vérifie la signature de chaque requête POST et rejette celles dont la signature est invalide.
OSS prend en charge l'algorithme de signature V4, plus sécurisé. Nous vous recommandons d'utiliser la signature V4. Pour plus d'informations, consultez Signature V4.
Quand utiliser une signature POST V1 ?
Les requêtes HTTP POST adressées à OSS prennent en charge l'algorithme de signature V1, appelé signature POST V1 dans cette rubrique. Avant de calculer une signature POST V1, examinez les conditions et dépendances suivantes :
ACL du bucket — Une requête PostObject doit comporter une signature lorsque l'ACL du bucket de destination est définie sur public-read ou private.
Champs de formulaire — Fournissez les champs de formulaire
OSSAccessKeyId,Signatureetpolicyensemble. Si l'un des trois champs est présent dans le formulaire, les deux autres sont également obligatoires. Pour obtenir des descriptions détaillées des champs, consultez Champs de formulaire.Emplacement du calcul de la signature — Le serveur d'application calcule la signature et la transmet, ainsi que la politique de téléchargement, au client. Le client utilise ces informations pour construire la requête PostObject.
Identifiants — La signature est calculée à partir de la clé secrète AccessKey. Le champ de formulaire
OSSAccessKeyIdcontient l'ID AccessKey de la même paire de clés AccessKey.
Calculer une signature POST V1
Calculez une signature POST V1 sur votre serveur d'application en suivant les trois étapes ci-dessous :
Créez la politique. Créez une politique encodée en UTF-8. Pour connaître la syntaxe de la politique et les conditions que vous pouvez déclarer, consultez Structure de la politique.
Construisez la chaîne à signer (StringToSign). Encodez la politique en Base64. La chaîne résultante constitue la chaîne à signer (StringToSign).
Calculez la signature. Utilisez la clé secrète AccessKey pour signer la chaîne à signer. La formule de signature est
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).
Le schéma suivant illustre le processus de calcul de la signature POST V1.
Exemple : calculer une signature POST V1 en Java
L'exemple Java suivant exécute les trois étapes de la signature POST V1 en utilisant la politique d'exemple décrite dans Structure de la politique. L'étape 3 appelle le SDK Java OSS, qui applique la formule base64(hmac-sha1(AccessKeySecret,base64(policy))) à la chaîne à signer.
import org.apache.commons.codec.binary.Base64;
public class Demo {
public static void main(String[] args) {
// Before running this code example, make sure the OSS_ACCESS_KEY_SECRET environment variable is set.
String accessKeySecret = System.getenv().get("OSS_ACCESS_KEY_SECRET");
// Step 1: Create the policy.
String policy = "{\n" +
" \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
" \"conditions\": [\n" +
" {\"bucket\": \"examplebucket\"},\n" +
" [\"content-length-range\", 1, 10],\n" +
" [\"eq\", \"$success_action_status\", \"201\"],\n" +
" [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
" [\"in\", \"$content-type\", [\"image/jpeg\", \"image/png\"]],\n" +
" [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
" ]\n" +
"}";
// Step 2: Construct the string to sign (StringToSign).
String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));
// Step 3: Calculate the signature.
String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
System.out.println("signature:" + signature);
}
}
La signature s'affiche au format suivant. La valeur imprimée est une chaîne encodée en Base64 qui dépend de votre clé secrète AccessKey et des octets exacts de votre politique ; votre résultat diffère donc de l'exemple ci-dessous.
signature:****
Soumettez la valeur calculée dans le champ de formulaire Signature de la requête PostObject, ainsi que les champs de formulaire OSSAccessKeyId et policy.
Champs de formulaire
Les éléments de formulaire suivants sont spécifiques à la signature POST V1. Pour les autres éléments de formulaire courants, consultez Éléments de formulaire PostObject. Pour connaître les conditions dans lesquelles ces champs sont requis, consultez Quand utiliser une signature POST V1 ?.
| Champ | Type | Description |
| OSSAccessKeyId | String | ID AccessKey de la paire de clés AccessKey. Valeur par défaut : Aucune. |
| Signature | String | Signature calculée à partir de la clé secrète AccessKey et de la politique. OSS utilise la signature pour vérifier la validité de la requête POST. La clé de ce champ de formulaire est insensible à la casse, mais la valeur est sensible à la casse. Valeur par défaut : Aucune. Pour savoir comment OSS vérifie la signature d'une requête POST, consultez PostObject. |
| policy | String | Politique de sécurité qui déclare les autorisations et les contraintes du téléchargement. La politique est définie au format JSON et doit inclure les champs expiration et conditions. Pour plus de détails, consultez Structure de la politique. |
Structure de la politique
Le champ de formulaire policy est une politique de sécurité qui définit les autorisations et les contraintes pour le téléchargement d'objets vers OSS via un formulaire HTML. La politique est définie au format JSON et restreint les opérations de téléchargement grâce à plusieurs paramètres, tels que le nom du bucket autorisé, le préfixe d'objet, l'heure d'expiration, les méthodes HTTP autorisées, les limites de taille du contenu et les restrictions de type de contenu.
La politique doit inclure les champs expiration et conditions, comme illustré dans l'exemple suivant.
{
"expiration": "2023-12-03T13:00:00.000Z",
"conditions": [
{"bucket": "examplebucket"},
["content-length-range", 1, 10],
["eq", "$success_action_status", "201"],
["starts-with", "$key", "user/eric/"],
["in", "$content-type", ["image/jpeg", "image/png"]],
["not-in", "$cache-control", ["no-cache"]]
]
}
La politique contient les éléments suivants :
expiration — Spécifie l'heure d'expiration de la politique au format ISO 8601 GMT. Par exemple,
2023-12-03T13:00:00.000Zsignifie que la requête POST doit être initiée avant 13 h 00 GMT le 3 décembre 2023.conditions — Spécifie les valeurs valides pour les champs de formulaire dans la requête POST.
Le tableau suivant décrit les champs que vous pouvez déclarer dans conditions.
| Champ | Type | Obligatoire | Description | Modes de correspondance des conditions |
| bucket | String | Non | Nom du bucket. | bucket |
| content-length-range | String | Non | Tailles minimale et maximale autorisées de l'objet à télécharger, en octets. | content-length-range |
| success_action_status | String | Non | Code d'état HTTP renvoyé après un téléchargement réussi. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| key | String | Non | Nom de l'objet à télécharger. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| content-type | String | Non | Restreint le type de contenu de l'objet à télécharger. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| cache-control | String | Non | Spécifie le comportement de mise en cache de l'objet. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
Modes de correspondance des conditions
Le tableau suivant décrit les modes de correspondance des conditions que vous pouvez utiliser dans le champ conditions d'une politique POST V1.
| Mode de correspondance des conditions | Description |
| content-length-range | Spécifie les tailles d'objet minimale et maximale autorisées pour les téléchargements. Par exemple, pour autoriser des tailles d'objet comprises entre 1 et 10 octets, écrivez ["content-length-range", 1, 10]. |
| eq | Effectue une correspondance exacte. La valeur du champ de formulaire doit correspondre exactement à la valeur déclarée dans les conditions. Par exemple, pour exiger que la valeur du champ de formulaire key soit a, écrivez ["eq", "$key", "a"]. |
| starts-with | Effectue une correspondance de préfixe. La valeur du champ de formulaire doit commencer par le préfixe spécifié. Par exemple, pour exiger que la valeur du champ de formulaire key commence par user/user1, écrivez ["starts-with", "$key", "user/user1"]. |
| in | Vérifie si la valeur est incluse dans une liste de chaînes spécifiée. Par exemple, lorsque vous téléchargez une image via l'opération PostObject et souhaitez autoriser plusieurs formats d'image, utilisez ["in", "$content-type", ["image/jpeg", "image/png"]]. |
| not-in | Vérifie si la valeur est exclue d'une liste de chaînes spécifiée. Par exemple, lorsque vous téléchargez un objet via l'opération PostObject et souhaitez interdire la valeur no-cache pour le comportement de cache, utilisez ["not-in", "$cache-control", ["no-cache"]]. |
| eq-ci | Effectue une correspondance exacte insensible à la casse. La valeur du champ de formulaire doit correspondre à la valeur déclarée dans les conditions. La comparaison est effectuée en minuscules. Par exemple, pour ["eq-ci", "$key", "AbC"], les noms d'objet tels que abc, ABC et aBc correspondent tous. |
| starts-with-ci | Effectue une correspondance de préfixe insensible à la casse. La valeur du champ de formulaire doit commencer par le préfixe spécifié. La comparaison est effectuée en minuscules. Par exemple, pour ["starts-with-ci", "$key", "User/"], les valeurs commençant par user/, USER/ ou User/ correspondent toutes. |
| in-ci | Effectue une vérification insensible à la casse pour déterminer si la valeur est incluse dans une liste de chaînes spécifiée. La comparaison est effectuée en minuscules. Par exemple, pour ["in-ci", "$content-type", ["IMAGE/JPEG", "image/PNG"]], les valeurs telles que image/jpeg et IMAGE/PNG correspondent toutes. |
| not-in-ci | Effectue une vérification insensible à la casse pour déterminer si la valeur est exclue d'une liste de chaînes spécifiée. La comparaison est effectuée en minuscules. Par exemple, pour ["not-in-ci", "$cache-control", ["No-Cache"]], les valeurs telles que no-cache, NO-CACHE et No-Cache sont toutes exclues. |
Caractères d'échappement de la politique
Dans une politique POST, le signe dollar ($) représente une variable. Pour inclure un signe dollar littéral, utilisez le caractère d'échappement \$. Le tableau suivant décrit les caractères qui doivent être échappés dans le JSON de la politique.
| Caractère d'échappement | Description |
| \/ | Barre oblique |
| \\ | Barre oblique inverse |
| \" | Guillemet double |
| \$ | Signe dollar |
| \b | Espace |
| \f | Saut de page |
| \n | Saut de ligne |
| \r | Retour chariot |
| \t | Tabulation horizontale |
| \uxxxx | Caractère Unicode |