Аутентификация запроса API вне Почтальона с использованием Python - PullRequest
0 голосов
/ 21 октября 2019

Я использую 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);

1 Ответ

1 голос
/ 22 октября 2019

прямой перевод этого кода Javascript приводит к:

import hmac
import hashlib
import time
import uuid
import requests

apikey = b'##########'
url = 'https://xxxxxx-xxx.smartleaf.com/'
payload = {'firm': 'XXXXXXXX', 'id': '#######', 'data': {'tracking_preference': 2}}

reqid = str(uuid.uuid4())
reqts = str(int(time.time()))

key = hmac.new(apikey, f'{reqts}{reqid}'.encode('ascii'), hashlib.sha256).hexdigest()

headers = {
    'X-SL-UUID': reqid,
    'X-SL-Timestamp': reqts,
    'X-SL-HMAC': key,
}

response = requests.post(url, json=payload, headers=headers)

главное, что вы кодировали дайджест в base64, а не в шестнадцатеричном

, очевидно, я не могу проверить это, но, надеюсь,это примерно правильно

...