Pular para o conteúdo principal

Teste de autenticação

1. Introdução

Como toda requisição deverá ser assinada por meio de chaves assimétricas, elas devem ser encriptadas antes de serem enviadas, assim como as respostas deverão ser decriptografadas para leitura de seu conteúdo.

2. Importar bibliotecas

Neste exemplo em python estamos usando 5 bibliotecas para poder realizar o processo de autenticação.

import json
from datetime import datetime
from hashlib import md5
from jose import jwt
import requests

3. Definir variáveis

Definir as variáveis método, endpoint e conteúdo particular a cada requisição (neste exemplo, utilizaremos o método "POST" para o endpoint "/test" com conteúdo "json")

Dados da requisição
base_url = "https://api-auth.sandbox.qitech.app"
date = datetime.now().strftime("%a, %d %b %Y %H:%M:%S GMT")
method = "POST"
content_type = "application/json"
endpoint = "/test"

4. Montar payload e header

Definimos em seguida o header e o body da requisição de acordo com a documentação da API que será ultilizada.

headers = {"alg": "ES512", "typ": "JWT"}
body = {"name": "QI Tech"}

5. Inserir a chave privada e a chave de integração

Dados da criptografia
api_key = "212edd2b-6520-4d6f-909d-6647a5617ff2"

client_private_key = '''-----BEGIN EC PRIVATE KEY-----
MIHbAgEBBEH7OuewosJfz4zKF+Gm0ogJxhb8G6LSMDVQQbFYz335mHCx9/Pr6Yk+
yYwsVozeXhlry3/vnUn1zCasU+4O+yseZ6AHBgUrgQQAI6GBiQOBhgAEAa46fN/2
8vI64shRhu9erMA6JLl3zHFX8gFHQrbb0g4IDfjXCKMCILiwdtL8QecstsgepTa7
yo1pTXOVNDbmLX2TAK38xb2Gv6OC+PA+5drF2wWajWbVLpR2R7mYEzr5HNIAJYHb
5C1jvM2ItK2R22HAbYfH25nsvGhkCGbrRNWQVF9g
-----END EC PRIVATE KEY-----'''

qi_public_key = '''-----BEGIN PUBLIC KEY-----
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQArwlIn6JHZfCz7eJ8hl/UzNDB0VDm
T0bROSbp/D6FxvjHyu7Xt31MHntld1jRv8WLyIMWdd77Yn0hyeHGxUNMHMwBJY9F
A9F0FbqNTPg7MaAl+qcXt8opRkb3x4KaszIGzQ+cdhMn7Er1ZLzhpbaaVn/jBFEh
f43JW4OatXK9QyyzZ7Q=
-----END PUBLIC KEY-----'''

6. Realizar criptografia do body

Criptografando o body da requisição
encoded_body_token = jwt.encode(claims=body, key=client_private_key, algorithm="ES512")

7. Montar payload criptografado

Esta variável contém o corpo criptografado que deverá ser enviado nas requisições na forma

Body que será enviado na requisição
request_body = {"encoded_body": encoded_body_token}

8. Construir hash em MD5 para assinatura no cabeçalho

Construir hash em MD5 para assinatura no cabeçalho (header) utilizando o payload criptografado (neste exemplo utilizamos MD5 da biblioteca hashlib como md5 )

Criando o hash do body
md5_encode = md5()
md5_encode.update(encoded_body_token.encode())
md5_body = md5_encode.hexdigest()

9. Formatar data do cabeçalho

IMPORTANTE: a Formatação da data atual para assinatura do cabeçalho deve estar de acordo com o formato "Fri, 13 May 2022 16:49:15 GMT".

base_url = "https://api-auth.sandbox.qitech.app"

//highlight-start
date = datetime.now().strftime("%a, %d %b %Y %H:%M:%S GMT")

// highlight-end
method = "POST"
content_type = "application/json"
endpoint = "/test"

10. Criando a string que será assinada

Construir string de assinatura contendo horário e hash MD5. Também deverão ser definidos o método (method) conteúdo (content_type) da requisição (neste exemplo, utilizaremos o método POST com conteúdo no formato json)

string_to_sign = method + "\n" + md5_body + "\n" + content_type + "\n" + date + "\n" + endpoint

11. Realizar criptografia do header

Realizar criptografia utilizando biblioteca JWT (neste exemplo de código, utilizamos jsonwebtoken como jwt em javascript)

claims = {"sub": api_key, "signature": string_to_sign}
encoded_header_token = jwt.encode(claims=claims, key=client_private_key, algorithm="ES512", headers=headers,)

12. Montando o header final

authorization = "QIT" + " " + api_key + ":" + encoded_header_token
request_header = {"AUTHORIZATION": authorization, "API-CLIENT-KEY": api_key}
Definindo url final
url = f"{base_url}{endpoint}"

Realizando requisição

resp = requests.post(url=url, headers=request_header, json=request_body)
print(resp.json())