Next.js NextAuth:从两个不同的模式(父级和子级)获取会话 ID,父级使用 google 提供程序,子级使用凭据进行登录

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

在 Next.js 应用程序中使用 NextAuth 来处理身份验证时,在登录期间根据用户类型(父母或孩子)正确分配会话 ID 时会出现问题。该应用程序有两种类型的用户:父母和孩子。家长可以将孩子添加到他们的帐户,孩子可以使用用户名和密码登录。当孩子登录时,返回的是家长 ID 而不是孩子,

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;
      }
    },
  },

我尝试了一些操作,我得到了孩子们的ID,但孩子们的会话没有从session.user返回名字

next.js backend next.js13 next-auth web-development-server
1个回答
0
投票

对于任何遇到此问题的人,我通过返回授权配置文件来解决它

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;
      },
    ```
© www.soinside.com 2019 - 2024. All rights reserved.