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

问题描述 投票:0回答:5

我在 aws elastic beanstalk 上设置 laravels 护照时遇到问题。 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 hook,要么有另一个错误不允许我创建密钥文件(缺少写入权限?)

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

我遵循了这个问题的建议,但到目前为止它没有帮助: https://github.com/laravel/passport/issues/418

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

laravel amazon-web-services amazon-elastic-beanstalk laravel-passport
5个回答
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 的 envvars 大小限制:https://forums.aws.amazon.com/thread.jspa?messageID=618423򖾷

最后,我们最终使用了我们的 CI。


1
投票

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

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

这有利也有弊:

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

0
投票

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

Elastic Beanstalk 部署工作流程 中所述,部署后挂钩按字母数字顺序最后执行。

在源代码的根目录中创建文件夹 .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 {} \;

wich 相当于为 .platform 文件夹和 staging/ 文件夹中的每个 .sh 文件授予执行权限(这是预构建和预部署阶段部署工作流的一部分)


0
投票

我遇到了同样的问题。现在它工作 100%

在安装 laravel 护照之前:

  1. 创建文件
    .ebextensions/02-deploy.config
  2. 复制以下代码
    container_commands:
      # Install laravel passport
      01_passport_install:
      command: "php artisan passport:install"

安装laravel passport后:

  1. 将以下代码复制到
    .ebextensions/02-deploy.config
    container_commands:
      # Install laravel passport
      # 01_passport_install:
      #  command: "php artisan passport:install"

-2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.