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")
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
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
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
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 )
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}
url = f"{base_url}{endpoint}"
Realizando requisição
resp = requests.post(url=url, headers=request_header, json=request_body)
print(resp.json())