NextAuth+NextJS:Middleware中getToken始终返回null问题求助
问题分析
你遇到的核心问题是:NextAuth的middleware中token始终返回null,但Cookie中的JWT解码正常,且已配置NEXTAUTH_SECRET。根源在于JWT密钥配置不一致,以及自定义encode函数可能丢失NextAuth所需的默认字段,导致middleware无法正确验证token。
解决方案
1. 统一JWT密钥配置
NextAuth的middleware默认读取NEXTAUTH_SECRET环境变量,但你代码中jwt.secret使用的是process.env.SECRET,导致验证token时密钥不匹配。修改src/page/api/auth/[...nextauth].ts中的jwt配置:
jwt: { maxAge: 60 * 60 * 24 * 14, secret: process.env.NEXTAUTH_SECRET, // 替换为NEXTAUTH_SECRET,和环境变量保持一致 encode: encode, decode: decode, },
2. 完善自定义Encode函数
你的encode函数只保留了自定义字段,丢失了NextAuth JWT默认的iat(签发时间)、exp(过期时间)等字段,可能影响middleware解析。修改函数保留原token的所有字段:
export const encode = async (data: any) => { const { secret, token } = data; // 保留原token的默认字段,再覆盖自定义字段 const payload = { ...token, username: token.username, email: token.email, _id: token._id, }; const accessToken = jwt.sign(payload, secret, { expiresIn: '1209600s', algorithm: 'HS512', }); return accessToken; };
3. 在Middleware中复用Auth配置(可选但推荐)
在src/middleware.ts中导入authOptions,复用其中的密钥配置,确保和NextAuth核心配置一致:
import { authOptions } from "./pages/api/auth/[...nextauth]"; export default withAuth(function middleware(req: NextRequest) {}, { callbacks: { authorized: function ({ token }) { console.log(token); return true; }, }, secret: authOptions.jwt?.secret, // 复用authOptions中的密钥 });
4. 验证环境变量
确认.env.local中的NEXTAUTH_SECRET配置正确,无拼写错误:
NEXTAUTH_SECRET=your-secure-secret-key-here
验证步骤
- 重启Next.js开发服务器,确保环境变量生效。
- 重新登录生成新的JWT token。
- 访问受保护路由(如
/chat),查看控制台输出的token是否正常。
内容的提问来源于stack exchange,提问作者Nguyễn Phúc Thịnh
相关产品推荐
相关产品推荐

