Я использую библиотеку паспортов в своем проекте 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? Я не знаю.
@JohnHanley спасибо за ваш ответ. Да, команда кэширования php artisan optimize
находится в моей точке входа, и все в порядке. А для php artisan passport:install
я не могу поместить его в Dockerfile, потому что эта команда записывает в базу данных, а база данных недоступна из Dockerfile. Но если я запущу php artisan vendor:publish --tag=passport-config
в своем Dockerfile, чтобы использовать серверные env vars, я не получу никакой ошибки сборки, но это не будет иметь никакого эффекта, и я получаю ошибку LogicException при вызове веб-службы.
Вам нужно будет временно сделать базу данных доступной. В противном случае вам нужно будет настраивать Laravel каждый раз при запуске Cloud Run. Это также означает, что вы не можете запускать команды кеша в своем Dockerfile, поскольку среда еще не существует. Вы должны проектировать Cloud Run как контейнерную службу без сохранения состояния и не пытаться настраивать ее после запуска контейнера.
@JohnHanley Я понимаю, что вы имеете в виду, но я не знаю, как я могу запускать команды кеша в Dockerfile, потому что файлы кеша будут инициализированы с локальными переменными env, и я запускаю свою сборку в Cloud Build, на данный момент env не установлен . И для базы данных я ищу, как я могу временно сделать Cloud SQL доступным, когда Cloud Build создает мой образ, но я не могу найти, как я могу это сделать
Я рекомендую, чтобы каждый из шагов работал в вашей локальной системе разработки. Как только это сработает, перейдите к Cloud Build. То, как вы пытаетесь настроить Laravel, не сработает, и будет быстрее выяснить это локально. Например, вы должны запускать все команды Laravel при создании контейнера — это один шаг в Cloud Build. Не устанавливайте ENTRYPOINT в команды PHP ремесленник. Эти команды выполняются при запуске контейнера. Вместо этого эти команды должны быть операторами БЕЖАТЬ в Dockerfile. Найдите хороший учебник по Docker + Laravel.
Однажды я получил ту же ошибку, и исправление заключалось в использовании двойных кавычек "-----BEGIN RSA PRIVATE KEY-----"
вместо одинарных кавычек '-----BEGIN RSA PRIVATE KEY-----'
. Также не забудьте удалить эту строку из своей кодовой базы (если она существует) Passport::loadKeysFrom
. Как видно на скриншоте, вы используете обычные переменные среды Cloud Run для хранения ключей. В качестве наилучшей практики я бы предложил переместить их в диспетчер секретов и позволить Cloud Run иметь ссылки на эти секреты. Это легко и безопасно. См. cloud.google.com/run/docs/configuring/secrets#console
@ metad00r О, действительно, с двойными кавычками! Завтра попробую, надеюсь получится спасибо. Да, я видел секретного менеджера, но я думаю, что это дорого, потому что квота составляет 10 тысяч доступов в месяц. Таким образом, каждый раз, когда будет вызываться веб-сервис, будет засчитываться 1 доступ. Так что, если я получу 1 миллион запросов веб-сервиса в месяц, я заплачу за доступ более 10 тысяч. Или, может быть, я чего-то не понимаю в ценообразовании секретного менеджера?
@John, что касается Secret Manager, это 0,03 доллара за 10 000 операций в месяц, а первые 10 000 операций бесплатны каждый месяц. Таким образом, если у вас есть 20 000 операций, вам будет выставлен счет за 10 000 операций, что составляет 0,03 доллара США. За 1 миллион операций вам будет выставлен счет около 2,97 долларов США за конкретный месяц за одну версию закрытого и открытого ключей. См. cloud.google.com/products/calculator/…
@ metad00r Хорошо, так что это хорошо работает с использованием секретного менеджера, но не работает, если я устанавливаю двойные кавычки. Облачный запуск автоматически переформатирует двойные кавычки в одинарные :/ поэтому я буду использовать секретный менеджер. И это безопаснее :p спасибо
Присмотревшись к вашему снимку экрана, я думаю, что понимаю, почему проверка сертификата не удалась.
В 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-----
Если это не сработает, вы также должны попробовать:
\n
явно в текстовой областиPS. Мой частный сертификат начинается с -----BEGIN RSA PRIVATE KEY-----
вместо -----BEGIN PRIVATE KEY-----
Запустите команды PHP ремесленник в файле Dockerfile при создании образа контейнера. Не пытайтесь настроить Laravel из развернутого контейнера (работающего в Cloud Run). Вы также должны выполнять обычные команды кэширования Artisan при создании контейнера.