Laravel chmod(/var/dev/project/storage/oauth-public.key):操作失败:不允许操作
Posted
技术标签:
【中文标题】Laravel chmod(/var/dev/project/storage/oauth-public.key):操作失败:不允许操作【英文标题】:Laravel chmod(/var/dev/project/storage/oauth-public.key): Operation failed: Operation not permitted 【发布时间】:2017-12-06 09:18:13 【问题描述】:更新以下软件包后,我收到一个错误,即找不到 oauth-public.key 文件。
软件包操作:1 次安装、2 次更新、0 次删除
更新 laravel/framework (v5.4.27 => v5.4.28):下载 (100%) 安装 defuse/php-encryption (v2.1.0): 下载 (100%) 更新联赛/oauth2-server (5.1.3 => 5.1.4):正在下载 (100%)
首先我删除了project/storage中的两个oauth-文件,然后执行这个命令:php artisan passport:install生成新的oauth-强>文件。
现在尝试访问 api 路由时出现以下错误。
(1/1) 错误异常 chmod(/var/dev/project/storage/oauth-public.key):操作失败:不允许操作
堆栈跟踪
在 CryptKey.php(第 51 行)中
在 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'))
在 chmod('file:///var/dev/project/storage/oauth-public.key', 384) 在 CryptKey.php 中(第 51 行)
在 CryptKey->__construct('file:///var/dev/project/storage/oauth-public.key') 在 ResourceServer.php(第 50 行)
文件权限
-rw-r--r-- user:user oauth-private.key
-rw-r--r-- user:user oauth-public.key
更新 1
我发现 oauth Libaray 引入了安全修复程序。 Oauth V5 Security Improvements
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
在我删除供应商文件夹并再次执行 composer install 后,我仍然遇到同样的错误。
【问题讨论】:
我也是。我也遇到了这个错误 【参考方案1】:试试:
sudo chown www-data:www-data storage/oauth-*.key
sudo chmod 600 storage/oauth-*.key
它解决了我的问题。
【讨论】:
它解决了问题,但所有其他所有者和组都设置为我的用户。所以我认为将所有者设置为 www-data 是不正确的? 在 Ubuntu 16.04 上运行良好 这解决了这个问题,因为“league/oauth2server”有重大变化。见/vendor/league/oauth2-server/src/CryptKey.php
。它强制以特定方式设置所有者和权限,server:server
和 0600
。另请参阅:github.com/laravel/passport/issues/418
谢谢伙计,就我而言,我必须将其设为 chmod 660【参考方案2】:
根据最新的oauth-server 5.1.4
update,您应该在passport 2.x
中设置一个尚未实现的加密密钥。
一个简单快速的解决方法是使用passport 3.x
,它使用oauth-server 6.x
,通过更新你的composer.json
文件:
"laravel/passport": "^3.0"
然后
composer update
【讨论】:
非常感谢!此解决方案对我有用,无需更改任何所有者或权限。【参考方案3】:终于!我找到了解决方案。 (CentO)
chown apache:apache oauth-public.key
chown apache:apache oauth-private.key
首先你需要找到你的服务器的用户名: 这将返回您需要的用户名
ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1
对我来说是 apache
【讨论】:
【参考方案4】:将 oauth-private.key 的所有者更改为 www-data:www-data 是不安全的。只有 oauth-public.key 应该归 www-data:www-data 所有。
这就足够了:
sudo chown www-data:www-data oauth-public.key
sudo chmod 600 oauth-public.key
完成后,通过在存储文件夹中运行以下命令来检查您的权限:
ls -la
oauth-private.key 的所有者不应是 www-data:www-data。 oauth-public.key 的所有者应该是 www-data:www-data
【讨论】:
【参考方案5】:composer install 对我有用 :)
【讨论】:
刚刚尝试过......但我仍然得到与问题中描述的相同的错误。【参考方案6】:同样的问题,我暂时回滚到我的 composer.lock 文件的早期版本。看起来 OAuth 包正在尝试修改存储文件夹中密钥的权限,而我的服务器没有它。
我将查看包更改日志并查看更改的内容,并可能在下班后重新运行更新。
【讨论】:
是的,它实际上是在尝试更改权限。请参阅此提交:github.com/thephpleague/oauth2-server/commit/… @mayid,在那儿。但是,我的服务器不允许修改权限,所以我们必须手动调整它并在我的结果中发表评论。【参考方案7】:这也取决于你的 Laravel 和 Passport 版本。 如果使用最新的 Laravel 5.4,它会使用带有 Oauth 包补丁的 Passport 3.0。
如果您使用的是 larvel 5.3,它使用 Passport 1.0(您应该升级!!)[无补丁],但这使用的是当时 (5.1.4) 的稳定版本的联盟/OAuth-server,它有检查file.
解决方案:您需要强制安装 5.1.3 版本(不理想)但会解决问题。
在项目根目录中运行。
composer require league/oauth2-server 5.1.3
【讨论】:
以上是关于Laravel chmod(/var/dev/project/storage/oauth-public.key):操作失败:不允许操作的主要内容,如果未能解决你的问题,请参考以下文章
Laravel chmod(/var/dev/project/storage/oauth-public.key):操作失败:不允许操作