NextAuth v4.7.0配置NEXTAUTH_SECRET后报FetchError如何解决
问题原因
invalid json response body ... Unexpected token < in JSON at position 0这个报错的本质很简单:NextAuth请求/api/auth/session接口时,预期拿到JSON格式的会话数据,实际拿到的是HTML格式的响应(一般是Next.js返回的500服务端错误页,页面源码以<!DOCTYPE html>开头,第一个字符就是<,JSON解析直接失败)。
报错和你新增secret配置直接相关,是配置冲突+环境变量没配对导致的。
解决步骤
- 第一步先精简NextAuth配置,删掉冗余的JWT配置项
NextAuth v4.7.0版本里,顶层的secret字段会自动给session、JWT加解密用,你额外在jwt块里重复写secret,还开了encryption: true,会导致加密逻辑冲突,接口直接返回500。直接把jwt配置块整个删掉就行,修正后的配置如下:
export default NextAuth({ session: { strategy: "jwt" }, providers: [/* 你原来的credentials等provider配置保持不变 */], secret: process.env.NEXTAUTH_SECRET })
- 第二步核对环境变量配置
- 本地开发环境:在项目根目录新建/修改
.env.local文件,添加NEXTAUTH_SECRET字段,值填一个长度足够的随机字符串就行,可以直接在终端跑openssl rand -hex 32生成,不要留空。 - Vercel生产环境:进入Vercel对应项目的设置页,找到环境变量配置项,添加和本地一致的
NEXTAUTH_SECRET,把Production、Preview、Development三个环境的勾选都打上,保存后重新触发部署。
- 本地开发环境:在项目根目录新建/修改
- 第三步核对NEXTAUTH_URL配置
- 本地开发如果用默认3000端口不需要手动配,要是改了端口就把值改成
http://localhost:你的端口号。 - Vercel部署时会自动注入
NEXTAUTH_URL为当前部署域名,不需要手动填;如果绑定了自定义域名,就手动把NEXTAUTH_URL改成你的自定义域名,格式是https://你的域名,末尾不要加斜杠。
- 本地开发如果用默认3000端口不需要手动配,要是改了端口就把值改成
- 最后清缓存:配置改完重启本地开发服务,部署上线后,把浏览器里本地和线上域名下存的所有NextAuth相关cookie删掉,旧的cookie是用之前的错误加密逻辑生成的,和新配置不兼容也会触发报错。
验证方法
改完之后直接访问你的域名/api/auth/session,如果返回的是JSON内容(未登录状态返回{"user":null,"expires":"xxx"}这类结构都是正常的),就说明接口恢复正常,之前的fetch报错会自动消失。
内容的提问来源于stack exchange,提问作者jeho Ntanda
相关产品推荐
相关产品推荐

