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

如何借助Next-Auth的JWT保护独立Express服务器?

解决方案思路

一、客户端直接获取完整JWT并携带

Next-Auth在客户端提供的getToken({ raw: true })方法可以直接返回原始JWT字符串,而非解析后的对象。你可以在发起Express请求时,将这个原始令牌放在Authorization请求头中传递。

示例代码:

// 客户端组件/页面中调用Express接口
import { getToken } from "next-auth/jwt";

async function fetchExpressData() {
  const rawToken = await getToken({ raw: true });
  const response = await fetch("http://你的Express服务器地址/api/目标接口", {
    headers: {
      Authorization: `Bearer ${rawToken}`
    }
  });
  return await response.json();
}

二、Next.js服务端路由中转请求时提取JWT

如果请求是从Next.js的服务端路由(如pages/api/xxx.js)发起的,可以直接读取Next-Auth默认的session cookie——next-auth.session-token,其值就是原始JWT字符串。

示例代码:

// Next.js服务端API路由
export default async function handler(req, res) {
  const rawToken = req.cookies["next-auth.session-token"];
  if (!rawToken) {
    return res.status(401).json({ error: "未授权" });
  }

  const expressRes = await fetch("http://你的Express服务器地址/api/目标接口", {
    headers: {
      Authorization: `Bearer ${rawToken}`
    }
  });

  const data = await expressRes.json();
  res.status(200).json(data);
}

三、Express服务器端验证JWT

在Express中使用jsonwebtoken库验证令牌,确保密钥和Next-Auth配置中的secret完全一致。

示例代码:

// Express服务器验证中间件
const jwt = require("jsonwebtoken");
const NEXT_AUTH_SECRET = "你的Next-Auth密钥"; // 与Next-Auth配置的secret保持一致

function authMiddleware(req, res, next) {
  const authHeader = req.headers.authorization;
  const token = authHeader?.split(" ")[1];

  if (!token) return res.sendStatus(401);

  jwt.verify(token, NEXT_AUTH_SECRET, (err, decoded) => {
    if (err) return res.sendStatus(403);
    req.user = decoded;
    next();
  });
}

// 受保护的Express路由
app.get("/api/目标接口", authMiddleware, (req, res) => {
  res.json({ data: "受保护数据", user: req.user });
});

四、自定义Next-Auth回调保留原始JWT(可选)

如果需要在Next.js服务端其他场景获取原始JWT,可以在Next-Auth的回调中把原始令牌附加到session对象里,后续调用getSession即可获取。

示例代码:

// [...nextauth].js
export default NextAuth({
  providers: [...],
  session: { strategy: "jwt" },
  callbacks: {
    async session({ session, token }) {
      session.rawToken = token.raw;
      return session;
    },
    async jwt({ token, account }) {
      // 登录时保存原始令牌(OAuth场景下account.accessToken即为原始JWT)
      if (account?.accessToken) {
        token.raw = account.accessToken;
      }
      return token;
    }
  },
  secret: "你的Next-Auth密钥"
});

内容的提问来源于stack exchange,提问作者Chris Scott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:18:30