如何使用 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-Server,如何与 SailsJS 一起使用?