无法为 api 路由 laravel 设置 cookie
Posted
技术标签:
【中文标题】无法为 api 路由 laravel 设置 cookie【英文标题】:Can't set cookie for api route laravel 【发布时间】:2019-07-22 22:44:28 【问题描述】:使用后端 (laravel) 和前端 SPA (vue.js, vue-cli 3) 提供服务。我需要通过 httpOnly cookie(不是 localStorage)进行身份验证。我使用 tymondesigns/jwt-auth 作为 api auth 包。
我的环境是:
API 路由:http://brideplanner.test/api
SPA路由:http://app-test.brideplanner.test:81/
我的登录路由是/api/auth/login
,控制器方法是:
public function login()
$credentials = request(['email', 'password']);
$user = User::where('email','=',$credentials['email'])->first();
if (!$user || !$token = auth()->claims(['sub' => $user->id, 'csrf-token' => str_random(32) ])->attempt($credentials))
return response()->json(['error' => 'Unauthorized'], 401);
return response()
->json('success')
->withCookie('token', $token, config('jwt.ttl'), ".brideplanner.test", null, false, false);
但是当我尝试向 API 发送请求时,cookie 存储中没有 token
项。这里有什么问题?为什么没有令牌?我该怎么办?
UPD:我通过邮递员测试了请求,我得到了令牌:
Set-Cookie →token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9icmlkZXBsYW5uZXIudGVzdFwvYXBpXC9hdXRoXC9sb2dpbiIsImlhdCI6MTU1MTM5NDMwNCwiZXhwIjoxNTUxMzk1MjA0LCJuYmYiOjE1NTEzOTQzMDQsImp0aSI6Im9uU1NtWEpSU0prR3NKc3giLCJzdWIiOjEsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEiLCIwIjoic3ViIiwiMSI6ImNzcmYtdG9rZW4iLCJjc3JmLXRva2VuIjoiTE9jSDFCWG9ITFJBMjlFYTg2MG1XQXhrVnpTR2gzT2oifQ.mnR4C6bwMIVptU64eZ6tN-gCYyFEuCIk_dm6dJsXrLY; expires=Thu, 28-Feb-2019 23:06:44 GMT; Max-Age=900; path=.brideplanner.test; domain=.brideplanner.test; httponly
但是当我从我的 SPA (http://app-test.brideplanner.test:81/
) 发送请求时,它出错了。
【问题讨论】:
你考虑过使用 Laravel Passport 吗? laravel.com/docs/5.7/passport @dparoli 护照在这种情况下过多,我不需要做第三方身份验证之类的事情。我只需要为我的 SPA 应用程序提供一个 API 【参考方案1】:在默认的 Laravel 安装中,api
路由 do not 启用了处理 cookie 的中间件 (Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
)。
如果您确实需要基于 cookie 的身份验证,您可以在 API 路由上启用此中间件,但请务必阅读 the differences。
【讨论】:
我更新了问题。我通过邮递员测试了请求,并按预期收到了 cookie 集。但是从浏览器就出错了 您可能有一个来自.brideplanner.test
的cookie 不是由app-test.brideplanner.test:81
设置的。请检查我强调的中间件方法。
你的意思是我不能从test.brideplanner.test
设置一个cookie.brideplanner.test
?我不明白为什么它没有从请求中设置为/api/auth/login
我是说你在响应中看到了 cookie,因为 app-test.brideplanner.test
正在发回它收到的 .brideplanner.test
cookie,但没有 new 或 更新了它设置的cookies,因为你没有中间件。
谢谢!我为此头疼了一个小时。升级的 Laravel 和我的 API 身份验证刚刚停止工作......以上是关于无法为 api 路由 laravel 设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 7:无法为序列化准备路由 [api/user]。使用闭包。 (逻辑异常)[重复]