Использование веб-крюка пользовательских запросов Zapier с веб-токенами JSON - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужно получить доступ к API, который использует JSON Web Tokens в качестве метода аутентификации. Есть ли хороший способ использовать шаг кода Python для создания этого токена, а затем добавить этот токен в качестве заголовка к шагу webhook пользовательского запроса?

1 Ответ

0 голосов
/ 02 ноября 2018

Мой опыт аутентификации с помощью API был основан на простом методе API key . Поэтому я сначала прочитал ваш вопрос и не до конца понял. Я решил провести некоторое исследование и, надеюсь, чему-то научиться на этом пути, и я, конечно, сделал. Я делюсь своими выводами и ответом ниже:

Для начала я начал читать JSON Web Tokens (JWT), что привело меня на сайт JWT , который был отличным ресурсом. В нем очень четко прописаны компоненты, составляющие JWT, и порядок их форматирования, я очень рекомендую посмотреть.

На веб-сайте JWT я обнаружил, что JWT состоит из трех компонентов:

  1. URL-код base64, безопасный кодированный заголовок.
  2. Полезная нагрузка в кодировке URL-адреса base64.
  3. Надежная кодированная подпись 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 , как я есть в моем примере кода.

Спасибо за возможность обучения, и я надеюсь, что это поможет.

...