NextAuth Session回调在Vercel未触发,本地运行正常求助
NextAuth Google登录在Vercel部署后Session为空的问题
本地环境中Google登录功能完全正常,但部署到Vercel后,成功登录Google后Session始终为空{}。查看Vercel日志发现,session回调在Vercel上从未执行(本地运行时正常执行)。
相关代码
[...nextauth].js
export const authOptions = { providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], secret: process.env.NEXTAUTH_SECRET, jwt: { secret: process.env.NEXTAUTH_SECRET, encryption: true, }, debug: true, session: { strategy: "jwt", maxAge: 30 * 24 * 60 * 60, }, callbacks: { async jwt({ token, user, account }) { if (account) { const googleIdToken = account.id_token; const res = await reqGoogleTokenSignIn(null, googleIdToken); const member = res?.data?.data; if (member == null) { console.log( "nextauth.js jwt reqGoogleTokenSignIn: Failed response from be" ); return false; } console.log( "nextauth.js jwt reqGoogleTokenSignIn: Received response from be. authToken: " + member.authToken ); let newToken = {}; newToken.userId = member.id; newToken.authToken = member.authToken; newToken.profilePictureUrl = member.profilePictureUrl; newToken.fullName = member.fullName; newToken.emailAddress = member.emailAddress; newToken.phoneNumber = member.phoneNumber; console.log("nextauth.js jwt: setting token's userId and authToken"); return newToken; } return token; }, async session({ session, token }) { console.log( "nextauth.js session: setting session's userId and authToken" ); session.userId = token?.userId; session.authToken = token?.authToken; session.profilePictureUrl = token?.profilePictureUrl; session.fullName = token?.fullName; session.emailAddress = token?.emailAddress; session.phoneNumber = token?.phoneNumber; return session; }, }, }; export default NextAuth(authOptions);
LoginBtn.js
function LoginBtn({ provider }) { const { data: session, status } = useSession(); const [loggedIn, setLoggedIn] = useState(null); let loginButton = ( <ImageContainer> <OptimizedImage onClick={() => signIn("google", { callbackUrl: "/members/profile" })} priority={true} src="/assets/google-login.png" alt={"Login with Google"} height={32} width={82} /> </ImageContainer> ); let profileButton = ( <ImageContainer> <Link prefetch={false} href="/members/profile" legacyBehavior> <OptimizedImage priority={true} src={session?.profilePictureUrl} alt={session?.emailAddress + " profile image"} height={25} width={25} /> </Link> </ImageContainer> ); useEffect(() => { if (session == null && status === "loading") { return; } else if (session == null && status === "unauthenticated") { setLoggedIn(false); return; } else if (session != null && status === "authenticated") { setLoggedIn(true); return; } }, [session, status]); return loggedIn == null ? null : loggedIn ? profileButton : loginButton; } export default LoginBtn;
Vercel日志内容
nextauth.js jwt reqGoogleTokenSignIn: Received response from be. authToken: Lcoury0Lfl5MRHfRVs6GY280H144=
nextauth.js jwt: setting token's userId and authToken
日志中缺少session回调的打印内容,且无任何报错,该日志在本地运行时会正常打印。
已尝试的操作
- 在Vercel环境变量中添加
NEXTAUTH_SECRET - 添加过
NEXTAUTH_URL(无效果后移除,因文档说明非必需) - 启用NextAuth调试模式以查看日志
问题
本地与Vercel部署环境之间可能存在哪些差异?
内容的提问来源于stack exchange,提问作者Toko Game
相关产品推荐
相关产品推荐

