跳到主要内容

身份验证测试

1. 简介与初始配置

概述

本文档详细说明了用于安全 API 请求身份验证的请求头签名和加密过程。该过程确保请求的可信性和安全性,防止未授权访问并保障数据完整性。

导入库

以下是身份验证过程中所需库的导入。

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

定义变量

我们将使用 base_urlendpointmethodrequest_body 变量。在本示例中,我们将对 "/test" 端点执行 POST 请求。

base_url = "https://api-auth.sandbox.qitech.app"
endpoint = "/test"
method = "POST"
request_body = {"name": "QI Tech"}

2. 签名数据准备

输入加密数据

本示例中的密钥仅供演示使用,请使用您自己的密钥。

api_key = "f19c6e62-bd82-4334-9839-020810550c44" 

client_private_key = '''-----BEGIN EC PRIVATE KEY-----
MIHbAgEBBEHh1hIeOPE5XNNhn6bxRAmVswsPZ0wZCmzVvP8Tl/LZK9ofVmRVGzll
srU1uezJEyHKYdOHrE2p52xUj+pHzjJvb6AHBgUrgQQAI6GBiQOBhgAEAAofUz1J
hBSOyGHLsnV9Sz0DSWmhl7U+ljqbfa8PKVFWSV3w16I1v2zME5/UzUhHn1gWsjnv
7/ekcLLAQbvqMPNXAfjIhFXLAPzqbB9iCuVua1v0Vgy52rBemOWrJka/Ws2bnKR8
h1N1OxOYeYr6C2jqMygBLktKMAs+282CEiEb4bIv
-----END EC PRIVATE KEY-----'''

格式化日期

提供的日期时间对象必须为 UTC 格式,并遵循国际标准 ISO 8601("2023-06-26T19:48:32.759844Z")

timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%fZ")

定义 JWT 请求头

定义 JWT 编码算法

jwt_header = {
"typ": "JWT",
"alg": "ES512"
}

为 JSON 请求头签名构建 MD5 哈希值

使用载荷为请求头(header)签名构建 MD5 哈希值

json_body = json.dumps(request_body)
md5_hash = md5(json_body.encode()).hexdigest()
注意!

GET 和 DELETE 方法请求的 md5 哈希值必须使用空载荷生成

为文件请求头签名构建 MD5 哈希值

使用文件为请求头(header)签名构建 MD5 哈希值

md5_instance = md5()
for chunk in iter(lambda: file.read(4096), b""):
md5_instance.update(chunk)

file.seek(0)
md5_hash = md5_instance.hexdigest()

定义 JWT 正文

以下是请求头签名所需的信息

jwt_body = {
"payload_md5": md5_hash,
"timestamp": timestamp,
"method": method,
"uri": endpoint
}

对请求头进行加密

encoded_header_token = jwt.encode(
claims=jwt_body,
key=client_private_key,
algorithm="ES512",
headers=jwt_header
)

构建已签名的请求头

signed_header = {
"AUTHORIZATION": encoded_header_token,
"API-CLIENT-KEY": api_key
}

构建请求 URL

url = f"{base_url}{endpoint}"

3. 发送请求

post_test_response = requests.post(url=url, headers=signed_header, json=request_body)