认证测试
1. 简介
本节将说明请求的构建方式,以便被我们的系统接受。首先,需要在请求头的 API-CLIENT-KEY 中放入 QI CTVM 团队提供的 Api Key。然后,需要使用集成合作方的私钥创建 AUTHORIZATION 请求头进行签名;
以下将通过 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://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. 构建基础签名字典
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. 对请求头进行加密
使用 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. 组装最终请求头
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())