如何在Lighthouse PHP自定义Resolver中设置响应Cookie?
你可以通过以下两种方式在自定义Resolver中操作响应Cookie:
方法一:使用Cookie门面(推荐)
Laravel的Cookie门面提供了queue方法,能自动将Cookie附加到最终响应中,无需直接操作响应对象:
use Illuminate\Support\Facades\Cookie; use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; use GraphQL\Type\Definition\ResolveInfo; class YourAuthResolver { public function resolve($root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { // 执行认证逻辑,生成认证令牌 $authToken = $this->generateAuthToken($args); // 队列化Cookie,参数说明:名称、值、过期分钟数、路径、域名、HTTPS、HTTPOnly、SameSite Cookie::queue( 'auth_token', $authToken, 60 * 24 * 7, // 7天过期 '/', null, config('app.env') === 'production', // 生产环境启用HTTPS true, // 开启HTTPOnly,防范XSS攻击 false, 'lax' // SameSite策略,防止CSRF ); // 返回Resolver需要的数据 return [ 'user' => auth()->user(), 'success' => true ]; } private function generateAuthToken(array $args) { // 实现你的令牌生成逻辑 return 'your-generated-token'; } }
方法二:通过GraphQLContext操作响应对象
如果需要更精细地控制响应,可以通过GraphQLContext获取当前请求对象,进而操作响应实例:
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; use GraphQL\Type\Definition\ResolveInfo; use Illuminate\Http\Response; class YourAuthResolver { public function resolve($root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { $authToken = $this->generateAuthToken($args); $request = $context->request(); // 获取现有响应或创建新响应实例 $response = $request->response ?? new Response(); // 向响应添加Cookie $response->cookie( 'auth_token', $authToken, 60 * 24 * 7, '/', null, config('app.env') === 'production', true, false, 'lax' ); // 若响应是新创建的,绑定到请求上确保被发送 if (! $request->response) { $request->setResponse($response); } return [ 'user' => auth()->user(), 'success' => true ]; } private function generateAuthToken(array $args) { // 实现你的令牌生成逻辑 return 'your-generated-token'; } }
注意事项
HTTPOnly和SameSite参数是安全最佳实践,建议保留启用,避免XSS和CSRF风险- Cookie的过期时间、域名等配置需根据你的业务需求调整
- 两种方法均依赖Laravel的请求响应周期,Lighthouse会自动处理最终的响应发送
内容的提问来源于stack exchange,提问作者trm217
相关产品推荐
相关产品推荐

