Проблема переменной среды библиотеки паспортов Laravel в Cloud Run

Я использую библиотеку паспортов в своем проекте laravel 8, и у меня есть проблема, потому что я не могу использовать команду по умолчанию для создания своего файла php artisan passport:install, потому что я нахожусь в бессерверном режиме Cloud Run и мне приходится использовать переменные среды.

Итак, я вижу этот https://laravel.com/docs/9.x/passport#загрузка-ключей-из-среды

Это работает в моей локальной среде, когда я отправляю переменные через docker compose с объявленным APP_ENV=production, но когда я запускаю свой рабочий сервер в Cloud Run, у меня возникает эта ошибка:

exception: "LogicException"
file: "/app/vendor/league/oauth2-server/src/CryptKey.php"
line: 67
message: "Unable to read key from file -----BEGIN PUBLIC KEY...

Я не понимаю, почему паспорту нужен файл в Cloud Run, а не сервер env vars. Я проверил, чтобы удалить все возвраты каретки в моих закрытых и открытых ключах, но это не работает. Может быть, формат плохой в моем yaml? Я не знаю.

Проблема переменной среды библиотеки паспортов Laravel в Cloud Run

Запустите команды PHP ремесленник в файле Dockerfile при создании образа контейнера. Не пытайтесь настроить Laravel из развернутого контейнера (работающего в Cloud Run). Вы также должны выполнять обычные команды кэширования Artisan при создании контейнера.

John Hanley 18.03.2022 21:07

@JohnHanley спасибо за ваш ответ. Да, команда кэширования php artisan optimize находится в моей точке входа, и все в порядке. А для php artisan passport:install я не могу поместить его в Dockerfile, потому что эта команда записывает в базу данных, а база данных недоступна из Dockerfile. Но если я запущу php artisan vendor:publish --tag=passport-config в своем Dockerfile, чтобы использовать серверные env vars, я не получу никакой ошибки сборки, но это не будет иметь никакого эффекта, и я получаю ошибку LogicException при вызове веб-службы.

John 19.03.2022 08:23

Вам нужно будет временно сделать базу данных доступной. В противном случае вам нужно будет настраивать Laravel каждый раз при запуске Cloud Run. Это также означает, что вы не можете запускать команды кеша в своем Dockerfile, поскольку среда еще не существует. Вы должны проектировать Cloud Run как контейнерную службу без сохранения состояния и не пытаться настраивать ее после запуска контейнера.

John Hanley 19.03.2022 08:26

@JohnHanley Я понимаю, что вы имеете в виду, но я не знаю, как я могу запускать команды кеша в Dockerfile, потому что файлы кеша будут инициализированы с локальными переменными env, и я запускаю свою сборку в Cloud Build, на данный момент env не установлен . И для базы данных я ищу, как я могу временно сделать Cloud SQL доступным, когда Cloud Build создает мой образ, но я не могу найти, как я могу это сделать

John 19.03.2022 11:04

Я рекомендую, чтобы каждый из шагов работал в вашей локальной системе разработки. Как только это сработает, перейдите к Cloud Build. То, как вы пытаетесь настроить Laravel, не сработает, и будет быстрее выяснить это локально. Например, вы должны запускать все команды Laravel при создании контейнера — это один шаг в Cloud Build. Не устанавливайте ENTRYPOINT в команды PHP ремесленник. Эти команды выполняются при запуске контейнера. Вместо этого эти команды должны быть операторами БЕЖАТЬ в Dockerfile. Найдите хороший учебник по Docker + Laravel.

John Hanley 19.03.2022 16:34

Однажды я получил ту же ошибку, и исправление заключалось в использовании двойных кавычек "-----BEGIN RSA PRIVATE KEY-----" вместо одинарных кавычек '-----BEGIN RSA PRIVATE KEY-----'. Также не забудьте удалить эту строку из своей кодовой базы (если она существует) Passport::loadKeysFrom. Как видно на скриншоте, вы используете обычные переменные среды Cloud Run для хранения ключей. В качестве наилучшей практики я бы предложил переместить их в диспетчер секретов и позволить Cloud Run иметь ссылки на эти секреты. Это легко и безопасно. См. cloud.google.com/run/docs/configuring/secrets#console

metad00r 20.03.2022 12:58

@ metad00r О, действительно, с двойными кавычками! Завтра попробую, надеюсь получится спасибо. Да, я видел секретного менеджера, но я думаю, что это дорого, потому что квота составляет 10 тысяч доступов в месяц. Таким образом, каждый раз, когда будет вызываться веб-сервис, будет засчитываться 1 доступ. Так что, если я получу 1 миллион запросов веб-сервиса в месяц, я заплачу за доступ более 10 тысяч. Или, может быть, я чего-то не понимаю в ценообразовании секретного менеджера?

John 20.03.2022 13:56

@John, что касается Secret Manager, это 0,03 доллара за 10 000 операций в месяц, а первые 10 000 операций бесплатны каждый месяц. Таким образом, если у вас есть 20 000 операций, вам будет выставлен счет за 10 000 операций, что составляет 0,03 доллара США. За 1 миллион операций вам будет выставлен счет около 2,97 долларов США за конкретный месяц за одну версию закрытого и открытого ключей. См. cloud.google.com/products/calculator/…

metad00r 20.03.2022 21:51

@ metad00r Хорошо, так что это хорошо работает с использованием секретного менеджера, но не работает, если я устанавливаю двойные кавычки. Облачный запуск автоматически переформатирует двойные кавычки в одинарные :/ поэтому я буду использовать секретный менеджер. И это безопаснее :p спасибо

John 21.03.2022 12:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
9
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Присмотревшись к вашему снимку экрана, я думаю, что понимаю, почему проверка сертификата не удалась.

В CryptKey.php эта строка $this->isValidKey($keyPath, $this->passPhrase ?? '') возвращается false из-за отсутствия \n (новых строк) в ваших ключах, что приводит к "Unable to read key from file -----BEGIN PRIVATE KEY-----...". Сертификаты должны быть в определенном формате, и в настоящее время это не так при использовании этих переменных среды.

Если возможно, измените этот недопустимый формат в своем секрете:

-----BEGIN PRIVATE KEY-----MIIJQgIBADANBgk...-----END PRIVATE KEY-----

К:

-----BEGIN RSA PRIVATE KEY-----
MIIJQgIBADANBgk...
-----END RSA PRIVATE KEY-----

Если это не сработает, вы также должны попробовать:

  • Импорт сертификатов в виде файлов вместо использования текстового поля в Secret Manager
  • Или используйте \n явно в текстовой области

PS. Мой частный сертификат начинается с -----BEGIN RSA PRIVATE KEY----- вместо -----BEGIN PRIVATE KEY-----

Другие вопросы по теме