Teste de autenticação
1. Introdução
Nessa seção iremos explicar como deve funcionar a requisição para que possa ser aceita pelo nosso sistema. Em primeiro Lugar deve-se colocar no header API-CLIENT-KEY a Api Key fornecida pelo time da QI DTVM. Depois deve-se criar um Header de AUTHORIZATION assinando com a Chave Privada do parceiro integrador;
Abaixo iremos ensinar o passo a passo utilizando de Python para exemplificar o processo de criação da AUTHORIZATION.
2. Importar bibliotecas
Neste exemplo em python estamos usando 5 bibliotecas para poder realizar o processo de autenticação.
from datetime import datetime
import json
from jose import jwt
from hashlib import md5
import requests
3. Inserir a chave privada e a chave de integração
api_key = "\<API KEY FORNECIDA PELA QI\>"
client_private_key = '''-----BEGIN EC PRIVATE KEY-----
MIHbAgEBBEH7OuewosJfz4zKF+Gm0ogJxhb8G6LSMDVQQbFYz335mHCx9/Pr6Yk+
yYwsVozeXhlry3/vnUn1zCasU+4O+yseZ6AHBgUrgQQAI6GBiQOBhgAEAa46fN/2
8vI64shRhu9erMA6JLl3zHFX8gFHQrbb0g4IDfjXCKMCILiwdtL8QecstsgepTa7
yo1pTXOVNDbmLX2TAK38xb2Gv6OC+PA+5drF2wWajWbVLpR2R7mYEzr5HNIAJYHb
5C1jvM2ItK2R22HAbYfH25nsvGhkCGbrRNWQVF9g
-----END EC PRIVATE KEY-----'''
4. 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 "/authentication_test")
base_url = "https://assignor-api.qidtvm.com.br"
today_str = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
method = "POST"
endpoint = "/authentication_test"
body = {"name": "QI Tech"}
5. Construir Dicionário Base de Assinatura
dict_to_sign = {"timestamp": today_str, "method": method, "uri": endpoint}
5.1. Se necessário, adicionar o conteúdo
Para as requisições que tenham body, deve-se adicionar o md5 do bytes desse conteúdo. Como todas as requisições no nosso sistema são através de JSON, pode-se usar o seguinte:
body_bytes = json.dumps(body).encode()
md5_instance = md5()
md5_instance.update(body_bytes)
md5_body = md5_instance.hexdigest()
dict_to_sign["payload_md5"] = md5_body
6. Realizar criptografia do header
Realizar criptografia utilizando biblioteca JWT (neste exemplo de código, utilizamos jsonwebtoken como jwt em javascript)
jwt_headers = {"alg": "ES512", "typ": "JWT"}
encoded_header_token = jwt.encode(
claims=dict_to_sign,
key=client_private_key,
algorithm="ES512",
headers=jwt_headers,
)
7. Montando o header final
headers = {"API-CLIENT-KEY": api_key, "AUTHORIZATION": encoded_header_token}
url = f"{base_url}{endpoint}"
Realizando requisição
resp = requests.post(url=url, headers=headers, json=body)
print(resp.json())