如何在Laravel 5中禁用cookies?

15

我正在使用 Laravel 5.1 制作单页应用。我使用 localStorage 来保存 API 密钥,不需要使用 cookies。Laravel 为我创建了两个 cookies:

  • XSRF-TOKEN
  • laravel_session

如果我在环境配置中将 SESSION_DRIVER 设置为 array,则不再生成 laravel_session cookie。

但是我认为 XSRF-TOKEN cookie 可能存在问题,因为我在 VerifyCsrfToken 中间件类中发现了这段代码:

public function handle($request, Closure $next)
{
    if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

addCookieToResponse 方法看起来像这样:

protected function addCookieToResponse($request, $response)
{
    $config = config('session');

    $response->headers->setCookie(
        new Cookie(
            'XSRF-TOKEN', $request->session()->token(), time() + 60 * 120,
            $config['path'], $config['domain'], false, false
        )
    );

    return $response;
}

看起来无论如何都会设置该cookie。我可以禁用这个中间件,但我想使用它来验证HTTP头部的CSRF令牌。我能完全禁用cookie吗?


1
如果您正在使用Laravel进行API令牌验证,为什么不完全禁用VerifyCsrfToken中间件呢?这会使用您并不关心的cookie。您可以通过转到app/http/Kernel.php并注释该行来禁用它。 - codegeek
仅供更多背景信息,想要禁用Cookie的原因是什么? - ExoticChimp
@ExoticChimp 如果你使用任何cookie,有一项法律规定必须通知用户。我不需要它们,所以我宁愿禁用它们,免受“我们正在使用cookie”的信息的干扰 :) - Robo Robok
首方 Cookie 是网站必需的,因此不需要根据欧盟 Cookie 法律规定通知用户(根据其性质而定)。在此情况下,Laravel 的默认会话 Cookie 将是豁免的。这些法律规定前段时间已经放宽了。 - ExoticChimp
1
是的,它似乎引起了相当多的混淆。这里有一篇不错的文章可以让你开始阅读:http://ec.europa.eu/ipg/basics/legal/cookies/index_en.htm - ExoticChimp
显示剩余2条评论
4个回答

9

只需注释掉与cookie和session相关的app\Http\Kernel.php中的行。以下是我找到的:

\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,

希望这能帮助到你。

1
你可以通过HTTP头发送CSRF令牌,但是你必须在客户端存储该令牌。因此,如果你想禁用cookies,你必须找出如何传输和存储从后端接收到的令牌。也许localstorage很方便用来存储。同时,发送程序也由你自己决定,即设置适当的HTTP头。 - ozanmuyes
只需在头部中使用<meta name="csrf-token" content="{{ csrf_token() }}">,然后在ajax调用中使用headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }(jquery示例)。但是,Laravel仍会抛出错误"Session store not set on request.",我不知道为什么。 - user151496

3

3

我刚在Laravel 6.0中测试过这个功能。
要运行CSRF middleware,并且Laravel不添加任何cookies,您需要禁用(注释掉)以下middleware:

\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,

这将防止 Laravel 添加 laravel_session cookie。

要禁用添加 XSRF-TOKEN cookie,请打开 \App\Http\Middleware\VerifyCsrfToken::class 中间件并将 $addHttpCookie 属性设置为 false


但是当您不使用StartSession时,在尝试验证csrftoken时进行一些post请求时,您总是会收到消息:“请求未设置会话存储。”我想使用会话,但不使用cookie,就像普通的php session_start()一样,不需要cookie。这在Laravel中如此困难,真是太荒谬了。 - user151496

0

注意,移除StartSession中间件会移除整个csrf令牌,因为csrf_token函数获取app('session')->token()。

然而,在StartSession中间件中有一行代码尝试设置cookie并检查驱动程序是否为空(sessionIsPersistent),但如果我将其设置为null,则无法通过“无法解析Illuminate\Session\SessionManager的NULL驱动程序”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接