Laravel Passport:部署到 aws 后缺少密钥
Posted
技术标签:
【中文标题】Laravel Passport:部署到 aws 后缺少密钥【英文标题】:Laravel Passport: Missing keys after deployment to aws 【发布时间】:2019-03-20 01:38:33 【问题描述】:我无法在 aws 弹性豆茎上设置 laravel 护照。 eb 客户端设置正确,我可以部署代码更改。没有显示错误。
但是,之后向 laravel 发出请求会导致错误 500,告诉我我缺少“app/current/storage/oauth-public.key\”中的护照密钥。本地一切运行良好。
我想我错过了工匠命令“php artisan passport:install”,所以我将它添加到作曲家文件中:
"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"@php artisan passport:install"
]
但显然它不会创建密钥。
要么是在运行 eb deploy 后没有执行 post-install 钩子,要么是另一个错误导致我无法创建密钥文件(缺少写入权限?)
如何验证安装后挂钩是否已执行? 有人遇到过类似的问题吗?
我遵循了这个问题中的建议,但到目前为止它没有帮助: https://github.com/laravel/passport/issues/418
更新: 我进入应用程序并尝试手动运行 php artisan passport:install,这导致了错误。我必须首先授予文件夹权限(sudo chmod -R 777 storage),然后它才能工作。 不幸的是,每次我运行 eb deploy 时,密钥都会被删除,所以我每次都必须重做这些步骤 - 非常麻烦。有谁找到了一种自动化的好方法?
【问题讨论】:
【参考方案1】:显然这个 PR https://github.com/laravel/passport/pull/683 使得通过 envvars 传递密钥成为可能。
/*
|--------------------------------------------------------------------------
| Encryption Keys
|--------------------------------------------------------------------------
|
| Passport uses encryption keys while generating secure access tokens for
| your application. By default, the keys are stored as local files but
| can be set via environment variables when that is more convenient.
|
*/
'private_key' => env('PASSPORT_PRIVATE_KEY'),
'public_key' => env('PASSPORT_PUBLIC_KEY'),
我还没有测试它,但我很快就会测试它。
更新
我们试过了,我们达到了 4K 的 envvars 大小限制:https://forums.aws.amazon.com/thread.jspa?messageID=618423򖾷
最后,我们最终改用了 CI。
【讨论】:
【参考方案2】:在您的 .ebextensions 文件夹中(在项目的根目录中)添加一个文件或命令,这将在您部署时创建新密钥。
container_commands:
01_passport_install:
command: "php artisan passport:keys --force"
这有优点也有缺点:
缺点:当您将新版本的代码部署到 Beanstalk 时,它会将所有用户注销,或引发 401 错误 PROS 这是迄今为止处理此问题的最快安全方法【讨论】:
【参考方案3】:您还可以在部署后自动执行命令。
如Elastic Beanstalk deployment workflow 中所述,部署后挂钩是按字母数字顺序最后执行的。
在源代码的根目录中创建文件夹 .platform/hooks/postdeploy/ 并在“postdeploy/”文件夹中创建一个包含您要执行的命令的 bash 脚本。即:
#! /bin/bash
sudo php artisan passport:install
然后(正如 Markus Lechner 在 this forum 中对 amesStreet 的回答),您还必须使用 container_commands 创建一个配置文件,以便授予执行 bash 脚本的权限(在第一个链接中也有说明,您必须使用 @987654325 @ 设置挂钩文件的执行权限)
在源代码的根目录中创建一个名为 .ebextensions/ 的文件夹,并在该文件夹中创建一个配置文件:“.ebextensions/some_name.config”并输入:
container_commands:
10_deploy_hook_permissions:
command: |
sudo find .platform/ -type f -iname "*.sh" -exec chmod -R 755 \;
sudo find /var/app/staging/.platform/ -type f -iname "*.sh" -exec chmod -R 755 \;
wich 相当于为 .platform 文件夹中的每个 .sh 文件和 staging/ 文件夹中的每个 .sh 文件授予执行权限(这是预构建和预部署阶段的部署工作流程的一部分)
【讨论】:
【参考方案4】:诀窍是使用不同的 .ebignore 和 .gitignore 文件。
-
在本地环境中生成密钥。
在 .gitignore (/storage/*.keys) 中忽略它
在 .ebignore (#/storage/*.keys) 中允许它
因此密钥不会在 git 中被跟踪,但仍会使用 eb deploy 命令上传到 elasticbeanstalk。
【讨论】:
钥匙出来是空白的以上是关于Laravel Passport:部署到 aws 后缺少密钥的主要内容,如果未能解决你的问题,请参考以下文章
使用 EbCommands 部署 Laravel Aws Elastic-Beanstalk
Laravel AWS Elastic Beanslack 部署错误 - 内存不足错误