Laravel Passport:部署到AWS后丢失密钥

3

我在AWS弹性Beanstalk上设置Laravel Passport时遇到了问题。eb客户端已正确设置,可以部署代码更改,但是访问Laravel会显示错误500,并告诉我在“app/current/storage/oauth-public.key\”中缺少护照密钥。但在本地一切都正常运行。

我猜测我缺少artisan命令“php artisan passport:install”,因此我在composer文件中添加了它:

"post-install-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postInstall",
        "@php artisan passport:install"
]

但显然它没有创建密钥。

要么是在运行eb deploy之后未执行post-install hook,要么是有其他错误导致我无法创建密钥文件(缺少写入权限?)

如何验证是否执行了post-install hook? 有人遇到过类似的问题吗?

我按照此问题中的建议进行操作,但到目前为止还没有帮助: https://github.com/laravel/passport/issues/418

更新: 我通过ssh登录到应用程序并尝试手动运行php artisan passport:install,结果出现错误。我必须先对文件夹进行授权(sudo chmod -R 777 storage),然后才能运行成功。 不幸的是,每次运行eb deploy时,密钥都会被删除,因此我需要每次重新执行这些步骤 - 相当麻烦。有人发现自动化这个过程的好方法吗?

4个回答

3
显然,这个 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的环境变量大小限制:https://forums.aws.amazon.com/thread.jspa?messageID=618423&#618423 最终,我们决定使用我们的CI。

1
在您的项目根目录下的 .ebextensions 文件夹中添加一个文件或命令,以便在部署时创建新的密钥。
container_commands:
01_passport_install:
      command: "php artisan passport:keys --force"

这有优点和缺点:

  • CONS:当您将新版本的代码部署到Beanstalk时,它将注销所有用户或抛出401错误。
  • PROS:这绝对是处理此问题最快、最安全的方式。

0

您还可以在部署后自动执行命令。

Elastic Beanstalk 部署工作流程所述,post-deploy钩子是按字母数字顺序执行的最后一个钩子。

在您的源代码根目录中创建文件夹.platform/hooks/postdeploy/,并在“postdeploy/”文件夹中创建一个包含要执行的命令的bash脚本。例如:

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

接着(就像Markus Lechner在这个论坛中回答amesStreet的问题一样),您还必须创建一个带有container_commands的配置文件,以便授予执行bash脚本的权限(在第一个链接中也有解释,您必须使用chmod +x来设置钩子文件的执行权限)

在源代码的根目录下创建一个名为.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 {} \;

这相当于在 .platform 文件夹中的每个 .sh 文件以及 staging/ 文件夹中的每个 .sh 文件都赋予执行权限(这是预构建和预部署阶段部署工作流程的一部分)。


-2

诀窍在于使用不同的.ebignore和.gitignore文件。

  1. 在本地环境中生成密钥。
  2. 在.gitignore中忽略它(/storage/*.keys)
  3. 在.ebignore中允许它(#/storage/*.keys)

因此,密钥将不会在git中被跟踪,但仍可以使用eb deploy命令上传到elasticbeanstalk。


密钥为空。 - Jake Sylvestre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接