Fel*_*ipe 11 authentication session jwt next.js next-auth
我在将令牌传递给会话回调时遇到一些困难。我的最终目标是将登录用户的数据发送到客户端。最初我只是发回用户的电子邮件,但现在我想将用户的用户名和姓名与电子邮件一起发送。通过遵循文档,我们必须传递 JWT 和 Session 回调,以便我们的开发人员能够访问令牌中的更多数据。目前,在我的 JWT 回调中,我能够记录用户数据,非常棒。然而,当我尝试在会话回调中记录数据时,我得到一个空的 {}。非常感谢任何提示。先感谢您。
import NextAuth from "next-auth/next";
import CredentialsProvider from "next-auth/providers/credentials";
// Helper Functions
import {
connectToDatabase,
comparePasswords,
} from "../../helper/HelperFunctions";
export default NextAuth({
session: { jwt: true },
providers: [
CredentialsProvider({
async authorize(credentials) {
const client = await connectToDatabase();
const userCollection = client.db().collection("users");
const user = await userCollection.findOne({
email: credentials.email,
});
// const userInfo = {
// firstName: user.firstName,
// lastName: user.lastName,
// email: user.email,
// userName: user.userName,
// };
// console.log(userInfo);
if (!user) {
client.close();
throw new Error("No user found!");
}
const isValid = await comparePasswords(
credentials.password,
user.password
);
if (!isValid) {
client.close();
throw new Error("Invalid password");
}
client.close();
if (user) {
return {
user,
};
} else {
return null;
}
},
}),
],
callbacks: {
async jwt({ token, user }) {
// Persist the OAuth access_token to the token right after signin
if (user) {
token = user;
console.log(token);
// all of the user data is being logged, yet how to pass it down to session callback so i can use all the user data in the client?
}
return token;
},
},
async session({ session, token, user }) {
session.user = token;
console.log(session.user);
// nothing gets logged into the terminal?? WTF
return session;
},
});
Run Code Online (Sandbox Code Playgroud)
因为您正在使用:
import CredentialsProvider from "next-auth/providers/credentials";
Run Code Online (Sandbox Code Playgroud)
那是 next-auth v4。在新版本的 next-auth 中,此代码不再有效:
session: { jwt: true },
Run Code Online (Sandbox Code Playgroud)
相反,你应该使用
session: {
strategy: "jwt",
},
Run Code Online (Sandbox Code Playgroud)
然后在jwt回调中
// jwt callback is only called when token is created
async jwt({ token, user }) {
if (user) {
token = user;
// token = user;
token.user=user
}
return Promise.resolve(token);
},
Run Code Online (Sandbox Code Playgroud)
然后在session回调中:
session: async ({ session, token }) => {
// session callback is called whenever a session for that particular user is checked
// in above function we created token.user=user
session.user = token.user;
// you might return this in new version
return Promise.resolve(session)
},
Run Code Online (Sandbox Code Playgroud)