Você pode autorizar requisições gerando uma URL pré-assinada. Uma URL pré-assinada é uma alternativa ao uso do campo Authorization no cabeçalho de uma requisição HTTP. Ela contém uma assinatura e outras informações necessárias para a requisição. Esse método permite conceder acesso temporário a recursos do Object Storage Service (OSS) a terceiros por um período determinado, sem expor suas credenciais de acesso. Este tópico descreve como incluir uma assinatura V1 em uma URL.
O OSS oferece suporte ao algoritmo de assinatura V4, que é mais seguro. Use assinaturas V4 para maior segurança. Para obter mais informações, consulte V4 signatures.
Implementação de assinatura pelo SDK
Os SDKs do OSS implementam assinaturas V1 automaticamente. Não é necessário gerenciar assinaturas ao usar um SDK do OSS. Para entender a implementação de assinatura em uma linguagem específica, consulte o código-source do SDK. A tabela a seguir lista os arquivos que implementam a assinatura em cada SDK.
|
SDK |
Implementação da assinatura |
Exemplo de uso |
|
Java |
||
|
PHP |
||
|
Node.js |
||
|
Browser.js |
||
|
Python |
||
|
Android |
||
|
iOS |
||
|
Go |
||
|
C++ |
||
|
C |
||
|
.Net |
||
|
Ruby |
Observações de uso
Ao usar uma URL assinada, os dados autorizados ficam expostos na internet até a URL expirar. Avalie os riscos antes de adotar esse método.
O OSS não oferece suporte à inclusão de assinaturas simultaneamente na URL e no cabeçalho da requisição.
É possível gerar uma URL pré-assinada para uma operação PUT a fim de garantir que o conteúdo correto seja enviado. Quando um SDK pré-assina uma requisição, ele calcula o checksum MD5 do corpo da requisição e o inclui na URL pré-assinada. O usuário deve fazer upload de conteúdo cujo checksum MD5 corresponda ao presente na URL pré-assinada; caso contrário, a operação falhará. Para validar o MD5, adicione o cabeçalho Content-MD5 à requisição.
Implementação da assinatura
-
Exemplo de assinatura
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2p***********&Expires=1141889120&Signature=****Pxyb****mGa%****272YEAiv****Ao usar um usuário do Security Token service (STS) para construir uma URL assinada, inclua o parâmetro
security-token.https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2p***********&Expires=1141889120&Signature=****Pxyb****mGa%****272YEAiv****&security-token=CAIS****q6Ft5B2yfSjIr****Oz31blR9oWmWBf****DR/xm3Imc****IHxMdHJsCeAcs/Q0lGFR5/sflqJIR****EvCUcZr8szfWcsZos2****u5Jko1be0ewHKeQKZsebWZ+LmNpy/Ht6md1HDkAJq3LL+bk/Mdle5MJqP+/kFC9MMRVuAcCZhDtVbLRcYgq18D3bKMuu3ORPHm3fZCFES2jBxkmRi86+ysIP+phPVlw/90fRH5dazcJW0Zsx0OJo6Wcq+3+FqM6DQlTNM6hwNtoUO1fYUommb54nDXwQIvUjfbtC5qIM/cFVLAYEhAL****TGkvl1h/fejYyfyW****kFCHiPF****JCUSbr4a4sjF6zyPnPWycyCLYXleLzhxPWd/2kagAGaXG69BqwYNvrKKI3W8****bNc1wQDMXQfiHpFCRG6lYhh3****pwH90A3sTlxzRGvi8+****JwrluOHWs+Fj6S6s0cOhKvKRWYE8UuWeXIvv4l6DAGwH****LjLC11f5prUJ****b+3hwuBod32Jx+us/1p996Glao725orcb****Adicione um endereço IP específico, um intervalo de endereços IP ou um VPC ID à URL assinada para impedir que clientes não autorizados acessem recursos do OSS.
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?&OSSAccessKeyId=44CF****************&Expires=1475462111&Signature=77Dv****************&x-oss-ac-subnet-mask=32 -
Parâmetros
Nome
Tipo
Obrigatório
Descrição
OSSAccessKeyId
String
Sim
O AccessKey ID usado na assinatura da URL.
Expires
Number
Sim
O tempo de expiração da URL no formato . O Unix time representa o número de segundos decorridos desde 00:00:00 UTC em 1º de janeiro de 1970. Se o OSS receber a requisição após o tempo de expiração, retornará um código de erro de timeout. Por exemplo, se o horário atual for 1141889060 e você quiser crie uma URL que expire em 60 segundos, defina Expires como 1141889120.
NotaPor segurança, o período de validade padrão de uma URL no console do OSS é de 3.600 segundos. O período máximo é de 32.400 segundos. Para obter mais informações sobre como alterar o tempo de expiração da URL, consulte Use file URLs.
Signature
String
Sim
As informações de assinatura. O formato é o seguinte:
Signature = urlencode(base64(hmac-sha1(AccessKeySecret, VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + EXPIRES + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource)))-
O algoritmo de assinatura em uma URL é semelhante ao algoritmo de inclusão de assinatura no cabeçalho, válido para todas as requisições e parâmetros de cabeçalho suportados pelo OSS.
-
Ao calcular a string de assinatura a ser adicionada a uma URL, os cabeçalhos definidos em signature V1 — como
CONTENT-TYPE,CONTENT-MD5eCanonicalizedOSSHeaders— são os mesmos usados para calcular a assinatura adicionada ao cabeçalho Authorization. Contudo, substitua o parâmetro Date pelo parâmetro Expires na string de assinatura. O cabeçalho Date pode ser incluído na requisição, mas não precisa constar na string de assinatura. -
Aplique URL encoding à assinatura ao incluí-la na URL. Se Signature, Expires ou OSSAccessKeyId aparecerem mais de uma vez na URL, o primeiro valor será utilizado.
-
Quando uma URL assinada é utilizada, o OSS verifique primeiro se o horário da requisição é posterior ao tempo definido em Expires e, em seguida, valida a assinatura.
security-token
String
Não
O token de segurança. Defina este parâmetro somente ao usar um usuário STS para construir a URL assinada.
NotaPara obter mais informações sobre como configurar o service STS, consulte Use temporary access credentials from STS to access OSS. Obtenha credenciais de acesso temporárias chamando a operação de api STS AssumeRole ou usando o STS SDKs for different languages. As credenciais temporárias incluem um par de AccessKey temporário (AccessKey ID e AccessKey secret) e um token de segurança (SecurityToken).
x-oss-ac-source-ip
String
Não
Especifique o endereço IP ou o intervalo de endereços IP.
Importante-
Este parâmetro é usado apenas durante a geração da assinatura. Não é necessário incluí-lo na URL.
-
Ao adicionar um endereço IP ou intervalo de endereços IP na geração da assinatura, passe também o parâmetro x-oss-ac-subnet-mask para especifique a máscara de sub-rede.
x-oss-ac-subnet-mask
Number
Não
O número de bits 1 na máscara de sub-rede. Se a requisição incluir este parâmetro, o OSS realizará uma operação AND bit a bit entre o endereço IP real da requisição e a máscara de sub-rede. O resultado é usado para verifique a assinatura. Caso este parâmetro seja adulterado, a validação da assinatura falhará.
x-oss-ac-vpc-id
String
Não
Especifique o VPC ID. Após defina este parâmetro, o OSS verifique se a requisição é originada do VPC ID correspondente. Se a requisição vier do VPC ID especificado e este parâmetro estiver definido, o OSS validará tanto o VPC ID quanto o endereço IP de source ou o intervalo de endereços IP.
x-oss-ac-forward-allow
Boolean
Não
Indica se requisições encaminhadas são permitidas. Quando o OSS detecta este campo e a requisição contém
X-Forwarded-For— que pode conter múltiplos endereços IP —, o OSS usa o valor deX-Forwarded-Forpara validar a assinatura.Os valores válidos são:
-
true: Permite requisições encaminhadas.
ImportanteDefina este valor como true cria o risco de o cabeçalho da requisição ser adulterado ou interceptado.
-
false (padrão): Não permite requisições encaminhadas.
-
-
Código Python de exemplo para assinatura (incluindo apenas os parâmetros obrigatórios)
import base64 import hmac import hashlib from urllib.parse import quote access_key_secret = "yourAccessKeySecret" string_to_sign = "GET\n\n\n1141889120\n/examplebucket/oss-api.pdf" h = hmac.new( access_key_secret.encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha1 ) signature = quote(base64.b64encode(h.digest()).decode('utf-8')) print(signature)
Códigos de erro
|
Código de erro |
Mensagem retornada |
Descrição |
|
AccessDenied |
403 Forbidden |
Os parâmetros Signature, Expires e OSSAccessKeyId são obrigatórios. Não há exigência de ordem específica entre eles. |
|
AccessDenied |
403 Forbidden |
A requisição foi recebida após o tempo especificado no parâmetro Expires, ou o formato do tempo está incorreto. |
|
InvalidArgument |
400 Bad Request |
Pelo menos um dos parâmetros Signature, Expires ou OSSAccessKeyId está presente na URL e as informações de assinatura também estão incluídas no cabeçalho de requisição Authorization. |