我尝试在 Heroku 上安装我的应用程序。这个应用程序是一个 PHP/Laravel 应用程序,带有用于身份验证的“护照”。在我的本地计算机(MacOS)上一切运行正常。
当我尝试使用 Postman 进行简单的“发布”时,出现此错误:
2018-03-17T17:05:22.059708+00:00 app[web.1]: [2018 年 3 月 17 日 17:05:22 UTC] [2018-03-17 17:05:22] 生产。错误:密钥路径“file:///app/storage/oauth-private.key”不存在或不可读{“异常”:“[对象](LogicException(代码:0):密钥路径“file:/// app/storage/oauth-private.key" 不存在或在 /app/vendor/league/oauth2-server/src/CryptKey.php:45)"} []
不存在或不可读
为了设置护照,我使用以下命令生成了密钥:
php artisan 护照:安装
我在 Heroku 的数据库中看到了密钥。所以命令工作正常。
那么这个错误是什么?
我还尝试重新生成密钥,停止并重新启动应用程序。没有成功。
实际上,app/storage文件夹中并没有生成关键文件,所以才会出现这个错误。但为什么这些文件没有生成呢?
解决方案在这里:https://github.com/laravel/passport/issues/267
将这几行添加到“scripts”属性下的
composer.json
中,然后提交并部署到Heroku中:
"post-install-cmd": [
"php artisan clear-compiled",
"chmod -R 777 storage",
"php artisan passport:keys"
]
但是,之后您必须从表“oauth-clients”中删除密钥,然后使用以下命令重新生成这些密钥:
php artisan passport:install
关于@Dom的答案,它会在每次部署时注销你的用户,所以如果你真的使用Heroku而不是Dokku(就像我的例子),我建议你使用该命令生成密钥: php artisan Passport :keys 然后通过 Nano 将 storage/oauth-public.key 和 storage/oauth-private.key 中生成的密钥复制到多行环境变量中,然后您可以在composer.json中使用此安装后脚本:
“安装后cmd”:[ “php artisan 清晰编译”, “chmod -R 777 存储”, "echo -n $OAUTH_PRIVATE_KEY > storage/oauth-private.key", “echo -n $OAUTH_PUBLIC_KEY > storage/oauth-public.key”]
这将在每次部署时从 ENV 重新生成密钥并让您的用户保持登录状态。
如果该解决方案不起作用,您仍然可以 从 .gitignore 中删除 '/storage/*.key' 行
Laravel Passport 有一个配置,允许将公钥和私钥设置为环境变量。
您可以在本地计算机上运行
php artisan vendor:publish --tag=passport-config
并提交更改。
然后在 Heroku 配置上设置
PASSPORT_PRIVATE_KEY
和 PASSPORT_PUBLIC_KEY
。
从这个博客
找到我的解决方案非常简单:
Laravel (v.7) 中默认忽略 oauth-keys
从环境加载密钥
或者,您可以使用供应商:publish Artisan 命令来发布 Passport 的配置文件:
php artisan vendor:publish --tag=passport-config
配置文件发布后,您可以通过将应用程序的加密密钥定义为环境变量来加载它们:
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
<private key here>
-----END RSA PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
<public key here>
-----END PUBLIC KEY-----"
我有一个更好的解决方案来解决这个问题,不需要公开你的密钥