Next.js Middleware中Supabase auth.getUser()返回null问题求助
问题原因及解决办法
核心问题:Next.js的Middleware运行在Edge Runtime(服务器端环境),根本无法访问浏览器的localStorage——这是浏览器专属的存储API,服务器侧代码拿不到里面的数据,所以你调用auth.getUser()或Auth.getSession()返回null是必然的。
下面是具体解决步骤:
- 改用Cookie存储会话:绝大多数Auth库(比如NextAuth.js)默认用Cookie存储会话信息,因为服务器端可以读取请求头里的Cookie。检查你的Auth配置,确保会话存储策略是Cookie而非localStorage。以NextAuth.js为例,配置示例:
export const authOptions = { session: { strategy: "jwt", // JWT策略会把会话存在Cookie里 }, // 其他提供商、回调函数配置... };
确保请求自动携带Cookie:浏览器在发送同域请求时会自动携带Cookie,无需额外配置;如果是跨域请求,要确保请求配置了
credentials: include。用正确的方式在Middleware里获取会话:如果用NextAuth.js,直接使用官方提供的
auth中间件函数获取会话,示例:
import { auth } from "@/auth"; export default auth((req) => { const session = req.auth; if (!session) { // 处理未登录逻辑,比如重定向到登录页 return Response.redirect(new URL("/login", req.url)); } });
排查Auth初始化配置:检查你的Auth路由(比如
app/api/auth/[...nextauth]/route.js)是否正确配置了提供商、会话策略,确保用户登录后,令牌和用户信息被正确写入Cookie。清理旧的localStorage数据:之前存在localStorage的会话数据已经没用了,建议手动清除,避免后续混淆。
内容的提问来源于stack exchange,提问作者Diego Beristain de la Mora
相关产品推荐
相关产品推荐

