You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证步骤

  1. 重启Next.js开发服务器,确保环境变量生效。
  2. 重新登录生成新的JWT token。
  3. 访问受保护路由(如/chat),查看控制台输出的token是否正常。

内容的提问来源于stack exchange,提问作者Nguyễn Phúc Thịnh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:33:25