在 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返回名字
对于任何遇到此问题的人,我通过返回授权配置文件来解决它
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;
},
```