无法为 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]。使用闭包。 (逻辑异常)[重复]

Laravel - 错误“无法为序列化准备路由 [/]。使用闭包。”

用户会话认证的 Laravel API 路由

由用户会话验证的Laravel API路由

Laravel 无法保护 API 路由

laravel 路由参数的默认值怎么设置