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

在NextAuth的signIn回调中能否访问req参数以记录用户IP?

在NextAuth的signIn回调中访问req参数并记录登录IP

核心结论

可以在signIn回调中访问req参数,但需通过NextAuth v4+提供的context参数获取;另外signIn回调执行时session尚未创建,无法直接访问session,这是正常流程。

实现方法

1. 通过signIn回调的context参数获取req

在NextAuth v4及以上版本中,signIn回调支持第二个参数context,其中包含当前请求的req和res对象,直接用它就能获取用户IP:

export default async function auth(req: NextApiRequest, res: NextApiResponse) {
  // 封装IP获取逻辑,适配反向代理场景
  const getClientIp = (request: NextApiRequest) => {
    const forwarded = request.headers['x-forwarded-for'];
    if (forwarded) {
      return Array.isArray(forwarded) ? forwarded[0] : forwarded.split(',')[0].trim();
    }
    return request.socket.remoteAddress;
  };

  return await NextAuth(req, res, {
    // 其他配置(如providers、secret等)
    callbacks: {
      async signIn({ user, account, profile, email, credentials }, context) {
        const ip = getClientIp(context.req);
        // 记录登录IP(可替换为写入数据库、日志系统等操作)
        console.log(`用户登录尝试:邮箱=${user?.email},IP=${ip}`);

        // 你的登录验证逻辑
        const isAllowedToSignIn = true;
        if (isAllowedToSignIn) {
          return true;
        } else {
          return false;
          // 或返回重定向URL:return '/unauthorized'
        }
      },
      // 若需在session中携带IP,保留session回调
      async session({ session }) {
        session.ip = getClientIp(req);
        return session;
      }
    }
  });
}

2. 关键注意点

  • 反向代理适配:如果部署在Vercel、Nginx等反向代理后,req.socket.remoteAddress会返回代理服务器IP,必须通过x-forwarded-for请求头获取真实用户IP,上述代码已包含该处理逻辑。
  • session访问限制:signIn回调在session创建前触发,因此无法直接访问session。若需将IP关联到session,需在session回调中补充处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:10:27