如何在Encore.ts的认证网关中清除已过期的会话Cookie
我有一个使用cookie基于会话认证的Encore.ts应用。当认证处理程序确定会话令牌已过期时,我希望从客户端浏览器中移除会话cookie,这样他们在每次请求时就不会继续发送无效的cookie。
是否可以直接在Encore API网关的认证处理程序中清除cookie?
解决方案
你不能直接从认证处理程序修改HTTP响应(包括设置cookie)——认证处理程序只返回认证数据或抛出错误。不过,你可以使用 中间件(middleware) 来实现。
创建一个在端点处理程序之后运行的中间件,检查请求是否已通过身份验证。如果 getAuthData() 返回 null,就设置一个 Set-Cookie 头部,使会话cookie失效:
import { middleware } from "encore.dev/api";
import { getAuthData } from "~encore/auth";
export const clearSessionCookie = middleware(async (req, next) => {
const resp = await next(req);
const authData = getAuthData();
if (authData === null) {
resp.header.set(
"Set-Cookie",
"session=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax",
);
}
return resp;
});
此中间件将对未设置 auth: true 的端点运行(因为未认证的请求仍可能访问这些端点)。对于需要认证的端点,请在客户端处理会话续期或注销,例如,通过调用专用的注销端点。
在你的服务定义中注册该中间件:
import { Service } from "encore.dev/service";
export default new Service("myService", {
middlewares: [clearSessionCookie],
});
相关文档:
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。