Construindo o Authorization header
Pseudocódigo para derivação de uma chave de assinatura:
kSecret = {your secret access key}
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")
A CHAVE de assinatura obtida é kSigning
.
HMAC( )
HMAC()
representa uma função HMAC-SHA256 que retorna a saída em formato binário. O resultado de cada função de hash torna-se a entrada para a próxima.Obs.: A data utilizada é no formato
YYYYMMDD
Construa uma "string to sign":
Siga as instruções Tarefa 2: Criar uma string para assinar ao Signature versão 4 na documentação AWS, usando este guia:
- O valor de designation do algorítmo é AWS4-HMAC-SHA256 .
- Para determinar o escopo da credencial.
O escopo da credencial é um componente da string to sign e é representada por uma string separada por barras, contendo as dimensions conforme a tabela a seguir:
Dimension | Descrição | Exemplo |
---|---|---|
Date | Uma string de oito dígitos que representa o ano (AAAA), mês (MM) e dia (DD) da solicitação. | 20210416 |
AWS region | A região que você está enviando a chamada. | us-east-1 (Para a região North America - Canadá, EUA, México e Brasil. |
Service | O serviço que você está solicitando. | execute-api |
Termination string | Uma string de terminação especial. Para AWS Signature Versão 4, o valor é aws4_request | aws4_request |
Exemplo:
20210416/us-east-1/execute-api/aws4_request
Importante!
A data que você usa como parte de seu escopo de credencial deve corresponder à data de sua solicitação, conforme especificado no header x-amz-date.
A data que você usa como parte de seu escopo de credencial deve corresponder à data de sua solicitação, conforme especificado no cabeçalho x-amz-date.
Calcule a assinatura
Para obter a assinatura, utilize a "string to sign" obtida no passo anterior (3).
Pseudocódigo:
signature = HexEncode(HMAC(kSigning, {string to sign}))
Adicione as informações de assinatura no request:
No header Authorization, construir o seguinte valor, conforme pseudocódigo:
Authorization: {algoritmo} Credential={access key ID}/{credential scope}, SignedHeaders={SignedHeaders}, Signature={signature}
Exemplo:
Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
Observe
- Não há vírgula entre o
algorítmo
eCredential
. No entanto,SignedHeaders
eSignature
são separados dos valores anteriores por uma vírgula.
- O valor
Credential
começa com o AccessKeyID, que é seguido por uma barra inclinada (/), que é seguida pela gama de credenciais que você calculou na etapa de string to sign.
A secretAccessKey é usada para obtenção da chave de assinatura, mas não é incluída nas informações de assinatura enviadas na solicitação.- AccessKeyID e secretAccessKey são obtidas na chamada de STS API.
- Não inclua informações de autenticação nos parâmetros da query. Coloque-o no header de Authorization.
Colete dados da STS API para montar a assinatura no postman
Faça a chamada na STS API e obtenha os dados de <AccessKeyId>
, <SecretAccessKey>
e <SessionToken>
Informe o tipo de Authorization, como AWS Signature, informando os seguintes valores:
- No AccessKey, informe o AccessKeyId da STS API.
- No SecretKey, informe o SecretAccessKey da STS API.
- Em Session Token, informe o SessionToken da STS API.
Como a chamada deve se parecer?
O request deve se parecer, após adicionar as informações de assinatura para utilizar o header Authorization, com o exemplo abaixo:
GET ?Version=2011-06-15&Action=AssumeRole&RoleArn=arn:aws:iam::007214521360:role/xyz_role&DurationSeconds=3600&RoleSessionName=stackoverflow-64706420
Authorization: AWS4-HMAC-SHA256 Credential=AKIBIHYV6HIXXXXXXX/20201022/us-east-1/execute-api/aws4_request, SignedHeaders=host;user-agent;x-amz-access-token,
Signature=5d671d79c55b13162d9229b08455cfba6789a8edb4c82c400e06b5924aEXAMPLE
host: sts.amazonaws.com
x-amz-access-token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSREXAMPLE
x-amz-date: 20190430T123600Z
Content-Type: application/x-www-form-urlencoded
A resposta deve se parecer com o XML abaixo:
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<AssumeRoleResult>
<AssumedRoleUser>
<AssumedRoleId>AROAQDPLQE3QIKBSARA22VR:stackoverflow-64706420</AssumedRoleId>
<Arn>arn:aws:sts::007214521360:assumed-role/xyz_role/stackoverflow-64706420</Arn>
</AssumedRoleUser>
<Credentials>
<AccessKeyId>ASIAQXLQE2KFQVH3NRWL</AccessKeyId>
<SecretAccessKey>PbCRuzwZNpcXIuOWNVOKuV4NSzhn76qLpHXTDr8Nf</SecretAccessKey>
<SessionToken>FwoGYXIvZXezELv//////////wEaDEUcfhHyu2ofaNjV/CK6AWFUKoAFyk0l59IWvvsQ48c1Ek0cUo9sAdMVqVJNFpyZhPGQy89fBlA/pvQVz+vh/Z2ZZjL7/W56TM7kavIuIjqnd3n0GZvHjHbZsyzO8jakFwWszWkP2dWt/VFl8+qUu8TIJ7U6ksvI8fcrfSfYUQDU20ASt+CrzibOlKDxIsDKUv3weOJ9xVGhPoDmFdw9DZHa7Uo/13C8jqp/PL5r2QUStl5W9VIBv7Ny3dGMBFt39JO8tDXrEjTi8SjGpZiEBjIt1igHZVAj3Mxhacroy/X9xWZtTrb2NN22CxnS+TvfXuhU5TSIKcTUNx2AHIIN</SessionToken>
<Expiration>2021-04-26T02:09:26Z</Expiration>
</Credentials>
</AssumeRoleResult>
<ResponseMetadata>
<RequestId>8c908b38-2841-3670-8fed-2694fa0c584e</RequestId>
</ResponseMetadata>
</AssumeRoleResponse>
Updated over 2 years ago