Google登录后在NextAuth中向会话传递更多自定义数据
在NextAuth Google登录后扩展会话,添加数据库用户信息
要实现认证通过后调用fetchUserInfo并将数据库用户信息存入会话,你需要利用NextAuth的jwt和session回调来扩展默认的会话数据,具体步骤如下:
- 确保
fetchUserInfo是异步函数(数据库查询通常是异步操作):
const fetchUserInfo = async (email) => { // 替换为实际的数据库查询逻辑,比如: // return await prisma.user.findUnique({ where: { email } }); };
- 在NextAuth配置中添加
jwt和session回调,将数据库用户信息存入JWT并同步到会话:
import NextAuth from 'next-auth' import Providers from 'next-auth/providers' const fetchUserInfo = async (email) => { // Get user info in database by google email }; export default NextAuth({ providers: [ Providers.Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET, }), ], callbacks: { async signIn(user, account, profile) { if (account.provider === 'google' && profile.verified_email === true && profile.email.endsWith('@example.com')) { return true } else { return false } }, // 在JWT生成/更新时获取数据库用户信息 async jwt({ token, user }) { // 首次登录时user对象存在,此时查询数据库 if (user) { token.dbUser = await fetchUserInfo(user.email); } return token; }, // 将JWT中的自定义数据同步到会话 async session({ session, token }) { // 把数据库用户信息添加到会话的user对象中 session.user.dbUser = token.dbUser; return session; }, }, pages: { signIn: '/auth/signin', }, secret: process.env.SECRET })
逻辑说明
- jwt回调:用户首次登录成功后,会触发该回调,此时通过
user.email调用fetchUserInfo获取数据库中的用户信息,并将其存入JWT token。后续会话验证时,token会被复用,无需重复查询(若需要定期刷新数据,可在此添加额外逻辑)。 - session回调:每次前端通过
useSession或getSession获取会话信息时,该回调会把JWT中的自定义数据库用户信息同步到session.user中,这样前端就能直接使用这些数据。
内容的提问来源于stack exchange,提问作者Phạm Hoài Lâm
相关产品推荐
相关产品推荐

