认证测试
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())