更新我的 nextauth 会话未检测到数据库中的更改

问题描述 投票:0回答:1

我正在尝试实现用户重新激活功能。除了我的

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
字段正在被删除)。但直到我注销并重新登录系统后,实际会话才会更新。知道如何解决这个问题吗?

next.js next-auth
1个回答
0
投票

在您的 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*/}
        </>
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.