Мой опыт аутентификации с помощью API был основан на простом методе API key . Поэтому я сначала прочитал ваш вопрос и не до конца понял. Я решил провести некоторое исследование и, надеюсь, чему-то научиться на этом пути, и я, конечно, сделал. Я делюсь своими выводами и ответом ниже:
Для начала я начал читать JSON Web Tokens (JWT), что привело меня на сайт JWT , который был отличным ресурсом. В нем очень четко прописаны компоненты, составляющие JWT, и порядок их форматирования, я очень рекомендую посмотреть.
На веб-сайте JWT я обнаружил, что JWT состоит из трех компонентов:
- URL-код base64, безопасный кодированный заголовок.
- Полезная нагрузка в кодировке URL-адреса base64.
- Надежная кодированная подпись URL-адреса base64.
Все три вышеперечисленных вместе образуют правильно отформатированный JWT. К счастью, на сайте JWT есть список библиотек, созданных для Python. К сожалению, ни одна из этих сторонних библиотек не доступна в обычном Python, предлагаемом модулем кода Zapier. Чтобы сделать это, нужно прочитать исходный код и использовать имеющиеся у нас библиотеки. Поэтому после нескольких часов проб и ошибок я смог найти следующее решение для генерации правильно отформатированного JWT:
import hashlib
import hmac
import requests
from base64 import urlsafe_b64encode
def base64url_encode(payload):
if not isinstance(payload, bytes):
payload = payload.encode('utf-8')
encode = urlsafe_b64encode(payload)
return encode.decode('utf-8').rstrip('=')
def generate_JWT(header, payload, secret):
encoded_header = base64url_encode(header)
encoded_payload = base64url_encode(payload)
signature = hmac.new(secret,
encoded_header + "." + encoded_payload,
hashlib.sha256)
encoded_signature = base64url_encode(signature.digest())
return encoded_header + "." + encoded_payload + "." + encoded_signature
def get_request(url, jwt):
headers = {
"Authorization" : "Bearer " + jwt
}
result = requests.get(url, headers=headers)
return result
secret = "yoursecrettoken"
header = '{"alg":"HS256","typ":"JWT"}'
payload = '{"sub":"1234567890","name":"John Doe","iat":1516239022}'
jwt = generate_JWT(header, payload, secret)
response = get_request("https://SomeApiEndpoint.com/api/", jwt)
Вы можете проверить вывод этого на отладчике JWT здесь .
Примечание: Для правильной работы кодировки для объектов заголовка и полезной нагрузки необходимо преобразовать их в строковый объект. Я попытался сделать это, вызвав функцию JSON.dumps () и передав объекты словаря, но когда я закодировал возвращаемые значения, они не соответствовали тому, что было показано в отладчике JWT. Единственное решение, которое я смог найти, заключалось в том, чтобы обернуть объекты словаря в кавычки и убедиться, что в них нет пробелов.
И поэтому, имея JWT в руках, вы можете использовать его в своем пользовательском шаге получения запроса Zapier Webhooks, или вы можете сохранить zap и отправить запрос в том же модуле кода, используя библиотеку запросов Python , как я есть в моем примере кода.
Спасибо за возможность обучения, и я надеюсь, что это поможет.