0

我在向使用tuupola/corsslim-jwt-auth的 slim 3 项目添加一些自定义中间件时遇到问题,其中 jwt 令牌存储在标头中作为承载进行身份验证。

一切运作良好。当从 chrome 发出 ajax 请求时,它首先发送一个选项请求以确认可以访问,然后在标头中发送带有 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,但永远不会发送第二个请求。

对于发生了什么以及如何调试它,我真的很困惑。

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 回答