Next.js部署AWS Fargate后Cognito登录报SIGNIN_OAUTH_ERROR
我有一个Next.js应用,使用next-auth v4对接Cognito Provider实现认证功能,本地运行正常,登录后可跳转至指定路径。但将代码部署为AWS Fargate服务后,登录时CloudWatch日志抛出[SIGNIN_OAUTH_ERROR],错误信息为“only valid absolute URLs can be requested”。
相关配置文件信息如下:
Dockerfile
FROM node:16-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . ENV NEXTAUTH_URL=https://mediamanager-dev.cloud.sysco.net RUN npm run build EXPOSE 3000 CMD [ "npm", "start" ]
api/auth/[...nextauth].tsx
import NextAuth, { NextAuthOptions } from 'next-auth' import CognitoProvider from "next-auth/providers/cognito"; export const authOptions: NextAuthOptions = { providers: [ CognitoProvider({ clientId: process.env.COGNITO_CLIENT_ID || '', clientSecret: process.env.COGNITO_CLIENT_SECRET || '', issuer: process.env.COGNITO_ISSUER || '', }) ], secret:'ttdVYyZt7HDkPlgET5CEY8Anchurq86KZh8Nddf2Xk8=', callbacks: { async jwt({token, account}) { if (account) { token.access_token = account.access_token token.id_token = account.id_token } return token } } } export default NextAuth(authOptions)
.env.local
NEXTAUTH_URL=https://<domain> NEXTAUTH_SECRET=<secret> COGNITO_CLIENT_ID=<cl id> COGNITO_CLIENT_SECRET=<cl secret> COGNITO_ISSUER=<issue>
组件代码
import {signIn} from 'next-auth/react' <Button href='/dashboard' onClick={(e) => { e.preventDefault() signIn('cognito', {callbackUrl: `${window.location.origin}/dashboard`}) }} appearance={appearance} style={{ fontWeight: 'bold' }}> {text} </Button>
这个错误的核心原因是NextAuth在OAuth流程中生成的回调URL不是有效绝对URL,或是NEXTAUTH_URL配置存在冲突,导致Cognito无法识别回调地址。以下是具体排查和解决方向:
统一
NEXTAUTH_URL配置
Dockerfile中硬编码了NEXTAUTH_URL,但.env.local里是占位符,部署到Fargate时要确保运行环境的NEXTAUTH_URL是对外可访问的完整绝对URL,且和Cognito配置的回调URL域名一致。建议不要在Dockerfile中硬编码该变量,改为通过Fargate的环境变量配置传入,避免环境耦合。检查Cognito客户端回调URL配置
登录AWS Cognito控制台,找到对应用户池的应用客户端,确认“回调URL”已添加部署后的完整地址:https://mediamanager-dev.cloud.sysco.net/api/auth/callback/cognito,必须是绝对URL,且和应用的NEXTAUTH_URL匹配。替换硬编码的secret
当前代码中直接写死了secret值,建议改为读取环境变量,保持配置安全和灵活:secret: process.env.NEXTAUTH_SECRET || '',验证Fargate网络与域名解析
确保Fargate服务所在VPC、安全组允许对外访问,且https://mediamanager-dev.cloud.sysco.net已正确解析到Fargate服务的负载均衡器或公网IP,避免因网络不通导致URL无法被识别。确认回调URL生成逻辑
组件中用window.location.origin生成callbackUrl是合理的,但可在部署环境通过浏览器控制台验证该值是否为正确的绝对URL;也可以直接传入完整的绝对URL测试,比如{callbackUrl: 'https://mediamanager-dev.cloud.sysco.net/dashboard'}。
内容的提问来源于stack exchange,提问作者ahkam

