如何用Laravel Passport的CreateFreshApiToken实现HttpOnly Cookie API认证
问题描述
我正在使用Laravel Passport,尝试将代码从本地存储token改为使用HttpOnly Cookie进行认证。我遵循了文档,在Kernel.php的web中间件组中添加了\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class。
我的AuthController中的login函数如下:
public function login(Request $request) { if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ $user = Auth::user(); $token = $user->createToken('API')->accessToken; return response()->json(['user' => $user], 200)->withCookie( 'X-Secure-Token', $token, null, null, null, false, true ); } else { return response()->json(['message' => 'Unauthorized'], 401); } }
登录后我在Postman中成功看到了X-Secure-Token Cookie,但访问受auth:api中间件保护的其他路由时,仍返回“Unauthenticated”提示,我已将请求的Authorization设置为“No Auth”。作为API开发新手,我该如何让Postman中的HttpOnly Cookie认证系统正常工作?
解决步骤
1. 修正登录接口逻辑
CreateFreshApiToken中间件会自动处理Cookie的生成与设置,你手动创建token并设置自定义Cookie的操作和它的逻辑冲突了。修改登录方法:
public function login(Request $request) { if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ $user = Auth::user(); // 移除手动生成token和设置Cookie的代码 return response()->json(['user' => $user], 200); } else { return response()->json(['message' => 'Unauthorized'], 401); } }
2. 确保路由使用正确中间件
- 登录路由必须放在
web中间件组下,这样CreateFreshApiToken才能生效,自动在响应中设置laravel_tokenCookie。 - 受保护的API路由需要同时使用
web和auth:api中间件,示例:Route::middleware(['web', 'auth:api'])->group(function () { Route::get('/user/profile', [UserController::class, 'profile']); });
3. Postman配置调整
- 发送登录请求时,确保Postman的Cookie自动保存功能开启(默认开启,会自动存储响应返回的Cookie)。
- 后续访问受保护路由时,无需设置Authorization头,Postman会自动带上之前保存的
laravel_tokenCookie。 - 如果是跨域场景,在Postman的请求设置中开启「Send cookies」,同时确保Laravel的CORS配置中
supports_credentials设为true。
4. 可选:自定义Cookie名称(如需)
如果坚持使用自定义Cookie名称(如X-Secure-Token),在config/passport.php中添加配置:
'cookie' => 'X-Secure-Token',
保持CreateFreshApiToken在web中间件组中,登录后系统会自动设置该自定义Cookie,后续请求可自动读取认证。
内容的提问来源于stack exchange,提问作者JRC
相关产品推荐
相关产品推荐

