如何读取 [...nextauth] signIn() 回调中的附加参数?

mat*_*tic 6 javascript jwt reactjs next.js next-auth

根据Next Auth 文档,我可以/authorize通过 的第三个参数将其他参数传递到端点signIn()

他们展示了两个例子:

signIn("identity-server4", null, { prompt: "login" }) // always ask the user to re-authenticate
signIn("auth0", null, { login_hint: "info@example.com" }) // hints the e-mail address to the provider
Run Code Online (Sandbox Code Playgroud)

但是,没有完整的工作示例,我无法读取我在/api/auth/[...nextauth].js. 任何人都可以告诉我如何读取这些附加参数,例如signIn() callback?

这是一个简单的例子来说明我的意思:

/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"}) // <- MY ADDITIONAL 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>
    )
}
Run Code Online (Sandbox Code Playgroud)

/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
      }
    },
})
Run Code Online (Sandbox Code Playgroud)

回调输出结果signIn()

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的附加参数{addedParam: "My added parameter"}没有显示在任何对象中。如何读取这个添加的参数/api/auth/[...nextauth].js

And*_*dez -2

我很确定addedParam 必须与email 和callbackUrl 位于同一对象中:

const submitUser = async (e) => {
  e.preventDefault()
  signIn('email', { 
    email, 
    callbackUrl: '/dashboard', 
    redirect: false, 
    addedParam: "My added parameter" 
  })
}

Run Code Online (Sandbox Code Playgroud)