Загрузка python-jose в облачный запуск не удалась
Итак, я создал это приложение Flask, которое будет служить моим бэкэндом для пользовательского приложения.
Чтобы справиться с созданием токенов JWT, я решил использовать зашифрованный JWS (JWS внутри JWE). Для этого я решил использовать пакет python-jose . Я пробовал JWCrypto раньше, но он не удался локально для меня в отношении JWK (локально), и я не мог понять это.
После настройки и локального тестирования моего приложения функции, которые я использую, работают отлично. Однако после их загрузки в облако (с успешной сборкой) шифрование не выполняется. Утверждая это сообщение:
Файл "/usr/local/lib/python3.9/site-packages/jose/jwk.py", строка 78, в конструкции поднять JWKError("Невозможно найти алгоритм для ключа: %s" % key_data) jose.exceptions .JWKError: Не удалось найти алгоритм для ключа: секрет для переполнения стека
Это функция, обрабатывающая шифрование:
def encode_token(payload):
jws_secret = "xxxxxxx"
jwe_key = "xxxxxx"
signed_token = jws.sign(payload, jws_secret, algorithm='HS256')
encrypted_signed_token = jwe.encrypt(signed_token, jwe_key, algorithm='dir', encryption='A128GCM')
return encrypted_signed_token
Я знаю, что делюсь ключами и секретами выше, но мое приложение еще не подключается к базе данных и не делает ничего полезного + я собираюсь изменить их после того, как исправлю это. Так что нормально :)
А это мой докерфайл:
# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.9-slim
# Allow statements and log messages to immediately appear in the Knative logs
ENV PYTHONUNBUFFERED True
# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
# Install production dependencies.
RUN pip install --no-cache-dir -r requirements.txt
# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
# Timeout is set to 0 to disable the timeouts of the workers to allow Cloud Run to handle instance scaling.
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
И, наконец, это мои требования.txt (сгенерированный автоматически через pipenv):
#
# These requirements were autogenerated by pipenv
# To regenerate from the project's Pipfile, run:
#
# pipenv lock --requirements
#
-i https://pypi.org/simple
click==8.1.3; python_version >= '3.7'
ecdsa==0.17.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'
flask==2.1.2
gunicorn==20.1.0
importlib-metadata==4.11.4; python_version < '3.10'
itsdangerous==2.1.2; python_version >= '3.7'
jinja2==3.1.2; python_version >= '3.7'
markupsafe==2.1.1; python_version >= '3.7'
pyasn1==0.4.8
python-jose==3.3.0
rsa==4.8; python_version >= '3.6' and python_version < '4'
setuptools==62.3.3; python_version >= '3.7'
six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
werkzeug==2.1.2; python_version >= '3.7'
zipp==3.8.0; python_version >= '3.7'
Я просто не понимаю, как это может работать на моей машине, но не на GCP. На моей локальной машине (оболочка Pipenv) я отлично возвращаю JWE. Моя локальная версия Python — 3.8.3, но я пытался использовать 3.8 и 3.10 в Dockerfile с тем же неудачным результатом при развертывании.
Кто-нибудь знает, почему это может произойти и что можно исправить? Если бы вы могли указать мне альтернативное решение (если вышеизложенное не исправить), я был бы бесконечно благодарен :)
1 ответ
Задача решена!
Обновлена локальная среда разработки до Python 3.10, удален python-jose и вместо этого установлен python-jose[cryptography].