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

Posted

技术标签:

【中文标题】如何使用 Apollo Server 清除设置的 cookie【英文标题】:How to clear an set cookies with Apollo Server 【发布时间】:2021-04-09 19:01:12 【问题描述】:

我最近刚刚从使用 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!);

由于 res.clearCookie 不存在,我现在不确定如何清除 cookie。

【问题讨论】:

【参考方案1】:

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

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

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

至于如何做到这一点,如果你使用 Node 的 http 模块,你可以使用类似这样的东西(假设你有一个来自传递给 http.createServer 的回调的 response):

context.response.writeHead(200, 'Set-Cookie': '<Your Cookie Here>', 'Content-Type': 'text/plain');

这是假设您的 context 可以访问它可以写入的 http response

为了清楚起见,您可以查看Express does it here 和here。

【讨论】:

以上是关于如何使用 Apollo Server 清除设置的 cookie的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 客户端:在清除或重置存储时保留/重置默认值

Apollo-Server,如何与 SailsJS 一起使用?

Nuxt / Apollo - 设置授权标头

如何使用 apollo-server 进行缓存

Apollo Server + Next.js - GraphQL Schema 未更新

使用 subscriptions-transport-ws 设置 Apollo 服务器?