问题描述
我最近刚从使用 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 here 和 here 的说明。