NextJs + BetterAuth:会话令牌为何无法立即过期?
解决BetterAuth会话令牌立即过期的问题
可能的原因与解决步骤
1. 主动调用注销方法
仅通过cookie属性配置无法触发立即过期,BetterAuth需要主动执行会话销毁逻辑。在需要令牌立即失效的场景(比如用户点击注销),调用官方提供的注销API:
import { auth } from './auth'; // 在组件或API路由中调用 await auth.signOut();
该方法会主动清除数据库中的会话记录,并更新客户端cookie,确保令牌立即失效。
2. 调整cookie配置属性
BetterAuth内部会话逻辑可能覆盖了原有配置,尝试修改cookie的过期设置为明确的过去时间:
export const auth = betterAuth({ database: new Database("./sqlite.db"), emailAndPassword: { enabled: true }, plugins: [nextCookies()], advanced: { cookies: { session_token: { attributes: { secure: process.env.NODE_ENV === 'production', // 开发环境建议设为false,避免本地cookie无法生效 httpOnly: true, sameSite: 'Lax' as const, expires: new Date(0), // 直接设为1970年的时间点,强制过期 maxAge: -1, // 负数表示立即过期 }, }, }, }, });
3. 手动清除客户端cookie
如果上述配置仍不生效,可在客户端直接操作清除会话令牌cookie:
// 在客户端组件中执行 document.cookie = 'session_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; secure; HttpOnly; SameSite=Lax';
需确保cookie的属性(path、secure等)与BetterAuth设置的完全一致,否则无法成功清除。
4. 验证数据库会话记录
检查sqlite数据库中的会话表,确认会话记录是否被正确删除。若调用signOut后数据库仍存在对应会话,需排查数据库连接是否正常,或手动删除目标会话条目。
内容的提问来源于stack exchange,提问作者Dreamer64
相关产品推荐
相关产品推荐

