如何借助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
相关产品推荐
相关产品推荐

