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

如何在NextAuth的[...nextauth] signIn()回调中读取额外参数?

如何在NextAuth的signIn回调中读取signIn()传递的额外参数

问题背景

根据NextAuth文档,signIn()的第三个参数可向/authorize端点传递额外参数,但缺少完整可运行示例,导致无法在/api/auth/[...nextauth].js的signIn回调中读取这些参数。

示例代码

/index.jsx

import { useState } from "react"
import { signIn } from "next-auth/react"

export default function EmailLink() {
    const [email, setEmail] = useState('')

    const submitUser = (e) => {
        e.preventDefault()
        signIn('email', 
            {email, callbackUrl: '/dashboard', redirect: false}, 
            {addedParam: "My added parameter"}) // 传递的额外参数
        }

    return (
        <form onSubmit={submitUser}>
            Email: <input type='email' placeholder="Enter email" value={email} onChange={(e) => setEmail(e.target.value)} />
            <button type="submit">Email Link</button>
        </form>
    )
}

/api/auth/[...nextauth].js(原代码)

import NextAuth from "next-auth"
import EmailProvider from "next-auth/providers/email"

export default NextAuth({
  providers: [
    EmailProvider({
      server: {
        host: process.env.EMAIL_SERVER_HOST,
        port: process.env.EMAIL_SERVER_PORT,
        auth: {
          user: process.env.EMAIL_SERVER_USER,
          pass: process.env.EMAIL_SERVER_PASSWORD,
        }
      },
      from: process.env.EMAIL_FROM,
    }),
  ],
  callbacks: {
    async signIn(user, account, profile, email, credentials) {
      const loginProvider = user.account.provider
      if (loginProvider === "email") { 
        console.log("User:", user)
        console.log("Account:", account)
        console.log("Profile:", profile)
        console.log("Email:", email)
        console.log("Credentials:", credentials)
        return user
      }
    },
})

原输出结果

User: {
  user: { email: 'user@domain.com', id: 'user@domain.com' },
  account: {
    providerAccountId: 'user@domain.com',
    userId: 'user@domain.com',
    type: 'email',
    provider: 'email'
  },
  email: { verificationRequest: true }
}
Account undefined
Profile undefined
Email undefined
Credentials undefined

可见额外参数addedParam未出现在任何输出对象中。


解决方案

1. 修正signIn回调的参数结构

NextAuth v4版本中,signIn回调接收单个对象参数,而非分散的参数列表。你需要解构该对象以获取req(请求对象),这是读取额外参数的关键。

2. 通过req.query获取额外参数

调用signIn()时传递的第三个参数会被转换为URL查询参数,附加到授权请求中。因此可以直接通过req.query读取这些参数。

修改后的完整代码

/api/auth/[...nextauth].js

import NextAuth from "next-auth"
import EmailProvider from "next-auth/providers/email"

export default NextAuth({
  providers: [
    EmailProvider({
      server: {
        host: process.env.EMAIL_SERVER_HOST,
        port: process.env.EMAIL_SERVER_PORT,
        auth: {
          user: process.env.EMAIL_SERVER_USER,
          pass: process.env.EMAIL_SERVER_PASSWORD,
        }
      },
      from: process.env.EMAIL_FROM,
      // 可选:也可在EmailProvider的authorize函数中获取参数
      async authorize(credentials, req) {
        console.log("authorize中的额外参数:", req.query.addedParam);
        return { email: credentials.email };
      }
    }),
  ],
  callbacks: {
    async signIn({ user, account, profile, email, credentials, req }) {
      const loginProvider = account.provider;
      if (loginProvider === "email") { 
        console.log("signIn回调中的额外参数:", req.query.addedParam); // 成功获取参数
        console.log("User:", user);
        return true;
      }
      return true;
    },
  }
})

关键说明

  • 额外参数会以URL查询参数的形式发送(例如请求地址为/api/auth/signin/email?addedParam=My+added+parameter),因此req.query.addedParam可直接获取对应值。
  • 确保使用NextAuth v4版本,v3版本的参数结构和获取方式存在差异。
  • 若需传递敏感信息,不建议通过URL查询参数传递,可考虑将参数放入signIn()的第二个参数(credentials对象)中,并在后续处理中做好安全验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:10:29