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.

Obtener el ID de usuario de la sesión en el cliente de next-auth.

Estoy utilizando next-auth con Prisma y Graphql, seguí estas instrucciones para configurar el adaptador y mis modelos adecuadamente:
https://next-auth.js.org/adapters/prisma
La autenticación funciona, pero cuando inspecciono el objeto de sesión desde aquí:
const { data: session, status } = useSession()
No veo el ID
enter image description here

La razón por la que necesito el ID es para realizar consultas adicionales en GraphQL. Por ahora, estoy utilizando el valor del correo electrónico para buscar al Usuario por correo electrónico, pero tener el ID disponible sería una mejor opción.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Posible solución:

    El hook useSession de Next-Auth devuelve un objeto con varias propiedades, incluyendo user, que contiene un objeto con los datos del usuario, pero típicamente no incluye el campo de ID, que normalmente es generado por la base de datos o por código del lado del servidor.

    Para obtener el ID del usuario, puedes modificar el archivo pages/api/auth/[...nextauth].js que maneja el flujo de autenticación, y agregar una función personalizada jwt que agregue el ID de usuario al token JWT que Next-Auth genera para cada sesión autenticada.

    Aquí tienes un ejemplo de cómo hacerlo con Prisma:

    // pages/api/auth/[...nextauth].js
    
    import NextAuth from "next-auth"
    import Providers from "next-auth/providers"
    import { PrismaClient } from "@prisma/client"
    
    const prisma = new PrismaClient()
    
    export default NextAuth({
      providers: [
        // ...
      ],
      adapter: {
        async createUser(user) {
          return await prisma.user.create({ data: user })
        },
        async getUser(id) {
          return await prisma.user.findUnique({ where: { id } })
        },
      },
      callbacks: {
        async jwt(token, user, account, profile, isNewUser) {
          if (user) {
            token.sub = user.id // agregar ID de usuario al token
          }
          return token
        },
        async session(session, user) {
          session.user = user // agregar objeto de usuario a la sesión
          return session
        },
      },
    })
    

    Con este código, cuando un usuario se autentica correctamente, su ID se agregará al token JWT almacenado en la cookie de sesión.

    Luego, en tu API de GraphQL, puedes decodificar el token JWT y extraer el ID para consultar el objeto de usuario en la base de datos:

    // pages/api/graphql.js
    
    import jwt from "jsonwebtoken"
    import { PrismaClient } from "@prisma/client"
    
    const prisma = new PrismaClient()
    
    export default async function handler(req, res) {
      const token = req.cookies["__Secure-next-auth.session-token"]
      if (!token) {
        res.status(401).json({ message: "No autorizado" })
        return
      }
      const decoded = jwt.verify(token, process.env.JWT_SECRET)
      const user = await prisma.user.findUnique({
        where: { id: decoded.sub },
      })
      // usar user.id en consultas posteriores
      // ...
    }
    

    Ten en cuenta que este ejemplo asume que estás utilizando tokens JWT para las sesiones y que has configurado la variable de entorno JWT_SECRET en tu archivo .env.local o de alguna otra manera. Además, asegúrate de asegurar tus cookies adecuadamente para evitar ataques como CSRF o XSS.

Comments are closed.