Pular para o conteúdo principal

Teste de autenticação

Visão Geral

Esta documentação detalha o processo de assinatura e encriptação de cabeçalhos para autenticação segura em requisições à nossa API. O processo garante que as requisições sejam confiáveis e seguras, prevenindo acessos não autorizados e garantindo a integridade dos dados.

Atenção!

O hash md5 de requisições dos métodos GET e DELETE deve ser gerado com o payload vazio

#Aqui, importamos as bibliotecas necessárias ao longo do processo de autenticação.
from jose import jwt
import json
from datetime import datetime
from hashlib import md5
import requests

def get_auth_header(endpoint, method, CLIENT_PRIVATE_KEY, API_KEY, request_body=None):

if request_body is None:
request_body = {}

#O objeto de data e hora informado deve estar em UTC e deve seguir o padrão da norma internacional ISO 8601 ("2023-06-26T19:48:32.759844Z")
timestamp = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ")

#Definimos o algoritmo de codificação JWT
jwt_header = {
"typ": "JWT",
"alg": "ES512"
}

#Construir hash em MD5 para assinatura no cabeçalho (header) utilizando o payload
json_body = json.dumps(request_body)
md5_hash = md5(json_body.encode()).hexdigest()

#Essas são as infromações necessárias para assinatura do cabeçalho
jwt_body = {
"payload_md5": md5_hash,
"timestamp": timestamp,
"method": method,
"uri": endpoint
}

#Realizar criptografia do header
encoded_header_token = jwt.encode(
claims=jwt_body,
key=CLIENT_PRIVATE_KEY,
algorithm="ES512",
headers=jwt_header
)

#Montar header assinado
signed_header = {
"AUTHORIZATION": encoded_header_token,
"API-CLIENT-KEY": API_KEY
}

return signed_header


if __name__ == "__main__":

#Utilizaremos as variáveis base_url, endpoint, method e request_body. Neste exemplo faremos um POST no endpoint "/test".
#As chaves contidas neste exemplo são apenas para fins de demonstração. Por favor, utilize suas próprias chaves.
CLIENT_PRIVATE_KEY = "SUA PRIVATE KEY AQUI"
API_KEY = "SUA API KEY AQUI"

BASE_URL = "https://api-auth.sandbox.qitech.app"
METHOD = "POST" #GET ou POST
REQUEST_BODY = {
"name": "QI Tech"
}

#Para fazer um GET na /test, é necessário inserir a API key ao final, enquanto para fazer um POST no mesmo endpoint, não é necessário
if METHOD == 'GET':
ENDPOINT = f"/test/{API_KEY}"
signed_header = get_auth_header(ENDPOINT, METHOD, CLIENT_PRIVATE_KEY, API_KEY)
response = requests.get(f"{BASE_URL}{ENDPOINT}", headers=signed_header)
else:
ENDPOINT = f"/test/"
signed_header = get_auth_header(ENDPOINT, METHOD, CLIENT_PRIVATE_KEY, API_KEY, REQUEST_BODY)
response = requests.post(f"{BASE_URL}{ENDPOINT}", json=REQUEST_BODY, headers=signed_header)

print(response.status_code)
print(response.json())