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:

DimensionDescriçãoExemplo
DateUma string de oito dígitos que representa o ano (AAAA), mês (MM) e dia (DD) da solicitação.20210416
AWS regionA região que você está enviando a chamada.us-east-1 (Para a região North America - Canadá, EUA, México e Brasil.
ServiceO serviço que você está solicitando.execute-api
Termination stringUma string de terminação especial. Para AWS Signature Versão 4, o valor é aws4_requestaws4_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 e Credential. No entanto, SignedHeaders e Signature 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:

  1. No AccessKey, informe o AccessKeyId da STS API.
  2. No SecretKey, informe o SecretAccessKey da STS API.
  3. 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>