Создание токена для аутентификации API с Python - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать приложение API, используя Python. Чтобы получить доступ к этому API, приложение должно сгенерировать токен в формате: <key>:<hash>:<epoch>

документы для API используйте javascript в качестве примера того, как сгенерировать токен.

Вы можете сгенерировать ha sh из вашего ключа и секрета следующим образом:

var hash = crypto.createHmac('sha256', secret).update(key + epoch).digest('base64');

1- Create sha256 hash from secret.
2- Update with key and epoch concatenated.
3- Return base64 representation.

Приложение Затем токен можно добавить в заголовок «Авторизация» следующим образом:

Authorization: A5-API <token>

Кажется довольно простым, но мой код python приводит к ошибке 401.

{'status': 401, 'name': 'NotAuthorizedError', 'message': 'You must use a valid A5 Authorisation token'}

Похоже, я каким-то образом генерирую недействительный токен, но я прошел через это десятки раз и не вижу, что может быть не так.

Я знаю, что это не проблема неверного ключа / секрета, потому что, когда я тестирую ключ / секрет на веб-сайте api dev, токен генерируется нормально.

Так что мне интересно, может ли кто-нибудь заметить что-то потенциально неправильное в коде, который я использую?

спасибо!

Пожалуйста, посмотрите мой код ниже (ключ API, секрет , и URL-адрес удален).

import base64
import hashlib
import requests
import time
import urllib.parse

"""
auth-token example: 
A5-API 5eb77cd86erb50010f57c2ce:gUrQbsIV+S9Fyq8yIzAS+cl2Q3zizQLrFMDGq7zubaI=:1590105400
"""

key = <key>
secret = <secret>
epoch = str(time.mktime(time.localtime()))[:-2]

h = hashlib.sha256(secret.encode())
h_update = (key + epoch).encode('utf-8')
h.update(h_update)
hash_encode = base64.b64encode(h.digest())
hash_decode = hash_encode.decode('utf-8')
epoch = str(time.mktime(time.localtime()))[:-2]
token = f"{key}:{hash_decode}:{epoch}"
authorization =  f"A5-API {token}"

headers = {"Authorization": authorization }

url = <api url>

r = requests.get(url, headers = headers)
...