La firma POST V1 protege las solicitudes de carga que los clientes envían a Object Storage Service (OSS) mediante la operación PostObject. El servidor de aplicaciones calcula una firma a partir de una directiva de carga y entrega ambos elementos al cliente, quien los envía como campos de formulario. OSS verifica la firma de cada solicitud POST y rechaza aquellas cuya firma no sea válida.
OSS admite el algoritmo de firma V4, que es más seguro. (Recomendado) Utilice la firma V4. Para obtener más información, consulte V4 signature.
Cuándo se requiere una firma POST V1
Las solicitudes HTTP POST a OSS admiten el algoritmo de firma V1, al que este tema denomina firma POST V1. Antes de calcular una firma POST V1, revise las siguientes condiciones y dependencias:
ACL del bucket: Una solicitud PostObject debe incluir una firma cuando la ACL del bucket de destino es public-read o private.
Campos de formulario: Proporcione los campos de formulario
OSSAccessKeyId,Signatureypolicycomo un grupo. Si alguno de estos tres campos está presente en el formulario, los otros dos también son obligatorios. Para consultar las descripciones a nivel de campo, véase Form fields.Dónde se calcula la firma: El servidor de aplicaciones calcula la firma y la entrega al cliente junto con la directiva de carga. El cliente utiliza esta información para construir la solicitud PostObject.
Credenciales: La firma se calcula a partir del secreto de AccessKey. El campo de formulario
OSSAccessKeyIdcontiene el ID de AccessKey del mismo par de AccessKey.
Calcular una firma POST V1
Calcule una firma POST V1 en su servidor de aplicaciones siguiendo estos tres pasos:
Cree la directiva. Cree una directiva codificada en UTF-8. Para conocer la sintaxis de la directiva y las condiciones que puede declarar, consulte Policy structure.
Construya la cadena por firmar (StringToSign). Codifique la directiva en Base64. La cadena resultante es la cadena por firmar (StringToSign).
Calcule la firma. Utilice el secreto de AccessKey para firmar la cadena por firmar. La fórmula de firma es
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).
La siguiente figura muestra el proceso de cálculo de la firma POST V1.
Ejemplo: calcular una firma POST V1 en Java
El siguiente ejemplo en Java ejecuta los tres pasos de la firma POST V1 con la directiva de ejemplo descrita en Policy structure. El paso 3 invoca el SDK de Java de OSS, que aplica la fórmula base64(hmac-sha1(AccessKeySecret,base64(policy))) a la cadena por firmar.
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 firma se imprime en el siguiente formato. El valor impreso es una cadena codificada en Base64 que depende de su secreto de AccessKey y de los bytes exactos de su directiva, por lo que su salida será diferente del siguiente ejemplo.
signature:****
Envíe el valor calculado en el campo de formulario Signature de la solicitud PostObject, junto con los campos de formulario OSSAccessKeyId y policy.
Campos de formulario
Los siguientes elementos de formulario son específicos de la firma POST V1. Para otros elementos de formulario comunes, consulte PostObject form elements. Para conocer las condiciones bajo las cuales estos campos son obligatorios, consulte When a POST V1 signature is required.
|
Campo |
Tipo |
Descripción |
|
OSSAccessKeyId |
String |
El ID de AccessKey del par de AccessKey. Valor predeterminado: Ninguna. |
|
Signature |
String |
La firma calculada a partir del secreto de AccessKey y la directiva. OSS utiliza la firma para verificar la validez de la solicitud POST. La clave de este campo de formulario no distingue entre mayúsculas y minúsculas, pero el valor sí las distingue. Valor predeterminado: Ninguna. Para saber cómo verifica OSS la firma de una solicitud POST, consulte PostObject. |
|
policy |
String |
La directiva de seguridad que declara los permisos y restricciones de la carga. La directiva se define en formato JSON y debe incluir los campos |
Estructura de la directiva
El campo de formulario policy es una directiva de seguridad que define los permisos y restricciones para cargar objetos en OSS mediante un formulario HTML. La directiva se define en formato JSON y restringe las operaciones de carga mediante varios parámetros, como el nombre de bucket permitido, el prefijo del objeto, la hora de vencimiento, los métodos HTTP permitidos, los límites de tamaño de contenido y las restricciones de tipo de contenido.
La directiva debe incluir los campos expiration y conditions, como se muestra en el siguiente ejemplo.
{
"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 directiva contiene los siguientes elementos:
expiration: Especifica la hora de vencimiento de la directiva en formato ISO 8601 GMT. Por ejemplo,
2023-12-03T13:00:00.000Zsignifica que la solicitud POST debe iniciarse antes de las 13:00 GMT del 3 de diciembre de 2023.conditions: Especifica los valores válidos para los campos de formulario en la solicitud POST.
La siguiente tabla describe los campos que puede declarar en conditions.
|
Campo |
Tipo |
Obligatorio |
Descripción |
Modos de coincidencia de condiciones |
|
bucket |
String |
No |
El nombre del bucket. |
bucket |
|
content-length-range |
String |
No |
Los tamaños mínimo y máximo permitidos del objeto a cargar, en bytes. |
content-length-range |
|
success_action_status |
String |
No |
El código de estado HTTP devuelto tras una carga exitosa. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
|
key |
String |
No |
El nombre del objeto a cargar. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
|
content-type |
String |
No |
Restringe el tipo de contenido del objeto a cargar. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
|
cache-control |
String |
No |
Especifica el comportamiento de caché del objeto. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
Modos de coincidencia de condiciones
La siguiente tabla describe los modos de coincidencia de condiciones que puede utilizar en el campo conditions de una directiva POST V1.
|
Modo de coincidencia de condiciones |
Descripción |
|
content-length-range |
Especifica los tamaños mínimo y máximo permitidos para la carga de objetos. Por ejemplo, para permitir tamaños de objeto de 1 a 10 bytes, escriba |
|
eq |
Realiza una coincidencia exacta. El valor del campo de formulario debe coincidir exactamente con el valor declarado en las condiciones. Por ejemplo, para requerir que el valor del campo de formulario key sea |
|
starts-with |
Realiza una coincidencia de prefijo. El valor del campo de formulario debe comenzar con el prefijo especificado. Por ejemplo, para requerir que el valor del campo de formulario key comience con |
|
in |
Comprueba si el valor está incluido en una lista de cadenas especificada. Por ejemplo, cuando carga una imagen mediante la operación PostObject y desea permitir varios formatos de imagen, utilice |
|
not-in |
Comprueba si el valor está excluido de una lista de cadenas especificada. Por ejemplo, cuando carga un objeto mediante la operación PostObject y desea prohibir el valor |
|
eq-ci |
Realiza una coincidencia exacta sin distinción entre mayúsculas y minúsculas. El valor del campo de formulario debe coincidir con el valor declarado en las condiciones. La comparación se realiza en minúsculas. Por ejemplo, para |
|
starts-with-ci |
Realiza una coincidencia de prefijo sin distinción entre mayúsculas y minúsculas. El valor del campo de formulario debe comenzar con el prefijo especificado. La comparación se realiza en minúsculas. Por ejemplo, para |
|
in-ci |
Realiza una comprobación sin distinción entre mayúsculas y minúsculas para determinar si el valor está incluido en una lista de cadenas especificada. La comparación se realiza en minúsculas. Por ejemplo, para |
|
not-in-ci |
Realiza una comprobación sin distinción entre mayúsculas y minúsculas para determinar si el valor está excluido de una lista de cadenas especificada. La comparación se realiza en minúsculas. Por ejemplo, para |
Caracteres de escape de la directiva
En una directiva POST, el signo de dólar ($) representa una variable. Para incluir un signo de dólar literal, utilice el carácter de escape \$. La siguiente tabla describe los caracteres que deben escaparse en el JSON de la directiva.
|
Carácter de escape |
Descripción |
|
\/ |
Barra diagonal |
|
\\ |
Barra diagonal inversa |
|
\" |
Comilla doble |
|
\$ |
Signo de dólar |
|
\b |
Espacio |
|
\f |
Salto de formulario |
|
\n |
Salto de línea |
|
\r |
Retorno de carro |
|
\t |
Tabulación horizontal |
|
\uxxxx |
Carácter Unicode |