Pular para o conteúdo principal

Teste de autenticação

1. Introdução e Configuração Inicial

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.

Importar Bibliotecas

Aqui, importamos as bibliotecas necessárias ao longo do processo de autenticação.

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

Definir variáveis

Utilizaremos as variáveis base_url, endpoint, method e request_body. Neste exemplo faremos um POST no endpoint "/test".

base_url = "https://api-auth.sandbox.qitech.app"
endpoint = "/test"
method = "POST"
request_body = {"name": "QI Tech"}

2. Preparação de Dados para Assinatura

Inserir dados de criptografia

As chaves contidas neste exemplo são apenas para fins de demonstração. Por favor, utilize suas próprias chaves.

api_key = "f19c6e62-bd82-4334-9839-020810550c44" 

client_private_key = '''-----BEGIN EC PRIVATE KEY-----
MIHbAgEBBEHh1hIeOPE5XNNhn6bxRAmVswsPZ0wZCmzVvP8Tl/LZK9ofVmRVGzll
srU1uezJEyHKYdOHrE2p52xUj+pHzjJvb6AHBgUrgQQAI6GBiQOBhgAEAAofUz1J
hBSOyGHLsnV9Sz0DSWmhl7U+ljqbfa8PKVFWSV3w16I1v2zME5/UzUhHn1gWsjnv
7/ekcLLAQbvqMPNXAfjIhFXLAPzqbB9iCuVua1v0Vgy52rBemOWrJka/Ws2bnKR8
h1N1OxOYeYr6C2jqMygBLktKMAs+282CEiEb4bIv
-----END EC PRIVATE KEY-----'''

Formatar data

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.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")

Definir cabeçalho JWT

Definimos o algoritmo de codificação JWT

jwt_header = {
"typ": "JWT",
"alg": "ES512"
}

Construir hash em MD5 para assinatura no cabeçalho JSON

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()
Atenção!

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

Construir hash em MD5 para assinatura no cabeçalho Arquivo

Construir hash em MD5 para assinatura no cabeçalho (header) utilizando um arquivo

md5_instance = md5()
for chunk in iter(lambda: file.read(4096), b""):
md5_instance.update(chunk)

file.seek(0)
md5_hash = md5_instance.hexdigest()

Definir o corpo do JWT

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
}

Construir a URL da solicitação

url = f"{base_url}{endpoint}"

3. Realizar Requisição

post_test_response = requests.post(url=url, headers=signed_header, json=request_body)