如何使用 Apollo Server 清除设置的 cookie

问题描述

我最近刚从使用 express 与 apollo 服务器切换到只使用 apollo 服务器,因为订阅设置似乎更现代且更易于设置。我现在遇到的问题是我正在用我们的刷新令牌保存一个 cookie 以用于登录并在注销时清除 cookie。这在我使用 express 时有效。

     const token = context.req.cookies[process.env.REFRESH_TOKEN_NAME!];
     context.res.status(401);

自从从 express/apollo 切换到 apollo 服务器后,即使我在 apollo 服务器上公开 req/res 上下文,我也无权访问 req.cookies

我最终切换到这个(这是hacky)来获取cookie。

      const header = context.req.headers.cookie
      var cookies = header.split(/[;] */).reduce(function(result: any,pairstr: any) {
        var arr = pairstr.split('=');
        if (arr.length === 2) { result[arr[0]] = arr[1]; }
        return result;
      },{});

这有效,但现在我不知道如何删除 cookie。我正在做快递

context.res.clearCookie(process.env.REFRESH_TOKEN_NAME!);

我现在不知道如何清除 cookie,因为 res.clearCookie 不存在。

解决方法

只需将完全相同的 cookie 发送回客户端,并将 Expires 属性设置为过去的某个日期。请注意,关于 cookie 其余部分的所有内容都必须完全相同,因此请确保也保留所有原始 cookie 属性。

而且,这里有一个指向此主题的 RFC itself 的链接:

最后,要移除一个cookie,服务器返回一个Set-Cookie头 具有过去的到期日期。服务器会成功 仅当 Path 和 Domain 属性在删除 cookie Set-Cookie 标头匹配 cookie 时使用的值 已创建。

至于如何做到这一点,如果您使用的是 Node 的 http 模块,您可以使用类似这样的东西(假设您有一个 response 来自传递给 {{1} }):

http.createServer

这是假设您的 context.response.writeHead(200,{'Set-Cookie': '<Your Cookie Here>','Content-Type': 'text/plain'}); 可以访问它可以写入的 http context

为了清楚起见,您可以查看 Express does it herehere 的说明。