Skip to main content

baas_teste_de_autenticacao_v2

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, timezone
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(timezone.utc).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)