为什么在cors中添加额外的中间件来修改3阻塞jwt身份验证

时间:2016-12-16 09:50:42

标签: php authentication cors jwt slim-3

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

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

我真的很难知道发生了什么以及如何调试它。

1 个答案:

答案 0 :(得分:1)

PSR-7 Response对象是不可变的,所以在你的中间件中你执行$next()(应该是实际的路由或下一个中间件),但你不能保存那个响应。< / p>

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;
    }
}