Next.js使用Next-Auth时后端接收POST请求如何通过cookie验证用户身份
基于Next-Auth实现评论接口身份校验方案
要解决伪造请求的问题,核心逻辑是完全不信任客户端提交的用户身份参数,所有用户标识都从Next-Auth校验后的会话中读取,具体实现步骤如下:
1. 前端请求逻辑调整
- 提交评论的请求体里不要再传
userId参数,这个参数完全由后端从会话中获取,从根源上避免伪造身份的可能 - 前端发起请求前先校验登录状态:客户端组件用
useSession()钩子判断是否登录,服务端组件用getServerSession()获取会话,只有登录状态才允许提交请求
2. 后端接口身份校验
所有涉及用户身份的接口,第一步先做Next-Auth会话校验,未登录直接拒绝请求:
核心规则:忽略请求体中所有和用户身份相关的字段,仅从Next-Auth会话中读取用户ID
App Router 接口示例
// app/api/comments/route.ts import { getServerSession } from "next-auth/next" import { authOptions } from "@/app/api/auth/[...nextauth]/route" // 替换为你项目中authOptions的实际路径 export async function POST(request: Request) { // 优先校验登录状态 const session = await getServerSession(authOptions) if (!session?.user?.id) { return new Response("未授权访问", { status: 401 }) } // 仅从请求体读取业务参数,用户ID从会话取 const { content, postId } = await request.json() const userId = session.user.id // 后续执行参数校验、写入数据库等原有业务逻辑 // ... return Response.json({ success: true }) }
Pages Router 接口示例
// pages/api/comments.ts import { getServerSession } from "next-auth/next" import { authOptions } from "./auth/[...nextauth]" export default async function handler(req, res) { if (req.method !== "POST") { return res.status(405).send("请求方法不允许") } const session = await getServerSession(req, res, authOptions) if (!session?.user?.id) { return res.status(401).send("未授权访问") } const { content, postId } = req.body const userId = session.user.id // 原有业务逻辑 // ... return res.status(200).json({ success: true }) }
3. Next-Auth配置补充
需要在authOptions的回调中配置会话规则,把用户ID存入会话,否则后端无法从会话中读取用户ID:
// 放在authOptions配置项中 callbacks: { async session({ session, token }) { if (session.user) { session.user.id = token.sub as string } return session } }
额外说明
Next-Auth默认使用加密的HttpOnly Cookie存储会话信息,前端JS无法读取或篡改,攻击者哪怕知道其他用户的userId,也无法伪造对应的会话Cookie,完全可以避免伪造请求的风险。
内容的提问来源于stack exchange,提问作者An in real life
相关产品推荐
相关产品推荐

