0

tuupola/corsを使用しているスリム 3 プロジェクトにカスタム ミドルウェアを追加する際に問題が発生し、slim-jwt-authを認証用のベアラーとしてヘッダーに格納された jwt トークンとともに使用しています。

すべてがうまくいっています。chrome から ajax リクエストを行うと、まず options リクエストを送信してアクセスが可能であることを確認してから、jwt トークンをヘッダーに Authorization: Bearer として適切なリクエストを送信するのですが、ミドルウェアをフローに追加すると、オプション リクエストが送信され、200 Ok が返されますが、実際のリクエストは送信されません。

この問題は、カスタム ミドルウェアが最小限の形式に取り下げられ、まったく変更されていない場合でも発生します。ミドルウェアは次のように定義されます。

$container['App\Middleware\MyMiddleware'] = function ($c) {
    return new \App\Middleware\MyMiddleware(
        $c->get('logger')
    );
};

ミドルウェア自体は次のように単純です。

namespace App\Middleware;

use Psr\Log\LoggerInterface;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;


class MyMiddleware {
    protected $logger;

    public function __construct(LoggerInterface $logger){
        $this->logger = $logger;
    }

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next) {

        $next($request, $response);

        return $response;
    }
}

ミドルウェアは、次のようにすべてのルートに追加されます。

$app->add($container->get('App\Middleware\MyMiddleware'));
$app->add($container->get('Slim\Middleware\JwtAuthentication'));
$app->add($container->get('cors'));

MyMiddleware を無効にすると、オプション リクエストとフォローアップ リクエストの両方がヘッダーの jwt トークンを使用して実行されますが、MyMiddleware を有効にすると、オプション リクエストは正常に送信され、200 OK が返されますが、2 番目のリクエストは送信されません。

何が起こっているのか、どのようにデバッグするのか、私は本当に困惑しています。

4

1 に答える 1

1

PSR-7 Response オブジェクトは不変であるため、ミドルウェアでは$next()(実際のルートまたは次のミドルウェアである必要があります) を実行しますが、そこからの応答は保存しません。

class MyMiddleware {
    protected $logger;

    public function __construct(LoggerInterface $logger){
        $this->logger = $logger;
    }

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next) {

        $response = $next($request, $response);

        return $response;
    }
}
于 2016-12-16T15:51:31.200 に答える