非主机设备无法通过Discord OAuth(Auth.js)登录的问题排查
问题分析
报错invalid_grant: Invalid "redirect_uri" in request的核心原因是:Auth.js(原NextAuth.js)在开发环境默认使用localhost作为生成回调URL的基础地址,当你通过主机IP访问应用时,应用内部向Discord发起授权请求时携带的redirect_uri仍然是http://localhost:3000/api/auth/callback/discord,这和你在Discord后台配置的IP地址版重定向URI不匹配,导致Discord验证失败。
解决步骤
设置
NEXTAUTH_URL环境变量
在项目根目录的.env.local(或.env)文件中添加:NEXTAUTH_URL=http://[你的主机IP]:3000替换
[你的主机IP]为实际的主机局域网IP(比如192.168.1.100)。这个配置会强制Auth.js使用指定的IP地址生成回调URL,和Discord后台的配置保持一致。确认Discord后台的重定向URI配置
登录Discord开发者平台,进入你的应用→OAuth2→Redirects,确保已添加:http://[你的主机IP]:3000/api/auth/callback/discord检查端口、路径是否完全正确,注意开发环境使用
http而非https。重启开发服务器
修改环境变量后,必须重启Next.js开发服务器,确保新的配置生效。验证测试
用主机IP地址访问应用,再次尝试Discord登录流程,确认授权后能正常回调并完成登录。
补充说明
当你用localhost访问时正常,是因为Auth.js默认的NEXTAUTH_URL就是http://localhost:3000,而你大概率已经在Discord后台配置了这个地址的重定向URI,所以匹配成功。
内容的提问来源于stack exchange,提问作者BitOfaLegend

