如何在 Laravel Lumen 8 中设置响应的 cookie

Posted

技术标签:

【中文标题】如何在 Laravel Lumen 8 中设置响应的 cookie【英文标题】:How to set a cookie on response in Laravel Lumen 8 【发布时间】:2021-06-30 07:36:09 【问题描述】:

我目前正在使用 Laravel Lumen 8 构建一个 REST API。如果用户成功登录,我想设置一个 cookie。我看到在 Lumen 5.1 文档中有一个部分显示了如何发送带有响应的 cookie (https://lumen.laravel.com/docs/5.1/responses#attaching-cookies-to-responses)。但在版本 8 的文档中,这部分内容缺失。我还查看了 Laravel 8 文档 (https://laravel.com/docs/8.x/responses#attaching-cookies-to-responses) 并在我的 routes/web.php 文件中尝试了以下内容:

尝试 1

$router->get('/test', function () 
    return response('Hello World')->cookie(
        'name', 'value', 60
    );
);

然后我收到以下错误:

参数 1 传递给 Symfony\Component\HttpFoundation\ResponseHeaderBag::setCookie() 必须 是 Symfony\Component\HttpFoundation\Cookie 的一个实例,字符串 给定

尝试 2

use Illuminate\Support\Facades\Cookie;

$router->get('/test', function () 
    Cookie::queue('name', 'value', 60);
    return response('Hello World');
);

错误信息:目标类 [cookie] 不存在。

尝试 3

$router->get('/test', function () 
    $cookie = cookie('name', 'value', 60);
    return response('Hello World')->cookie($cookie);
);

错误信息:调用未定义的函数 cookie()

尝试 4

use Symfony\Component\HttpFoundation\Cookie;
$router->get('/test', function () 
    return response(null)->withCookie(new Cookie('name', 'value'));
);

此解决方案有效,但如果我像这样设置第三个参数new Cookie('name', 'value', 60),我不会收到错误消息,但不会再设置 cookie。 而且我也有点怀疑,因为我从未在任何官方文档中看到过这一点,而只是在这个堆栈溢出问题中看到过:Set cookie on response in lumen 5.6。

这些不是我尝试的唯一方法,但到目前为止没有任何效果。设置 cookie 应该是一件容易的事,但我就是做不到。我对 Laravel/Lumen 很陌生,这与新版本 8 有关吗?还是我做错了什么?

【问题讨论】:

第一次尝试是否导入了这个类Illuminate\Http\Response 是的,我添加了use Illuminate\Http\Response; Yii2 更适合 WebDev 2021。 【参考方案1】:

如果您使用 Sean Tymon 的 jwt-auth library 进行 JSON Web 令牌身份验证,此线程可能会帮助您:https://github.com/tymondesigns/jwt-auth/issues/1594#issuecomment-395575980

引用自该线程:

我猜罪魁祸首是 Lumen 的设计不再适用 cookie 鉴于所有的博客和 OWASP 建议不要将 JWT 存储在本地存储中,而是存储在 httponly cookie 以防止 XSS 并相应地处理 CSRF。所以 jwt-auth 不包含 cookie 解析器 LumenServiceProvider 这是您在 app.php 中注册的 服务商:

$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);

所以当你添加

use Tymon\JWTAuth\Http\Parser\Cookies;
to the top of jwt-auth\src\Providers\LumenServiceProvider.php

并添加

new Cookies($this->config('decrypt_cookies'))

放入文件末尾的数组中

$this->app['tymon.jwt.parser']->setChain([<br>
            new AuthHeaders,
            new QueryString,
            new InputSource,
            new LumenRouteParams,
            new Cookies($this->config('decrypt_cookies')),
        ]);

那么您应该可以在 Lumen 中使用 cookie 身份验证作为 好吧。

【讨论】:

【参考方案2】:

我也遇到了同样的问题,这不是很漂亮,但它为我解决了这个问题。

use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
...
$response = new Response();
$response->headers->setCookie(Cookie::create('foo', 'bar'));
$response->send(); // <- this guy

【讨论】:

以上是关于如何在 Laravel Lumen 8 中设置响应的 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel/Lumen 中捕获 401 响应?

在Laravel 4单元测试中,如何在请求中设置cookie?

Lumen 时区设置

如何在流明 5.2 中设置时区?

有关lumen的一些设置

当您将调试设置为 false 时,如何在 Lumen 中隐藏 .env 密码?