Next.js中使用Next-Auth Credentials模式登录返回401错误如何解决
问题原因与修复方案
核心问题1:异步请求未等待返回
你在authorize异步函数中调用axios时没有加await关键字,导致函数不等接口返回结果就直接执行结束,默认返回undefined,NextAuth会直接判定授权失败,返回401状态码。
核心问题2:返回值不符合要求
NextAuth的authorize函数要求授权成功时返回用户信息对象,不是布尔值true,返回true也会被判定为无效凭证。
修正后的代码
修改pages/api/auth/[...nextauth].js中的authorize逻辑如下:
import axios from "axios"; import NextAuth from "next-auth"; import Providers from "next-auth/providers"; export default NextAuth({ session: { jwt: true, }, providers: [ Providers.Credentials({ async authorize(credentials) { try { // 加await等待接口返回 const response = await axios.post("MY_LOGIN_API", { email: credentials.email, password: credentials.password, }); const user = response.data; // 返回用户对象,不要返回true if (user) { return user; } return null; } catch (error) { console.log(error); throw new Error('I will handle this later!'); } }, }), ], });
其他需要检查的配置项
- 确认你已经在项目根目录的
.env.local文件中配置了NEXTAUTH_SECRET环境变量,该值为任意随机字符串,用于JWT签名校验,缺失会导致授权失败 - 确认你的Laravel登录接口在账号密码正确时返回2xx状态码,否则axios会进入catch分支抛出错误,同样会触发401
- 如果你安装的是NextAuth v4版本,需要调整导入和配置语法,你当前的写法仅适配NextAuth v3版本
内容的提问来源于stack exchange,提问作者Lalith Kumar
相关产品推荐
相关产品推荐

