如何在[..nexttauth]signIn()回调中读取附加参数



根据Next Auth文档,我可以通过signIn()的第三个参数向/authorize端点传递额外的参数。

他们展示了两个例子:

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

然而,没有完整的工作示例,我无法读取我在/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>
)
}

/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
}
},
})

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

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

文档中没有非常清楚地解释,但要使用signIn()signOut()的第三个参数中传递的数据,所使用的提供程序需要有一个authorize()回调作为它的第二个参数。

EmailProvider不提供此回调,但像CredentialsProvider这样的提供程序提供了此回调。

文档中的EmailProvider示例:

import EmailProvider from "next-auth/providers/email";
...
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
}),
],

文档中的CredentialsProvider示例(注意传递给authorize()req对象(:

import CredentialsProvider from "next-auth/providers/credentials";
...
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
username: { label: "Username", type: "text", placeholder: "jsmith" },
password: { label: "Password", type: "password" }
},
async authorize(credentials, req) {
// Add logic here to look up the user from the credentials supplied
const user = { id: "1", name: "J Smith", email: "jsmith@example.com" }
if (user) {
// Any object returned will be saved in `user` property of the JWT
return user
} else {
// If you return null then an error will be displayed advising the user to check their details.
return null
// You can also Reject this callback with an Error thus the user will be sent to the error page with the error message as a query parameter
}
}
})
]

目前的问题是,使用额外的params与EmailProvider不兼容。

我很确定addedParam必须与电子邮件和回调Url:位于同一对象中

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

最新更新