我注意到,当我将
SESSION_DRIVER
设置为其他驱动程序(例如 redis)时,一切正常,但是当设置为 memcached
时,我的请求总是会因为 CSRF 令牌不匹配而失败。
我去看了Laravel的
Illuminate\Foundation\Http\Middleware\ValidateCsrfToken
中间件,或者更准确地说,Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
;我注意到所有布尔值在其条件下都是假的
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->inExceptArray($request) ||
$this->tokensMatch($request)
) {
return tap($next($request), function ($response) use ($request) {
if ($this->shouldAddXsrfTokenCookie()) {
$this->addCookieToResponse($request, $response);
}
});
}
throw new TokenMismatchException('CSRF token mismatch.');
}
我更深入地研究了
tokensMatch()
方法。
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
我了解到,当我使用
memcached
作为驱动程序时,$request->session()->token()
和 $this->getTokenFromRequest($request)
不匹配。但为什么呢?
php-memcached是我的memcached php扩展
问题解决了。我已经使用 docker 镜像安装了 memcached。安装后,您需要执行如下所示的memcached二进制文件(是否为守护进程):
memcached -v -u www-data
我至少预计会出现一个错误。不知道为什么 Laravel 在没有 memcached 启动的情况下工作得很好!