Next Auth报错:不支持Credentials提供者回调,Lightsail生产环境登录失败
Next.js生产站点登录报错:Next Auth - Error: Callback for provider type credentials not supported
部署在Lightsail上的Next.js生产站点,除登录功能外所有路由正常运行,但登录时触发错误提示:Next Auth - Error: Callback for provider type credentials not supported。
相关代码(auth/[...nextauth]/route.ts):
import NextAuth from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; import axios from 'axios'; const handler = NextAuth({ providers: [ CredentialsProvider({ name: 'Credentials', credentials: { email: {}, password: {}, }, async authorize(credentials, req) { console.log('api url: ', process.env.NEXT_PUBLIC_API_BASE_URL); try { const res = await axios.post( `${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/login`, { email: credentials?.email, password: credentials?.password, } ); return res.data; } catch (err: any) { if ( err?.response?.data && err?.response?.data.errorType === 'emailVerification' ) { throw new Error(JSON.stringify(err?.response?.data)); } else { throw new Error( err?.response?.data?.message || 'unable to login' ); } } }, }), ], pages: { signIn: '/login', }, callbacks: { async jwt({ user, token }: { user: any; token: any }) { if (user) { return { token: user.token, user: user.data }; } else { return { token: token.token, user: token.user }; } }, async session({ session, token }: { session: any; token: any }) { session.user = { ...token.user, accessToken: token.token, }; return session; }, }, }); export { handler as GET, handler as POST };
可能的解决方案:
- 确认NextAuth版本兼容性:确保
next-auth与CredentialsProvider的版本一致,避免版本不兼容导致的回调支持问题。 - 规范authorize函数返回值:
authorize需返回包含用户唯一标识(如id)的对象,或验证失败时返回null。当前直接返回res.data可能不符合NextAuth预期,建议调整:// 假设res.data.data包含用户信息,补充唯一标识字段 return { id: res.data.data.id, ...res.data.data, token: res.data.token }; - 检查登录页面的signIn调用:在自定义登录页
/login中,调用signIn时需明确指定provider为"credentials":await signIn("credentials", { email: emailValue, password: passwordValue, redirect: true }); - 验证生产环境变量:确保Lightsail环境中
NEXT_PUBLIC_API_BASE_URL配置正确,避免axios请求失败引发认证流程异常。 - 调整jwt回调逻辑:当前
jwt回调返回的结构偏离NextAuth标准,建议修改为:async jwt({ user, token }) { if (user) { token.accessToken = user.token; token.user = user.data; } return token; }
内容的提问来源于stack exchange,提问作者Mohsin
相关产品推荐
相关产品推荐

