es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 objeto callbacks. Específicamente, puedes modificar los métodos jwt() y session() para que devuelvan el objeto de token y sesión deseados, respectivamente.

    En el código proporcionado, el método jwt() modifica el objeto token agregando las propiedades username y password en función del objeto user que se pasa como argumento. Sin embargo, la condición para modificar el token es que user sea verdadero. Esto significa que si se vuelve a llamar a jwt() y user 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 y password, puedes modificar jwt() para que siempre modifique el objeto de token, incluso si user es falso:

    async jwt (token, user) {
      console.log(user)
      token = { ...token, username: user?.user, password: user?.password }
      return token
    }
    

    Además, para asegurarse de que el método session() reciba el token modificado con las propiedades username y password, puedes modificarlo para que devuelva el objeto token modificado en lugar del objeto session:

    async session( session, token) {
      console.log("session: ", session)
      console.log("token pasado:", token)
      return token
    }
    

    Al hacer esto, el gancho useSession() recibirá el objeto de token actualizado con las propiedades username y password y podrás acceder a ellas en el lado del cliente.

Comments are closed.