Autenticação de assinatura realizada na tabela carregada por meio de um navegador
O OBS suporta carregamento de objetos baseado em navegador usando o método POST. As assinaturas de tais solicitações são carregadas em tabelas. Primeiro, crie uma política de segurança e especifique os requisitos na solicitação, por exemplo, nome do intervalo e prefixo do nome do objeto. Em seguida, crie uma assinatura com base nessa política. O formulário de solicitação a ser assinado deve conter assinatura e política válidas. Finalmente, crie uma tabela para carregar o objeto no bucket.
O processo de cálculo da assinatura é o seguinte:
- O conteúdo da política é codificado no formato UTF-8.
- Execute a codificação Base64 no resultado obtido na etapa anterior.
- Use o SK para executar o cálculo da assinatura HMAC-SHA1 no resultado obtido na etapa 2.
- Execute a codificação Base64 no resultado da etapa 3 para obter a assinatura.
StringToSign = Base64( UTF-8-Encoding-Of( policy ) ) Signature = Base64( HMAC-SHA1( YourSecretAccessKeyID, StringToSign ) )
{ "expiration": "2017-12-31T12:00:00.000Z",
"conditions": [
{"x-obs-acl": "public-read" },
{"x-obs-security-token": "YwkaRTbdY8g7q...." },
{"bucket": "book" },
["starts-with", "$key", "user/"]
]
}
A apólice contém o período de validade (veja Expiração) e as condições (veja Condições).
Expiração
O campo de expiration descreve quando a assinatura expirará, o que é expresso no formato de acordo com a ISO 8601 UTC. Por exemplo, expiration: 2017-12-31T12:00:00.000Z no exemplo significa que a solicitação se torna inválida após as 12:00:00 do dia 31 de dezembro de 2017. Esse campo deve ser especificado em uma política. Só pode estar no formato aaaa-MM-dd'T'HH:mm:ss'Z' ou aaaa-MM-dd'T'HH:mm:ss.SSS'Z'.
Condições
Um mecanismo usado para verificar a validade de uma solicitação. As condições são usadas para definir o conteúdo que deve estar contido em uma solicitação. No exemplo, o nome do intervalo solicitado é book, o nome do objeto é prefixado com user/ e a ACL do objeto é leitura pública. Todos os itens no formulário, exceto AccessKeyId, signature, file, policy, token, field names e o prefixo x-ignore-, devem ser incluídos na política. A tabela a seguir lista os itens que devem estar contidos em Conditions.
Elemento |
Descrição |
---|---|
x-obs-acl |
ACL na solicitação. Suporta correspondência exata e correspondência condicional como starts-with. |
content-length-range |
Comprimento máximo e mínimo de um objeto a ser carregado. O valor pode ser um intervalo. |
Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expira |
Cabeçalhos especialmente para solicitações REST Suporta correspondência exata e correspondência condicional como starts-with. |
key |
Nome de um objeto a ser carregado. Suporta correspondência exata e correspondência condicional como starts-with. |
bucket |
Nome do bucket solicitado. Suporta correspondência exata. |
success_action_redirect |
Endereço de redirecionamento após o carregamento ser sucedido. Para mais detalhes, consulte Carregamento de objetos - POST. Suporta correspondência exata e correspondência condicional como starts-with. |
success_action_status |
Se success_action_redirect não for especificado, o código de status será retornado ao cliente quando o carregamento for bem-sucedido. Para mais detalhes, consulte Carregamento de objetos - POST. Suporta correspondência exata. |
x-obs-meta-* |
Metadados definidos pelo usuário. Palavras-chave em um elemento não podem conter caracteres não ASCII ou irreconhecíveis. Se não-ASCII ou irreconhecíveis caracteres são necessários, eles devem ser codificados e decodificados no lado do cliente. A codificação URL ou a codificação Base64 são aceitáveis, mas o servidor não realiza a decodificação. Suporta correspondência exata e correspondência condicional como starts-with. |
x-obs-* |
Outros campos de cabeçalho com prefixo x-obs-. Suporta correspondência exata e correspondência condicional como starts-with. |
x-obs-security-token |
Nome do campo no cabeçalho da solicitação. Campo obrigatório para a autenticação temporária de AK/SK e token de segurança. |
As condições da política podem ser combinadas das seguintes maneiras:
Método de correspondência |
Descrição |
---|---|
Correspondências exatas |
Correspondência exata por padrão. O valor na tabela POST deve ser o mesmo da política. Por exemplo, se a ACL do objeto estiver definida como public-read quando o objeto for carregado, o valor do elemento x-obs-acl na tabela será public-read. Portanto, as condições da política podem ser definidas para {"x-obs-acl": "public-read"} ou ["eq", "$x-obs-acl", "public-read"], que são equivalentes. |
Começa com |
Se essa condição for usada, o valor definido na tabela POST deverá começar com uma seqüência de caracteres fixa. Por exemplo, se o nome dos objetos carregados deve ser prefixado com user/, o valor do elemento key na tabela pode ser user/test1, user/test2, e assim por diante. Portanto, as condições na política podem ser definidas para: ["starts-with", "$key", "user/"] |
Correspondendo a qualquer conteúdo |
O elemento correspondente na tabela POST pode ser qualquer valor. Por exemplo, se o endereço de redirecionamento após o sucesso da solicitação puder ser qualquer endereço, o valor do elemento success_action_redirect na tabela poderá ser qualquer valor. Portanto, as condições na política podem ser definidas para: ["starts-with", "$success_action_redirect", ""] |
Especificando intervalos |
O comprimento do conteúdo do elemento de arquivo na tabela POST pode ser um intervalo especificado e é usado apenas para limitar o tamanho do objeto. Por exemplo, se o tamanho do objeto carregado estiver entre 1 MB e 10 MB, o tamanho do conteúdo do elemento de file na tabela pode ser de 1048576 a 10485760. Portanto, as condições na política podem ser definidas como (o valor não contém aspas) ["content-length-range", 1048576, 10485760] |
Uma política está no formato JSON. As condições podem ser colocadas em colchetes {} e [] colchetes. Os elementos chave e valor da tabela são escritos nos colchetes {}, que são separados por dois pontos (:). Os colchetes [] contêm o tipo de condição, chave e valor, que são separados por vírgulas (,). O sinal de dólar ($) na frente da chave indica que a chave é uma variável.
Os seguintes caracteres devem ser escapados em uma política:
Personagem Depois da Fuga |
Personagem Real |
---|---|
\\ |
Barra invertida (\) |
\$ |
Dólar símbolo ($) |
\b |
Retroceder |
\f |
Página para cima e para baixo |
\n |
Quebras de linha |
\r |
Insira |
\t |
Mesa horizontal |
\v |
Mesa vertical |
\uxxxx |
Todos os caracteres Unicode |
Exemplos de solicitação e política
As tabelas a seguir fornecem exemplos de solicitações e políticas.
Exemplo 1:: Carregue o objeto testfile.txt no bucket examplebucket e defina a ACL do objeto como public-read.
Solicitação |
política |
---|---|
POST / HTTP/1.1 Host: examplebucket.obs.region.myhuaweicloud.com Content-Type: multipart/form-data; boundary=7e32233530b26 Content-Length: 1250 --7e32233530b26 Content-Disposition: form-data; name="key" testfile.txt --7e32233530b26 Content-Disposition: form-data; name="x-obs-acl" public-read --7e32233530b26 Content-Disposition: form-data; name="content-type" text/plain --7e32233530b26 Content-Disposition: form-data; name="AccessKeyId" UDSIAMSTUBTEST000002 --7e32233530b26 Content-Disposition: form-data; name="policy" ewogICJleHBpcmF0aW9uIjogIjIwMTktMDctMDFUMTI6MDA6MDAuMDAwWiIsCiAgImNvbmRpdGlvbnMiOiBbCiAgICB7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0IiB9LAogICAgWyJlcSIsICIka2V5IiwgInRlc3RmaWxlLnR4dCJdLAoJeyJ4LW9icy1hY2wiOiAicHVibGljLXJlYWQiIH0sCiAgICBbImVxIiwgIiRDb250ZW50LVR5cGUiLCAidGV4dC9wbGFpbiJdLAogICAgWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsIDYsIDEwXQogIF0KfQo= --7e32233530b26 Content-Disposition: form-data; name="signature" xxl7bZs/5FgtBUggOdQ88DPZUo0= --7e32233530b26 Content-Disposition: form-data; name="file"; filename="E:\TEST_FILE\TEST.txt" Content-Type: text/plain 123456 --7e32233530b26 Content-Disposition: form-data; name="submit" Upload --7e32233530b26-- |
{ "expiration": "2019-07-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, ["eq", "$key", "testfile.txt"], {"x-obs-acl": "public-read" }, ["eq", "$Content-Type", "text/plain"] ] } |
Exemplo 2: Carregue o objetofile/obj1 no bucket examplebucket e configure os quatro itens de metadados personalizados do objeto.
Solicitação |
política |
---|---|
POST / HTTP/1.1 Host: examplebucket.obs.region.myhuaweicloud.com Content-Type: multipart/form-data; boundary=7e329d630b26 Content-Length: 1597 --7e3542930b26 Content-Disposition: form-data; name="key" file/obj1 --7e3542930b26 Content-Disposition: form-data; name="AccessKeyId" UDSIAMSTUBTEST000002 --7e3542930b26 Content-Disposition: form-data; name="policy" ewogICJleHBpcmF0aW9uIjogIjIwMTktMDctMDFUMTI6MDA6MDAuMDAwWiIsCiAgImNvbmRpdGlvbnMiOiBbCiAgICB7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0IiB9LAogICAgWyJzdGFydHMtd2l0aCIsICIka2V5IiwgImZpbGUvIl0sCiAgICB7Ingtb2JzLW1ldGEtdGVzdDEiOiJ2YWx1ZTEifSwKICAgIFsiZXEiLCAiJHgtb2JzLW1ldGEtdGVzdDIiLCAidmFsdWUyIl0sCiAgICBbInN0YXJ0cy13aXRoIiwgIiR4LW9icy1tZXRhLXRlc3QzIiwgImRvYyJdLAogICAgWyJzdGFydHMtd2l0aCIsICIkeC1vYnMtbWV0YS10ZXN0NCIsICIiXQogIF0KfQo= --7e3542930b26 Content-Disposition: form-data; name="signature" HTId8OCBisn6FfdWKqSJP9RN4Oo= --7e3542930b26 Content-Disposition: form-data; name="x-obs-meta-test1" value1 --7e3542930b26 Content-Disposition: form-data; name="x-obs-meta-test2" value2 --7e3542930b26 Content-Disposition: form-data; name="x-obs-meta-test3" doc123 --7e3542930b26 Content-Disposition: form-data; name="x-obs-meta-test4" my --7e3542930b26 Content-Disposition: form-data; name="file"; filename="E:\TEST_FILE\TEST.txt" Content-Type: text/plain 123456 --7e3542930b26 Content-Disposition: form-data; name="submit" Upload --7e3542930b26-- |
{ "expiration": "2019-07-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, ["starts-with", "$key", "file/"], {"x-obs-meta-test1":"value1"}, ["eq", "$x-obs-meta-test2", "value2"], ["starts-with", "$x-obs-meta-test3", "doc"], ["starts-with", "$x-obs-meta-test4", ""] ] } |