Laravel护照:部署到aws后缺少密钥

92vpleto  于 2023-03-19  发布在  其他
关注(0)|答案(4)|浏览(113)

我在aws elastic beanstalk上设置laravels passport时遇到问题。eb客户端设置正确,我可以部署代码更改。没有显示错误。
然而,向laravel发出请求之后会出现错误500,告诉我“app/current/storage/oauth-public.key”中缺少passport密钥。
我想我遗漏了artisan命令“php artisan passport:install”,所以我在composer文件中添加了它:

"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 -R777存储)权限,然后才能正常工作。不幸的是,每次运行eb deploy时,密钥都会被删除,所以每次我都必须重做这些步骤--相当麻烦。有人找到了一个自动化的好方法吗?

bhmjp9jg

bhmjp9jg1#

显然,这个PR https://github.com/laravel/passport/pull/683使通过envars传递密钥成为可能。

/*
|--------------------------------------------------------------------------
| 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的envars大小限制:https://forums.aws.amazon.com/thread.jspa?messageID=618423&#618423
最后,我们最终使用了我们的CI。

jq6vz3qz

jq6vz3qz2#

在.ebextensions文件夹(在项目的根目录下)中添加一个文件或命令,它将在部署时创建新密钥。

container_commands:
01_passport_install:
      command: "php artisan passport:keys --force"

这有其优点和缺点:

  • 缺点是,当您将新版本的代码部署到Beanstalk时,它会注销所有用户,或者抛出401错误
  • 优点:这是目前为止处理这个问题最快的安全方法
yc0p9oo0

yc0p9oo03#

您还可以在部署后自动执行命令。
如Elastic Beanstalk部署工作流中所述,部署后钩子是按字母数字顺序最后执行的钩子。
在源代码的根目录中创建文件夹.platform/hooks/postdeploy/,并在“postdeploy/”文件夹中创建一个bash脚本,其中包含您要执行的命令,例如:

#! /bin/bash
sudo php artisan passport:install

然后(正如Markus Lechner在this forum中回答amesStreet的问题一样),您还必须创建一个包含container_commands的配置文件,以便给予执行bash脚本的权限(在第一个链接中也有解释,您必须使用chmod +x来设置hook文件的执行权限)
在源代码的根目录中创建一个名为.ebextensions/的文件夹,并在该文件夹中创建一个配置文件:“.ebextensions/一些名称.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 {} \;

这相当于向.platform文件夹中的每个.sh文件给予执行权限,在staging/文件夹中也是如此(这是预构建和预部署阶段部署工作流的一部分)

zbwhf8kr

zbwhf8kr4#

诀窍是使用不同的.ebignore和.gitignore文件。
1.在本地环境中生成密钥。
1.在.gitignore(/storage/.keys)中忽略它
1.允许它在.ebignore中(#/storage/
.keys)
所以在git中密钥不会被跟踪,但仍然会使用eb deploy命令上传到elasticbeanstalk。

相关问题