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&#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 部署错误 - 内存不足错误

AWS Beanstalk Laravel 部署后挂钩没有这样的文件或目录

Laravel 使用 Lambda 迁移到 AWS RDS

Laravel Passport JWT 身份验证失败

“数据库主机数组为空。”在 AWS Elastic Beanstalk 上部署 Laravel 项目后