我正在尝试实现用户重新激活功能。除了我的
nextauth
会话之外,一切都正常。
对数据库的 API 调用正在运行,已确认字段
isDeactivated:true
正在从用户帐户中删除
但是,删除后,我更新了会话,期望
isDeactivated
重置,但它仍然显示为 true。这就是我更新我的 nextauth
会话的方式:
if(await updateSession(update)){
// change router
}
else{
//console error
}
async function updateSession(update){
return new Promise(async(resolve,reject)=>{
try{
await update()// apply next-auth update
resolve(true)
}
catch(error){
console.log(error)
resolve(false)
}
})
}
我的下一个身份:
async session({ session, user, token }){
// assign the fields in token to session and return, e.g. if(token.isDeactivated) session.user.isDeactivated=token.isDeactivated
return session
},
async jwt({ token, user, account, trigger }){
// the if account checking the account.provider exist
if(account?.provider){
if((await CheckIfUserDeactivated_controller(user.id))===true) token.isDeactivated=true
}
if(account?.provider==='credentials'){
// navigate DB to retrieve userid, name etc
}
else if(account?.provider==="google" || account?.provider==="amazon"){
// navigate DB to retrieve userid, name etc
}
}
这适用于登录。但由于某种原因,它不适用于更新。在更新会话之前,我可以确认用户文档正在被修改(即
isDeactivated
字段正在被删除)。但直到我注销并重新登录系统后,实际会话才会更新。知道如何解决这个问题吗?
在您的 jwt 回调中,添加 if 语句并且不要忘记返回令牌
async jwt({ token, user, account, trigger, session }) {
//...
if (trigger == "update") {
if (session?.user?.isDeactivated) {
token.isDeactivated = session.user.isDeactivated
}
}
return token
}
您应该在 next-auth.d.ts 文件中扩展默认用户界面
import { DefaultSession } from "next-auth"
declare module "next-auth" {
interface User {
id: string
//...
isDeactivated?: boolean | null
//...
}
interface Session {
user: User & DefaultSession["user"]
expires: string
error: string
}
}
现在在页面中调用更新方法,如下所示
import { auth, unstable_update } from "auth" // your auth.ts file
const Page = async ({ params }: { params: { slug: string } }) => {
const session = await auth()
const user = session?.user
//...
const handleUpdate = async (isDeactivated: boolean): Promise<Session | null> => {
if (user) {
try {
return await unstable_update({
user: {
...user,
isDeactivated,
}
})
} catch (error) {
console.log("error", error)
}
}
}
return (
<>
{/*Your JSX*/}
</>
)
}