A assinatura POST V1 protege as solicitações de upload enviadas pelos clientes ao Object Storage Service (OSS) por meio da operação PostObject. O servidor de aplicação calcula uma assinatura com base em uma política de upload e fornece ambos ao cliente, que os envia como campos de formulário. O OSS verifica a assinatura de cada solicitação POST e rejeita aquelas com assinatura inválida.
O OSS oferece suporte ao algoritmo de assinatura V4, mais seguro. (Recomendado) Use a assinatura V4. Para obter mais informações, consulte V4 signature.
Quando a assinatura POST V1 é necessária
As solicitações HTTP POST para o OSS aceitam o algoritmo de assinatura V1, referido neste tópico como assinatura POST V1. Antes de calcular uma assinatura POST V1, verifique as seguintes condições e dependências:
ACL do bucket — Uma solicitação PostObject deve conter uma assinatura quando a ACL do bucket de destino for public-read ou private.
Campos de formulário — Forneça os campos de formulário
OSSAccessKeyId,Signatureepolicyem conjunto. Se qualquer um desses três campos estiver presente no formulário, os outros dois também serão obrigatórios. Para descrições detalhadas dos campos, consulte Form fields.Local de cálculo da assinatura — O servidor de aplicação calcula a assinatura e a fornece, juntamente com a política de upload, ao cliente. O cliente usa essas informações para construir a solicitação PostObject.
Credenciais — A assinatura é calculada a partir do AccessKey secret. O campo de formulário
OSSAccessKeyIdcontém o AccessKey ID do mesmo par de AccessKey.
Calcular uma assinatura POST V1
Calcule uma assinatura POST V1 no servidor de aplicação seguindo estas três etapas:
Crie a política. Elabore uma política codificada em UTF-8. Para consultar a sintaxe da política e as condições declaráveis, veja Policy structure.
Construa a string a ser assinada (StringToSign). Codifique a política em Base64. A string resultante corresponde à string a ser assinada (StringToSign).
Calcule a assinatura. Use o AccessKey secret para assinar a string alvo. A fórmula de assinatura é
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).
A figura a seguir ilustra o processo de cálculo da assinatura POST V1.
Exemplo: calcular uma assinatura POST V1 em Java
O exemplo Java a seguir executa as três etapas da assinatura POST V1 com base na política de exemplo descrita em Policy structure. A etapa 3 chama o SDK Java do OSS, aplicando a fórmula base64(hmac-sha1(AccessKeySecret,base64(policy))) à string a ser assinada.
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);
}
}
A assinatura é impressa no formato abaixo. O valor exibido é uma string codificada em Base64 que depende do seu AccessKey secret e dos bytes exatos da sua política; portanto, sua saída será diferente da amostra a seguir.
signature:****
Envie o valor calculado no campo de formulário Signature da solicitação PostObject, juntamente com os campos OSSAccessKeyId e policy.
Campos de formulário
Os elementos de formulário listados abaixo são específicos da assinatura POST V1. Para outros elementos comuns, consulte PostObject form elements. Sobre as condições em que esses campos são obrigatórios, veja When a POST V1 signature is required.
|
Campo |
Tipo |
Descrição |
|
OSSAccessKeyId |
String |
O AccessKey ID do par de AccessKey. Valor padrão: Nenhum. |
|
Signature |
String |
Assinatura calculada a partir do AccessKey secret e da política. O OSS usa essa assinatura para validar a solicitação POST. A chave deste campo não diferencia maiúsculas de minúsculas, mas o valor diferencia. Valor padrão: Nenhum. Para detalhes sobre como o OSS valida a assinatura de uma solicitação POST, consulte PostObject. |
|
policy |
String |
Política de segurança que declara as permissões e restrições do upload. Definida em formato JSON, deve incluir os campos |
Estrutura da política
O campo de formulário policy representa uma política de segurança que define permissões e restrições para upload de objetos no OSS via formulário HTML. Essa política, definida em JSON, restringe operações de upload por meio de diversos parâmetros, como nome do bucket permitido, prefixo do objeto, tempo de expiração, métodos HTTP permitidos, limites de tamanho de conteúdo e restrições de tipo de conteúdo.
É obrigatório incluir os campos expiration e conditions na política, conforme demonstrado no exemplo a seguir.
{
"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"]]
]
}
A política contém os seguintes elementos:
expiration — Define o horário de expiração da política no formato ISO 8601 GMT. Por exemplo,
2023-12-03T13:00:00.000Zindica que a solicitação POST deve ser iniciada antes das 13:00 GMT de 3 de dezembro de 2023.conditions — Especifica os valores válidos para os campos de formulário na solicitação POST.
A tabela abaixo descreve os campos declaráveis em conditions.
|
Campo |
Tipo |
Obrigatório |
Descrição |
Modos de correspondência de condição |
|
bucket |
String |
Não |
Nome do bucket. |
bucket |
|
content-length-range |
String |
Não |
Tamanhos mínimo e máximo permitidos para o objeto a ser enviado, em bytes. |
content-length-range |
|
success_action_status |
String |
Não |
Código de status HTTP retornado após um upload bem-sucedido. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
|
key |
String |
Não |
Nome do objeto a ser enviado. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
|
content-type |
String |
Não |
Restringe o tipo de conteúdo do objeto a ser enviado. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
|
cache-control |
String |
Não |
Define o comportamento de cache do objeto. |
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
Modos de correspondência de condição
A tabela a seguir detalha os modos de correspondência de condição disponíveis para uso no campo conditions de uma política POST V1.
|
Modo de correspondência |
Descrição |
|
content-length-range |
Define os tamanhos mínimo e máximo permitidos para uploads de objetos. Por exemplo, para permitir objetos entre 1 e 10 bytes, use |
|
eq |
Realiza uma correspondência exata. O valor do campo de formulário deve ser idêntico ao declarado nas condições. Por exemplo, para exigir que o valor do campo key seja |
|
starts-with |
Efetua uma correspondência por prefixo. O valor do campo de formulário deve começar com o prefixo especificado. Por exemplo, para exigir que o valor do campo key comece com |
|
in |
Verifica se o valor está incluído em uma lista específica de strings. Por exemplo, ao enviar uma imagem via PostObject permitindo múltiplos formatos, use |
|
not-in |
Confirma se o valor está excluído de uma lista específica de strings. Por exemplo, ao enviar um objeto via PostObject e desejar bloquear o valor |
|
eq-ci |
Executa uma correspondência exata sem diferenciar maiúsculas de minúsculas. O valor do campo deve corresponder ao declarado nas condições, sendo a comparação feita em letras minúsculas. Por exemplo, para |
|
starts-with-ci |
Realiza correspondência por prefixo ignorando maiúsculas e minúsculas. O valor do campo deve começar com o prefixo definido, comparado em minúsculas. Por exemplo, para |
|
in-ci |
Verifica, sem distinção entre maiúsculas e minúsculas, se o valor consta em uma lista de strings. A comparação ocorre em minúsculas. Por exemplo, para |
|
not-in-ci |
Verifica, ignorando maiúsculas e minúsculas, se o valor foi excluído de uma lista de strings. A comparação é feita em minúsculas. Por exemplo, para |
Caracteres de escape na política
Em uma política POST, o cifrão ($) funciona como variável. Para inserir um cifrão literal, use o caractere de escape \$. A tabela abaixo lista os caracteres que exigem escape no JSON da política.
|
Caractere de escape |
Descrição |
|
\/ |
Barra normal |
|
\\ |
Barra invertida |
|
\" |
Aspas duplas |
|
\$ |
Cifrão |
|
\b |
Espaço |
|
\f |
Alimentação de formulário |
|
\n |
Quebra de linha |
|
\r |
Retorno de carro |
|
\t |
Tabulação horizontal |
|
\uxxxx |
Caractere Unicode |