Laravel chmod(/var/dev/project/storage/oauth-public.key): 操作失败: 不允许操作

更新以下软件包后,我收到一个错误,即找不到oauth-public.key文件。

包操作:1 次安装、2 次更新、0 次删除

更新 laravel/framework (v5.4.27 => v5.4.28): 正在下载 (100%)
安装 defuse/php 加密 (v2.1.0): 正在下载 (100%)
更新 league/oauth2 服务器 (5.1.3 => 5.1.4): 正在下载 (100%)

首先,我删除了项目/存储中的两个oauth文件,然后执行以下命令:php artisan passport:install以生成新的oauth-文件。

现在,我在尝试访问 api 路由时收到以下错误。

(1/1) ErrorException chmod(/var/dev/project/storage/oauth-public.key): 操作失败: 不允许操作

堆栈跟踪

在CryptKey.php(第51行)

at HandleExceptions->handleError(2, 'chmod(/var/dev/project/storage/oauth-public.key): Operation failed: Operation not allowed', '/var/dev/project/vendor/league/oauth2-server/src/CryptKey.php', 51, array('keyPath' => 'file:///var/dev/project/storage/oauth-public.key', 'passPhrase' => null, 'keyPathPerms' => '644'))

at chmod('file:///var/dev/project/storage/oauth-public.key', 384) in CryptKey.php (第51行)

at CryptKey->__construct('file:///var/dev/project/storage/oauth-public.key') in ResourceServer.php (第 50 行)

文件权限

-rw-r--r-- user:user oauth-private.key
-rw-r--r-- user:user oauth-public.key

更新 1

我发现oauth Libaray引入了一个安全修复程序。Oauth V5 安全改进

版本 5.1.4 是与其他 5.1.x 版本的向后兼容。

您会注意到在服务器日志中出现如下消息:

您必须设置加密密钥以提高此库的安全性 - 有关详细信息,请参阅此页面 https://oauth2.thephpleague.com/v5-security-improvements/

要在实例化 \League\OAuth2\Server\AuthorizationServer 的实例后阻止此通知,您应该调用 setEncryptionKey() 方法传入至少 32 个字节的随机数据。

您可以使用base64_encode(random_bytes(32)生成此函数。或者,如果您使用的是像Laravel这样的框架,它已经生成了一个加密密钥,则可以将其传递(在Laravel的情况下,请使用env('APP_KEY'))。

问题是Laravel Passport的维护者必须解决这个问题。

更新 2

在我删除了供应商文件夹并再次执行作曲家安装后,我仍然得到相同的错误。


答案 1

尝试:

sudo chown www-data:www-data storage/oauth-*.key
sudo chmod 600 storage/oauth-*.key

它解决了我的问题。


答案 2

根据最新的更新,您应该设置一个尚未在 中实现的加密密钥。oauth-server 5.1.4passport 2.x

一个简单而快速的解决方法是通过使用哪些用途来更新您的文件:passport 3.xoauth-server 6.xcomposer.json

"laravel/passport": "^3.0"

然后

composer update

推荐