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

时间:2015-08-18 21:34:06

标签: rest oauth-2.0 yii2 http-put

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

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

在PHP 5.6之前,使用php://输入打开的流只能读取一次;流不支持搜索操作。但是,根据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

我知道这是预期的,没有错误。但是这会有什么解决方案呢?

1 个答案:

答案 0 :(得分:1)

在创建该auth服务器之前,请运行此服务器(具体取决于您进行身份验证的位置,您可以使用beforeAction(),甚至init()

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

现在,我不知道您使用该组件的方式/位置,因此它可能无法完全发挥作用,但理论上它应该是。