Yii2 在 oauth2 服务器已经完成后读取 PUT 请求正文

Yii2 Reading PUT request body after oauth2 server already did it

我正在使用 oauth2 授权开发 REST API。 对于 Oauth2 服务器,我使用 https://github.com/bshaffer/oauth2-server-php

Php 医生在这里说 http://php.net/manual/en/wrappers.php.php

在PHP 5.6之前,用php://input打开的流只能读取一次;该流不支持查找操作。但是,根据 SAPI 的实现,可能会打开另一个 php:// 输入流并重新开始读取。这只有在请求正文数据已保存的情况下才有可能。通常,POST 请求会出现这种情况,但其他请求方法不会出现这种情况,例如 PUT 或 PROPFIND。

简而言之,这意味着可以读取 POST 主体两次,但不能 PUT。

但是 Oauth2 服务器在这里第一次读取它https://github.com/bshaffer/oauth2-server-php/blob/develop/src/OAuth2/Request.php#L114

所以当我在 Yii2 请求中读取原始主体时,它是空的。 (仅在 PUT 上,在 POST 和 PATCH 上是可以的,可以读取两次)。 https://github.com/yiisoft/yii2/blob/master/framework/web/Request.php#L345

我知道这是预期的,没有错误。但是解决这个问题的方法是什么?

在您创建该身份验证服务器之前,运行 这个(取决于您在哪里进行身份验证,您可以使用 beforeAction(),甚至 init():

$content = Yii::$app->request->rawBody;
$authentication = Request::createFromGlobals();
if ($content)
   $authentication->content = $content;

现在,我不知道 how/where 您使用了该组件,因此它可能无法完全工作,但理论上应该可以。