为什么向 slim 3 添加额外的中间件会阻止使用 cors 的 jwt 身份验证
Why does adding an extra middleware to slim 3 blocking jwt authentication with cors
我在将一些自定义中间件添加到使用 tuupola/cors and slim-jwt-auth 的 slim 3 项目时遇到问题,jwt 令牌存储在 header 中作为身份验证的承载。
一切正常。当从 chrome 发出 ajax 请求时,它首先发送一个选项请求以确认可以访问,然后使用 header 中的 jwt 令牌作为授权发送正确的请求: Bearer,但是当我向流中添加一个额外的中间件时,选项请求被发送 returns 200 好的,但实际请求从未被发送。
即使我的自定义中间件被简化为最小的形式,并且根本没有改变,也会出现这个问题。中间件是这样定义的:
$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 的情况下,选项请求和后续请求都使用 header 中的 jwt 令牌执行,但是在启用 MyMiddleware 的情况下,选项请求已成功发送,返回 200 OK,但第二个请求是从未发送过。
我真的不知道发生了什么以及如何调试它。
PSR-7 响应对象是不可变的,所以在你的中间件中你确实执行了 $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;
}
}
我在将一些自定义中间件添加到使用 tuupola/cors and slim-jwt-auth 的 slim 3 项目时遇到问题,jwt 令牌存储在 header 中作为身份验证的承载。
一切正常。当从 chrome 发出 ajax 请求时,它首先发送一个选项请求以确认可以访问,然后使用 header 中的 jwt 令牌作为授权发送正确的请求: Bearer,但是当我向流中添加一个额外的中间件时,选项请求被发送 returns 200 好的,但实际请求从未被发送。
即使我的自定义中间件被简化为最小的形式,并且根本没有改变,也会出现这个问题。中间件是这样定义的:
$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 的情况下,选项请求和后续请求都使用 header 中的 jwt 令牌执行,但是在启用 MyMiddleware 的情况下,选项请求已成功发送,返回 200 OK,但第二个请求是从未发送过。
我真的不知道发生了什么以及如何调试它。
PSR-7 响应对象是不可变的,所以在你的中间件中你确实执行了 $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;
}
}