我目前正在用Laravel Lumen 8构建一个REST API。如果用户成功登录,我想设置一个cookie。我看到在Lumen 5.1文档中有一个部分展示了如何发送带有响应的cookie(https://lumen.laravel.com/docs/5.1/responses#attaching-Cookie响应(。但在版本8的文档中,缺少此部分。我还查看了Laravel 8文档(https://laravel.com/docs/8.x/responses#attaching-Cookie响应(,并在我的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 IlluminateSupportFacadesCookie;
$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 SymfonyComponentHttpFoundationCookie;
$router->get('/test', function () {
return response(null)->withCookie(new Cookie('name', 'value'));
});
这个解决方案是有效的,但如果我像new Cookie('name', 'value', 60)
这样设置第三个参数,我不会收到错误消息,但cookie不再设置。我也有点怀疑,因为我从未在任何官方文档中看到过这一点,只在这个堆栈溢出问题中看到过:在流明5.6中设置cookie响应。
这些并不是我尝试过的唯一方法,但到目前为止没有任何效果。设置cookie应该很容易,但我就是做不到。我对Laravel/Lumen很陌生,这与新版本8有关吗?或者我做错了什么?
我也遇到过同样的问题,这不太好,但它帮我解决了。
use SymfonyComponentHttpFoundationCookie;
use SymfonyComponentHttpFoundationResponse;
...
$response = new Response();
$response->headers->setCookie(Cookie::create('foo', 'bar'));
$response->send(); // <- this guy
如果您使用Sean Tymon的jwt auth库进行JSON Web令牌身份验证,此线程可能会帮助您:https://github.com/tymondesigns/jwt-auth/issues/1594#issuecomment-395575980
引用自线程:
我想罪魁祸首的根源是Lumen的设计不再Cookie,我发现在所有博客和OWASP建议不要将JWT存储在本地存储中,而是存储在httponly cookie以防止XSS并相应地处理CSRF。所以jwt-auth不包括带有LumenServiceProvider是您在app.php中注册的服务提供商:
$app->register(TymonJWTAuthProvidersLumenServiceProvider::class);
所以当你添加时
use TymonJWTAuthHttpParserCookies;
to the top of jwt-authsrcProvidersLumenServiceProvider.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身份验证好