Yii2 Чтение тела запроса PUT после того, как сервер oauth2 уже это сделал

Я работаю над REST API с авторизацией oauth2. Для сервера 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

Я знаю, что это ожидаемо, никаких ошибок. Но какое решение было бы для этого?


person Anatoly Lagodich    schedule 18.08.2015    source источник


Ответы (1)


Прежде чем создавать этот сервер аутентификации, запустите это (в зависимости от того, где вы выполняете аутентификацию, вы можете использовать beforeAction() или даже init():

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

Теперь я не знаю, как/где вы используете компонент, поэтому он может работать не полностью, но теоретически должен.

person Blizz    schedule 19.08.2015
comment
Спасибо, я так и сделал, но, честно говоря, мне это не очень нравится. Я собираюсь сделать так, чтобы сервер oauth не читал тело и разрешал авторизацию только в заголовке. Интересно, почему он вообще читает тело, даже если я установил параметр false allow_credentials_in_request_body. - person Anatoly Lagodich; 20.08.2015
comment
Согласованный. Но я не могу придумать лучшего решения прямо сейчас. Дайте мне знать, если вы это сделаете. - person Blizz; 20.08.2015
comment
Конечно, я покопаюсь в сервере, чтобы понять, как он работает. - person Anatoly Lagodich; 20.08.2015