You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lighthouse PHP自定义Resolver中设置响应Cookie?

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:08:20