When using NextAuth in a Next.js application to handle authentication, there's a problem with assigning the session ID correctly based on the user type (parent or kid) during login. The application has two types of users: parents and kids. Parents can add kids to their account, and kids can log in with a username and password. when a kid log in, the parent id is returned instead of the kids,

async session({ session, user }) {
    console.log("sessions start", user);
    try {
        await connectToDB(); 

        let query = {};
        if (session.user?.email) {
            query = { email: session.user.email };
        } else if (session.user?.name) {
            query = { username: session.user.name };
            console.log(query, "query 2");
        }

        const parentUser = await User.findOne(query);
        const kidUser = await Kids.findOne(query);

        if (parentUser) {
            session.user.id = parentUser._id.toString();
        } else if (kidUser) {
            session.user.id = kidUser._id.toString();
        }

        return session;
    } catch (error) {
        console.error("Error retrieving session:", error);
        throw error;
    }
},

async signIn({ profile }: { profile: ProfileType }) {
    try {
        await connectToDB(); // Connect to the database
        const userExist = await User.findOne({
            email: profile?.email,
        });

        if (!userExist) {
            await User.create({
                email: profile?.email,
                username: profile?.name?.replace(" ", " ").toLowerCase(),
                image: profile?.picture,
                points: 0,
                completedTasks: [],
                ongoingTasks: [],
                kids: [],
            });
        }

        return true;
    } catch (error) {
        console.error("Error signing in:", error);
        throw error;
    }
},

i tried some manipulations and i got the kids id but the kids sessioon doesnt return the name, from the session.user

1

There are 1 best solutions below

0
winos On BEST ANSWER

for any one having this issue, i solved it by returning the profile on authorize

async authorize(credentials) {
        // console.log(credentials, "credentials");
        try {
          if (!credentials || !credentials.username || !credentials.password) {
            // Return null if required credentials are missing
            return null;
          }
          const foundKid = await Kids.findOne({
            username: credentials.username,
          })
            .lean()
            .exec();
          // console.log(foundUser, "found user");

          if (foundKid) {
            const match = await bcrypt.compare(
              credentials?.password,
              foundKid.password
            );
            if (match) {
             
              return {
                id: foundKid._id,
                name: foundKid.username,
              
              };
            }
          }
        } catch (error) {
          console.log(error);
        }
        return null;
      },
    ```