跳到主要内容

认证测试

1. 介绍

本节将说明请求应如何构建才能被我们的系统接受。 首先,在 header 中 API-CLIENT-KEY 字段填入 QI CTVM 团队提供的 Api Key。 然后,需要使用集成合作伙伴的私钥创建一个 AUTHORIZATION header 进行签名;

以下将使用 Python 逐步演示 AUTHORIZATION 的创建过程。

2. 导入库

此 Python 示例使用 5 个库来完成认证过程。

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

3. 插入私钥和集成密钥

Dados da criptografia
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. 定义变量

定义每个请求特有的方法、端点和内容变量(本示例使用 "POST" 方法访问端点 "/authentication_test")

Dados da requisição
base_url = "https://api.securities.qidtvm.com.br"
today_str = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
method = "POST"
endpoint = "/authentication_test"
body = {"name": "QI Tech"}

5. 构建签名基础字典

Dicionário base

dict_to_sign = {"timestamp": today_str, "method": method, "uri": endpoint}

5.1. 如有必要,添加内容

对于有 body 的请求,需要添加该内容的 md5 字节值。由于我们系统中所有请求均通过 JSON 格式传输, 可以使用以下方式:

Dicionário base
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. 对 header 进行加密

使用 JWT 库进行加密(此代码示例中,我们在 javascript 中使用 jsonwebtoken 作为 jwt)

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. 组装最终 header

headers = {"API-CLIENT-KEY": api_key, "AUTHORIZATION": encoded_header_token}
Definindo url final
url = f"{base_url}{endpoint}"

发起请求

resp = requests.post(url=url, headers=headers, json=body)
print(resp.json())