Next-Auth中间件在AWS Amplify环境中无法正常工作
我明白你遇到的这个问题有多头疼——本地不管是开发模式还是生产构建启动都正常,一部署到AWS Amplify就拿不到token,这种环境差异确实很让人抓狂。针对你用Next-Auth v4 Credentials Provider+中间件的场景,我整理了几个大概率能解决问题的方向:
检查AWS Amplify的环境变量配置
确保你在Amplify控制台里完整配置了所有Next-Auth依赖的环境变量,比如NEXTAUTH_SECRET、NEXTAUTH_URL这些。本地.env文件里的变量要同步到Amplify的环境变量中,尤其注意NEXTAUTH_URL必须设置成Amplify部署后的实际域名(比如https://your-app-id.amplifyapp.com),不能沿用本地的localhost地址。另外Credentials Provider用到的其他验证密钥、数据库连接串等变量也得确认配置到位,缺失的话会直接导致token生成或验证失败。确认Next.js中间件的路径匹配规则
检查你的middleware.ts(或.js)里的路径匹配是否精准。Amplify部署Next.js时,对中间件的路径识别可能有特殊要求,如果你是针对所有路径生效,建议明确写出匹配规则,比如:export const config = { matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], }这样可以避免静态资源或API路径干扰中间件执行。另外要确保中间件文件放在项目根目录,要是你的项目用了
src目录,Amplify可能对路径识别有偏差。检查Next-Auth的Session策略和Cookie配置
Credentials Provider默认使用jwt会话策略,要确认你的[...nextauth].ts里的jwt配置和NEXTAUTH_SECRET环境变量完全一致。同时检查Cookie的domain配置:在Amplify域名下,Cookie的domain应该设置为你的Amplify域名(比如.amplifyapp.com,注意前面的点),或者留空让Next-Auth自动适配。如果本地设置了localhost的domain,部署后没修改,会导致Cookie无法被正确携带,进而token为null。
可以在配置里明确指定会话策略:session: { strategy: "jwt", },确认AWS Amplify对Next.js中间件的支持配置
确保你的Amplify项目使用的是支持Next.js 12+中间件的版本,检查Amplify控制台“Build settings”里的amplify.yml文件,确认构建命令正确,且构建镜像的Node.js版本是18+(Next-Auth v4对Node版本有要求)。也可以在amplify.yml里添加配置确保中间件被正确打包:frontend: phases: preBuild: commands: - npm ci build: commands: - npm run build artifacts: baseDirectory: .next files: - '**/*' cache: paths: - node_modules/**/*排查Amplify的缓存设置
Amplify默认会对静态资源做缓存,有时候会导致中间件的响应被错误缓存,进而出现token为null的情况。你可以在Amplify控制台的“App settings”->“Rewrites and redirects”里,检查是否有不合适的缓存规则,或者添加一条针对中间件路径的缓存排除规则。
如果以上方法都没解决问题,建议在中间件里加一些日志输出(比如console.log(req.nextauth)),然后在Amplify的应用日志里查看具体输出,帮助定位问题根源。
备注:内容来源于stack exchange,提问作者Konstantin Kliukhin

