A API do Photo and Drive Service (PDS) oferece suporte a dois modos de autenticação. Além da autenticação baseada em tokens de acesso, a API do PDS também permite autenticação por pares de AccessKey. Assine uma solicitação de API com um par de AccessKey e envie a solicitação assinada para chamar uma operação da API.
1. Exemplo de solicitação para chamar uma operação de API com um par de AccessKey
Chame todas as operações de API nos endpoints listados abaixo enviando solicitações assinadas com pares de AccessKey.
|
Endpoint |
Descrição |
|
|
Endpoint para operações de API relacionadas a recursos, autorização e autenticação. |
Exemplo de solicitação:
POST /v2/drive/list
Host: ${domainID}.api.aliyunpds.com
Authorization: acs ${ACCESS_KEY_ID}:${SIGNATURE}
Content-Type: application/json; charset=UTF-8
{
"owner": "xxxx"
}
2. Assine uma solicitação com um par de AccessKey
Adicione o cabeçalho Authorization à solicitação HTTP para incluir uma assinatura. Essa assinatura indica que a solicitação está autorizada.
2,1 Método de cálculo da assinatura
O exemplo a seguir utiliza o estilo de solicitação ROA (Resource-Oriented Architecture) do Alibaba Cloud SDK. Certifique-se de que o Alibaba Cloud SDK esteja acessível.
Authorization = "acs " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ Accept + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedHeaders
+ CanonicalizedResource))
AccessKeySecret: segredo do AccessKey usado para assinar a solicitação.VERB: método da solicitação HTTP. Defina o valor como POST.\n: caractere de nova linha.Accept: opcional. Se especificar este cabeçalho, defina o valor comoapplication/json.Content-MD5: hash MD5 do conteúdo da solicitação. Especifique este cabeçalho apenas se o corpo da solicitação não estiver vazio. Calcule o hash MD5 do conteúdo da solicitação (excluindo os cabeçalhos) para obter um número de 128 bits. Codifique esse número em Base64 para gerar o valor deste cabeçalho. Use-o para verificar se o conteúdo recebido é idêntico ao enviado. Exemplo:eB5eJF1ptWaXm4bijSPyxw==. Para mais informações, consulteContent-MD5na RFC 2616.Content-Type: opcional. Especifica o tipo de conteúdo da solicitação. Exemplo:application/octet-stream.Date: obrigatório. Indica o horário de envio da solicitação no formato GMT (Greenwich Mean Time). Exemplo:
Sun, 22 Nov 2015 08:16:38 GMT.CanonicalizedHeaders: cabeçalhos HTTP com o prefixox-acs-, organizados em ordem alfabética.CanonicalizedResource: recursos do PDS que você deseja acessar. O cabeçalhoDatee a stringCanonicalizedResourcesão obrigatórios. Se a diferença entre o horário especificado no cabeçalho Date da solicitação e o horário do servidor PDS no recebimento for superior a 15 minutos, o PDS rejeitará a solicitação e retornará o código de status HTTP 403.
2,2 Como criar uma string CanonicalizedHeaders
A string CanonicalizedHeaders consiste em todos os cabeçalhos HTTP com o prefixo x-acs-. Para criar essa string, execute as etapas a seguir:
Converta os nomes de todos os cabeçalhos HTTP com prefixo
x-acs-para letras minúsculas. Por exemplo, convertaX-ACS-Meta-Name: TaoBaoemx-acs-meta-name: TaoBao.Se a solicitação usar um par de AccessKey fornecido pelo Security Token Service (STS), adicione o valor de
security-tokenà string CanonicalizedHeaders no formatox-acs-security-token:security-token.Ordene alfabeticamente todos os cabeçalhos HTTP obtidos na etapa anterior.
Remova todos os espaços antes e depois do delimitador entre cada cabeçalho e seu valor. Por exemplo, converta
x-acs-meta-name: TaoBaoemx-acs-meta-name:TaoBao.Separe cada par de cabeçalho e valor com o delimitador
\npara obter a stringCanonicalizedHeaders.
Se a solicitação não contiver cabeçalhos HTTP com o prefixo x-acs-, deixe a string CanonicalizedHeaders vazia. Nesse caso, não adicione o delimitador \n ao final da string vazia. Se a solicitação contiver um ou mais cabeçalhos com esse prefixo, adicione obrigatoriamente o delimitador \n ao final da string CanonicalizedHeaders obtida. Exemplos: x-acs-meta-a\n e x-acs-meta-a:a\nx-acs-meta-b:b\nx-acs-meta-c:c\n.
2,3 Como criar uma string CanonicalizedResource
A string CanonicalizedResource especifica o recurso do PDS que você deseja acessar. Para criar essa string, execute as etapas a seguir:
Defina a string
CanonicalizedResourcecomo uma string vazia "".Adicione o recurso do PDS que você deseja acessar à string vazia. Exemplo:
/v2/domain/list.
2,4 Regras de cálculo da assinatura
A string a ser assinada deve estar codificada em UTF-8. Use a string codificada em UTF-8 e o
AccessKeySecretpara calcular a assinatura.Use o método
HMAC-SHA1definido na RFC 2104 para calcular a assinatura. Nesse método, oAccessKeySecretfunciona como chave.Os cabeçalhos
Accept,Content-TypeeContent-MD5são opcionais. Se estiverem vazios na solicitação, substitua-os por caracteres de nova linha (\n) ao calcular a assinatura.Entre os cabeçalhos HTTP não padrão, apenas aqueles com o prefixo
x-acs-devem compor a string a ser assinada. Os demais cabeçalhos não padrão são ignorados.Os cabeçalhos com prefixo
x-acs-na string a ser assinada devem obedecer às seguintes convenções:Nomes dos cabeçalhos em letras minúsculas.
Cabeçalhos ordenados alfabeticamente.
Sem espaços antes ou depois dos dois pontos (:) que separam o nome do cabeçalho de seu valor.
Cada cabeçalho deve ser seguido por uma nova linha (
\n). Se a solicitação não contiver cabeçalhos com prefixo x-acs-, defina a stringCanonicalizedHeaderscomo vazia, sem o delimitador \n final.
2,5 Solução de problemas
Se especificar o cabeçalho
Accept, verifique se o valor éapplication/json. Caso contrário, o sistema retornará o erro400 Bad Requestcom o códigoInvalidHeader.Verifique se o tamanho do corpo não excede 4 MB. Se exceder esse limite, o sistema retornará o erro
400 Bad Requestcom o códigoInvaliField.Se o formato do cabeçalho
Authorizationfor inválido, o sistema retornará o erro400 Bad Requestcom o códigoInvaliField.Se o AccessKey ID começar com STS, verifique se o cabeçalho
x-acs-security-tokenestá definido. Caso contrário, o sistema retornará o erro403 Forbiddencom o códigoInvalidHeader.Se o
AccessKey IDnão existir ou estiver no estado Disabled, o sistema retornará o erro403 Forbiddencom o códigoInvalidParameter.Se o
AccessKey IDestiver no estado Enabled, mas o PDS detectar que a assinatura da solicitação é inválida, o sistema retornará o erro403 Forbiddencom o códigoSignatureDoesNotMatch. A string usada para verificar a assinatura também será retornada naresponse. Verifique se a string de assinatura está correta com base nessa resposta.
3. Controle de permissões
O servidor de API do PDS usa o Resource Access Management (RAM) da Alibaba Cloud para verificar permissões. Configure políticas de permissão para o par de AccessKey do usuário RAM no RAM console.
A tabela a seguir descreve a ação e o recurso verificados em cada operação da API.
|
Operação |
Ação |
Recurso |
|
ListStores(/v2/domain/liststores) |
pds:ListStores |
|
|
ListStoreFiles(/v2/storefile/list) |
pds:ListStoreFiles |
|
|
CreateDrive(/v2/drive/create) |
pds:CreateDrive |
|
|
ListDrives(/v2/drive/list) |
pds:ListDrives |
|
|
GetDrive(/v2/drive/get) |
pds:GetDrive |
|
|
UpdateDrive(/v2/drive/update) |
pds:UpdateDrive |
|
|
DeleteDrive(/v2/drive/delete) |
pds:DeleteDrive |
|
|
ListMyDrives(/v2/drive/list_my_drives) |
pds:ListMyDrives |
|
|
ListMyShares(/v2/drive/list_my_shares) |
pds:ListMyShares |
|
|
CreateUser(/v2/user/create) |
pds:CreateUser |
|
|
GetUser(/v2/user/get) |
pds:GetUser |
|
|
ListUsers(/v2/user/list) |
pds:ListUser |
|
|
UpdateUser(/v2/user/update) |
pds:UpdateUser |
|
|
DeleteUser(/v2/user/delete) |
pds:DeleteUser |
|
|
SearchUser(/v2/user/search) |
pds:SearchUser |
|
|
GetUserAccessToken(/v2/user/get_access_token) |
pds:GetUserAccessToken |
|
|
CreateShare(/v2/share/create) |
pds:CreateShare |
|
|
GetShare(/v2/share/get) |
pds:GetShare |
|
|
ListShares(/v2/share/list) |
pds:ListShares |
|
|
UpdateShare(/v2/share/update) |
pds:UpdateShare |
|
|
CreateFile(/v2/file/create) |
pds:CreateFile |
|
|
CreateFileWithSignature(/v2/file/create_with_signature) |
pds:CreateFile |
|
|
ListFiles(/v2/file/list) |
pds:ListFiles |
|
|
CompleteFile(/v2/file/complete) |
pds:CreateFile |
|
|
CompleteFileWithStoreInfo(/v2/file/complete_with_store_info) |
pds:CreateFile |
|
|
GetFileSignature(/v2/file/get_signature) |
pds:GetFileSignature |
|
|
GetFileUploadUrl(/v2/file/get_upload_url) |
pds:CreateFile |
|
|
GetFileDownloadUrl(/v2/file/get_download_url) |
pds:GetFile |
|
|
DeleteFile(/v2/file/delete) |
pds:DeleteFile |
|
|
CopyFile(/v2/file/copy) |
pds:CopyFile |
|
|
MoveFile(/v2/file/move) |
pds:MoveFile |
|
|
UpdateFile(/v2/file/update) |
pds:UpdateFile |
|
|
GetFile(/v2/file/get) |
pds:GetFile |
|
|
DownloadFile(/v2/file/get) |
pds:GetFile |
|
|
BatchDeleteFile(/v2/file/batch_delete) |
pds:DeleteFile |
|
|
GetAsyncTask(/v2/async_task/get) |
pds:GetAsyncTask |
|
|
ListImageTags(/v2/image/list_tags) |
pds:ListImageTags |
|
|
ListImageFaceGroups(/v2/image/list_facegroups) |
pds:ListImageFaceGroups |
|
|
ListFaceGroupImages(/v2/image/list_facegroup_images) |
pds:ListFaceGroupImages |
|
|
Batch(/v2/batch) |
pds:Batch |
|