使用后端 (laravel) 和前端 SPA (vue.js, vue-cli 3) 做一个服务。我需要通过 httpOnly cookie(不是 localStorage)进行身份验证。我用 tymondesigns/jwt-auth作为 api 授权包。
我的环境是:
- API 路由:
http://brideplanner.test/api
- SPA 路线:
http://app-test.brideplanner.test:81/
我的登录路径是/api/auth/login
, Controller 方法是:
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
项。这里出了什么问题?为什么没有 token ?我该怎么办?
UPD:我通过 postman 测试了请求并获得了 token :
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 安装中,api
路由 do not启用处理 cookie 的中间件 (Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
)。
如果你真的需要基于 cookie 的身份验证,你可以在你的 API 路由上启用这个中间件,但一定要阅读 the differences .
关于php - 无法为 api 路由 laravel 设置 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935502/