Laravel Passport:部署到aws后缺少密钥

时间:2018-10-15 15:19:16

标签: laravel amazon-web-services amazon-elastic-beanstalk laravel-passport

我无法在aws弹性豆茎上设置幼虫护照。 eb客户端设置正确,我可以部署代码更改。没有显示错误。

但是,向laravel发送请求后,错误500告诉我,我在“ app / current / storage / oauth-public.key \”中缺少护照密钥。在本地一切正常。

我想我缺少artisan命令“ php artisanpassport:install”,所以我将其添加到了composer文件中:

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

但是显然它不会创建密钥。

或者在运行eb deploy之后未执行安装后挂钩,或者出现另一个错误使我无法创建密钥文件(缺少写权限?)

如何验证安装后挂钩是否已执行? 有人遇到过类似的问题吗?

我遵循了本期中的建议,但到目前为止没有帮助: https://github.com/laravel/passport/issues/418

更新: 我进入应用程序并尝试手动运行php artisanpassport:install,这导致了错误。我必须首先授予对该文件夹的权限(sudo chmod -R 777存储),然后它才能工作。 不幸的是,每次我运行eb deploy时,密钥都会被删除,因此我每次都必须重做这些步骤-非常麻烦。任何人都找到了一种自动化的好方法吗?

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

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

这有优点也有缺点:

  • 当您将新版本的代码部署到Beanstalk时,它会注销所有用户,或抛出401错误
  • PROS,这是迄今为止解决此问题最快的安全方式

答案 2 :(得分:0)

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

Elastic Beanstalk deployment workflow 中所述,部署后挂钩是按字母数字顺序最后执行的。

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

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

然后(正如 Markus Lechner 在 this forum 中对 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 文件授予执行权限(这是预构建和预部署阶段的部署工作流的一部分)

答案 3 :(得分:-1)

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

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

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