Todas as operações do OSS, exceto POST e requisições assinadas por parâmetro de consulta, exigem o cabeçalho Authorization, construído com o algoritmo de assinatura V1 (HMAC-SHA1).
As assinaturas V4 são mais seguras. Incluir uma assinatura V4 no cabeçalho Authorization (recomendado).
Assinatura V1 automática com SDKs do OSS
Os SDKs do OSS gerenciam a assinatura V1 automaticamente.
|
SDK |
Código de exemplo |
|
Java |
|
|
PHP |
|
|
Node.js |
|
|
Browser.js |
|
|
Python |
|
|
.NET |
|
|
Android |
|
|
Go |
|
|
iOS |
|
|
C++ |
|
|
C |
|
|
Ruby |
Cálculo do cabeçalho Authorization
Método de cálculo
Authorization = "OSS " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource))
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Exemplo |
Descrição |
|
AccessKeyId |
String |
Sim |
LTAI |
Par de AccessKey (AccessKey ID e AccessKey secret) para autenticação.
|
|
AccessKeySecret |
String |
Sim |
yourAccessKeySecret |
|
|
x-oss-security-token |
String |
Não |
CAIS** |
Token de segurança STS. Necessário apenas para requisições assinadas por STS. Para obter mais informações sobre como obter um token de segurança, consulte AssumeRole. |
|
VERB |
Enumeração |
Sim |
PUT |
Método de requisição HTTP: PUT, GET, POST, HEAD, DELETE ou OPTIONS. |
|
\n |
String |
Não |
\n |
Quebra de linha. |
|
Content-MD5 |
String |
Não |
eB5e |
Hash MD5 de 128 bits codificado em Base64 do corpo da requisição (excluindo cabeçalhos), conforme RFC 2616 Content-MD5. Verifica a integridade da mensagem. Para obter mais informações sobre como calcular o valor de Content-MD5, consulte Calcular Content-MD5. |
|
Content-Type |
String |
Não |
application/octet-stream |
Tipo MIME do conteúdo da requisição. Nota
Se você omitir Content-Type durante o cálculo da assinatura, não o inclua na requisição assinada. |
|
Date |
String |
Sim |
Sun, 22 Nov 2015 08:16:38 GMT |
Carimbo de data/hora da requisição em UTC, proveniente do cabeçalho Date ou x-oss-date. O x-oss-date tem precedência. Importante
Se o cabeçalho Date diferir do horário do servidor em mais de 15 minutos, o OSS rejeitará a requisição com HTTP 403. |
|
CanonicalizedOSSHeaders |
String |
Não |
x-oss-meta-a:a\nx-oss-meta-b:b\nx-oss-meta-c:c\n |
Cabeçalhos HTTP com o prefixo
Para obter mais informações sobre como construir CanonicalizedOSSHeaders, consulte a seção Construir CanonicalizedOSSHeaders deste tópico. |
|
CanonicalizedResource |
String |
Sim |
examplebucket |
Recurso OSS de destino. Para obter mais informações sobre como construir CanonicalizedResource, consulte a seção Construir CanonicalizedResource deste tópico. |
Exemplos
-
Exemplo 1 (todos os parâmetros)
Requisição
Fórmula
String de assinatura
PUT /nelson HTTP/1.0 Content-MD5: eB5e Content-Type: text/html Date: Wed, 28 Dec 2022 10:27:41 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + Content-MD5 + "\n"+ Content-Type + "\n" + Date + "\n" + CanonicalizedOSSHeaders+ CanonicalizedResource))
PUT\n eB5e\n text/html\n Wed, 28 Dec 2022 10:27:41 GMT\n x-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/examplebucket/nelson
Calcule a assinatura com o AccessKey ID LTAI e o AccessKey secret yourAccessKeySecret:
import hmac import hashlib import base64 h = hmac.new("yourAccessKeySecret".encode('utf-8'), "PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/oss-example/nelson".encode('utf-8'), hashlib.sha1) signature = base64.encodebytes(h.digest()) print(signature)A assinatura é
J9Nl3b+xdEKNQGWFhhZpjSLm****. A requisição final:PUT /nelson HTTP/1.0 Authorization:OSS LTAI****************:J9Nl************************ Content-Md5: eB5e******************** Content-Type: text/html Date: Wed, 28 Dec 2022 10:27:41 GMT Host: oss-example.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra -
Exemplo 2 (sem Content-MD5 e Content-Type)
Requisição
Fórmula
String de assinatura
PUT /nelson HTTP/1.0 Date: Wed, 28 Dec 2022 09:56:32 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + "\n"+ "\n" + Date + "\n" + CanonicalizedOSSHeaders+ CanonicalizedResource))
PUT\n\n\nWed, 28 Dec 2022 09:56:32 GMT\n x-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/examplebucket/nelson
Calcule a assinatura com o AccessKey ID LTAI e o AccessKey secret KZo1:
import hmac import hashlib import base64 h = hmac.new("KZo1**************************".encode('utf-8'), "PUT\n\n\nWed, 28 Dec 2022 09:56:32 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/oss-example/nelson".encode('utf-8'), hashlib.sha1) signature = base64.encodebytes(h.digest()) print(signature)A assinatura é
Mhb1************************. A requisição final:PUT /nelson HTTP/1.0 Authorization:OSS LTAI****************:Mhb1************************ Date: Wed, 28 Dec 2022 09:56:32 GMT Host: oss-example.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
Informações adicionais
-
Se o AccessKey ID não existir ou estiver inativo, o OSS retornará 403 Forbidden com InvalidAccessKeyId. Se o AccessKey ID for válido, mas a assinatura estiver incorreta, o OSS retornará 403 Forbidden com a string de assinatura esperada para depuração.
Resposta de exemplo:
<?xml version="1.0" ?> <Error> <Code> SignatureDoesNotMatch </Code> <Message> The request signature we calculated does not match the signature you provided. Check your key and signing method. </Message> <StringToSignBytes> 47 45 54 0a 0a 0a 57 65 64 2c 20 31 31 20 4d 61 79 20 32 30 31 31 20 30 37 3a 35 39 3a 32 35 20 47 4d 54 0a 2f 75 73 72 65 61 6c 74 65 73 74 3f 61 63 6c </StringToSignBytes> <RequestId> 1E446260FF9B**** </RequestId> <HostId> oss-cn-hangzhou.aliyuncs.*** </HostId> <SignatureProvided> y5H7yzPsA/tP4+0tH1HHvPEwUv8= </SignatureProvided> <StringToSign> GET Wed, 11 May 2011 07:59:25 GMT /examplebucket?acl </StringToSign> <OSSAccessKeyId> AKIAIVAKMSMOY7VO**** </OSSAccessKeyId> </Error> Se o formato do cabeçalho Authorization for inválido, o OSS retornará 400 Bad Request com InvalidArgument.
-
As datas das requisições OSS devem usar o formato UTC HTTP/1.1:
date1 = 2DIGIT SP month SP 4DIGIT; day month year (e.g., 02 Jun 1982)NotaO campo
dayexige dois dígitos.Jun 2,2 Jun 1982e2-Jun-1982são inválidos.Se o cabeçalho Date estiver ausente ou for inválido, o OSS retornará 403 Forbidden com AccessDenied.
Se o cabeçalho Date diferir do horário do servidor em mais de 15 minutos, o OSS retornará 403 Forbidden com RequestTimeTooSkewed.
Construir CanonicalizedOSSHeaders
CanonicalizedOSSHeaders inclui todos os cabeçalhos HTTP com o prefixo x-oss-:
Os nomes de cabeçalho com o prefixo
x-oss-devem estar em minúsculas. Exemplo:X-OSS-Meta-Name: TaoBao→x-oss-meta-name: TaoBao.-
Para credenciais temporárias STS, adicione o token de segurança no formato
x-oss-security-token:security-token.NotaPara obter mais informações sobre como configurar o STS, consulte Acessar o OSS usando credenciais temporárias STS. Você pode chamar a operação AssumeRole ou usar SDKs do STS para várias linguagens de programação para obter credenciais de acesso temporárias. As credenciais temporárias consistem em um token de segurança e um par de AccessKey temporário.
Ordene todos os cabeçalhos alfabeticamente por nome.
Remova espaços ao redor dos dois pontos entre cada nome e valor de cabeçalho. Exemplo:
x-oss-meta-name: TaoBao→x-oss-meta-name:TaoBao.Una todos os cabeçalhos com
\npara produzir CanonicalizedOSSHeaders.
Construir CanonicalizedResource
CanonicalizedResource identifica o recurso OSS de destino:
Se o recurso contiver um bucket e um objeto, defina CanonicalizedResource como /BucketName/ObjectName.
Se o recurso contiver apenas um bucket, defina CanonicalizedResource como /BucketName/.
Se o recurso não contiver bucket nem objeto, defina CanonicalizedResource como /.
-
Se existirem sub-recursos, ordene-os alfabeticamente, separe-os com
&e anexe-os após um?. Formato:/BucketName/ObjectName?acl&uploadId=UploadId.O OSS suporta os seguintes tipos de sub-recursos:
-
Identificadores de recursos, como acl, uploads, location, cors, logging, website, referer, lifecycle, delete, append, tagging, objectMeta, uploadId, partNumber, security-token, position, img, style, styleName, replication, replicationProgress, replicationLocation, cname, bucketInfo, comp, qos, live, status, vod, startTime, endTime, symlink, x-oss-process, callback e callback-var. Para obter mais informações, consulte PutBucket e PutObject.
ImportanteOs identificadores de recursos diferenciam maiúsculas de minúsculas.
Cabeçalhos de resposta, como response-content-language, response-expires, response-cache-control, response-content-disposition e response-content-encoding. Para obter mais informações, consulte GetObject.
Modos de processamento de imagem (IMG), como
x-oss-process. Visão geral.-
Campos de controle de acesso que começam com
x-oss-ac-*, como x-oss-ac-source-ip, x-oss-ac-subnet-mask, x-oss-ac-vpc-id e x-oss-ac-forward-allow. Criar uma URL assinada usando a assinatura V1.NotaApós gerar uma assinatura com x-oss-ac-source-ip, remova x-oss-ac-source-ip dos parâmetros de consulta para evitar vazamentos de endereços IP.
-
Regras de cálculo de assinatura
Codifique a string de assinatura em
UTF-8. Caracteres chineses exigem codificaçãoUTF-8. Use a string codificada comAccessKeySecretpara calcular a assinatura.A assinatura é calculada usando HMAC-SHA1 conforme definido em RFC 2104, com o AccessKey secret como chave.
Content-TypeeContent-MD5são opcionais. Se omitidos, substitua por quebras de linha (\n) na string de assinatura.-
Apenas cabeçalhos com o prefixo
x-oss-são incluídos na string de assinatura. O OSS ignora outros cabeçalhos não padrão.NotaOs cabeçalhos com o prefixo
x-oss-na string de assinatura devem seguir estas convenções:Os nomes dos cabeçalhos devem estar em minúsculas.
Os cabeçalhos devem ser ordenados alfabeticamente.
Não deve haver espaços antes ou depois dos dois pontos que separam cada nome e valor de cabeçalho.
Cada cabeçalho termina com uma quebra de linha (\n). Se não houver cabeçalhos, deixe CanonicalizedOSSHeaders vazio.
Calcular Content-MD5
Estes exemplos calculam o Content-MD5 para a string "123456789".
-
Cálculo correto
Calcule o hash MD5 de 128 bits da string.
Codifique o resumo binário em Base64 (não a string hexadecimal de 32 caracteres).
Exemplo em Python:
>>> import base64,hashlib >>> hash = hashlib.md5() >>> hash.update("0123456789") // If you use Python 3, change this line to hash.update(b"0123456789"). >>> base64.b64encode(hash.digest()) 'eB5e********************'Chame hash.digest() para obter o resumo binário de 128 bits.
>>> hash.digest() 'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7' -
Cálculo incorreto
NotaUm erro comum é codificar a string hexadecimal de 32 caracteres em Base64 em vez do resumo binário.
# Call hash.hexdigest() to obtain a 32-bit plaintext string. >>> hash.hexdigest() '781e5e245d69b566979b86e28d23f2c7' # The following sample code provides an example of the result of encoding an incorrect MD5 hash in Base64: >>> base64.b64encode(hash.hexdigest()) 'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='