You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:52:43