【问题标题】:Laravel Passport: Missing keys after deployment to awsLaravel Passport:部署到 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 时,密钥都会被删除,所以我每次都必须重做这些步骤 - 非常麻烦。有谁找到了一种自动化的好方法?

【问题讨论】:

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


    【解决方案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 文件。

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

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

          【讨论】:

          • 钥匙出来是空白的
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-15
          • 2020-10-22
          • 2020-11-05
          • 2014-06-10
          • 2019-09-30
          • 2019-09-25
          相关资源
          最近更新 更多