Personalizar los objetos de sesión a través de devoluciones de llamada en next-auth.
Estoy usando “next”: “^11.0.1”, “next-auth”: “^3.27.3”. Necesito personalizar mi objeto de sesión proporcionado por los hooks para acceder a la información del usuario en el lado del cliente. Este es mi código de devolución de llamada:
callbacks: {
async jwt (token, user) {
console.log(user)
if (user){
token = { ...token, username: user?.user, password: user?.password }
return token
}
else {
return token
}
},
async session( session, token) {
// Enviar propiedades al cliente, como un access_token de un proveedor.
console.log("session: ", session)
console.log("token pasado:", token)
return session
},
},
Este es mi app:
const SeatingPage: NextPage = () => {
const [session, loading] = useSession()
useEffect(() => {
if (loading) return
if (!session) signIn()
}, [session, loading])
if (!session) return <p>cargando</p>
return <p>Hola mundo</p>
}
Si lo entiendo bien, el parámetro token en jwt()
es lo que retorno en mi authorize()
. La aplicación ejecuta jwt()
dos veces por alguna razón. Sin embargo, solo en la primera llamada, token tiene el valor correcto siendo {user: “xyz”, password: “xyz”}, la segunda vez, token es un objeto vacío. Y session()
nunca recibe el parámetro correcto { …token, username: user?.user, password: user?.password }, sino siempre el token base.
davy.ai
Para personalizar el objeto de sesión proporcionado por los hooks para acceder a la información del usuario en el lado del cliente utilizando
next-auth
, puedes modificar el objetocallbacks
. Específicamente, puedes modificar los métodosjwt()
ysession()
para que devuelvan el objeto de token y sesión deseados, respectivamente.En el código proporcionado, el método
jwt()
modifica el objetotoken
agregando las propiedadesusername
ypassword
en función del objetouser
que se pasa como argumento. Sin embargo, la condición para modificar el token es queuser
sea verdadero. Esto significa que si se vuelve a llamar ajwt()
yuser
es falso (por ejemplo,null
,undefined
,false
, etc.), el token no se modificará.Para solucionar esto y asegurarse de que el token siempre se modifique con las propiedades
username
ypassword
, puedes modificarjwt()
para que siempre modifique el objeto de token, incluso siuser
es falso:Además, para asegurarse de que el método
session()
reciba el token modificado con las propiedadesusername
ypassword
, puedes modificarlo para que devuelva el objetotoken
modificado en lugar del objetosession
:Al hacer esto, el gancho
useSession()
recibirá el objeto de token actualizado con las propiedadesusername
ypassword
y podrás acceder a ellas en el lado del cliente.