Я использую API для программного обеспечения для управления портфелем, и мне предоставили некоторую документацию о том, как реализовать его через Postman. Результаты получаются через Postman, но когда я пытаюсь повторить сценарий через Python, я не могу пройти проверку подлинности. Я не очень хорошо разбираюсь в любом другом языке, кроме Python, и я не эксперт по API (особенно когда дело доходит до аутентификации). Я надеялся, что кто-то сможет просмотреть этот код и посмотреть, не кажется ли что-нибудь неправильным в отношении создания уникальной подписи. Или, если у кого-то был опыт создания подписи HMAC с использованием структуры запросов python.
import requests
import uuid
import time
import hmac
import base64
import hashlib
import math
url = "url"
payload = "{\n\t\"firm\": \"XXXXXXXX\",\n\t\"id\": \"#######\",\n\t\"data\": {\n\t\t\"tracking_preference\": 2\n\t} \n}\n"
apikey = 'apikey'
uuid = str(uuid.uuid4())
ts = math.floor(time.time())
timestamp = str(ts)
signature = timestamp+uuid
#signature_bytes = signature.encode('UTF8')
#secret_bytes = base64.standard_b64decode(apikey)
signature_bytes = bytes(signature, 'UTF8')
secret_bytes = bytes(apikey, 'UTF8')
signature_hash = hmac.new(secret_bytes, signature_bytes, hashlib.sha256).digest()
hmac = base64.b64encode(signature_hash).decode()
headers = {
'X-SL-UUID': uuid,
'X-SL-Timestamp': timestamp,
'X-SL-HMAC': hmac,
'Content-Type': "application/json",
'User-Agent': "PostmanRuntime/7.18.0",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Postman-Token': "unique token",
'Host': "xxxxxx-xxx.smartleaf.com",
'Accept-Encoding': "gzip, deflate",
'Content-Length': "89",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
Все, что с "XXX" или "###", - это информация, которую я размыл. Заранее спасибо!
Вот сценарий предварительного запроса на Postman с использованием JS:
var apikey = '##########';
var uuidlib = require('uuid');
var uuid = uuidlib.v4();
var timestamp = Math.floor(Date.now() / 1000).toString();
var hash = CryptoJS.HmacSHA256(timestamp.concat(uuid), apikey);
postman.setEnvironmentVariable('timestamp', timestamp);
postman.setEnvironmentVariable('uuid', uuid);
postman.setEnvironmentVariable('hmac', hash);