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

客户端JavaScript调用AWS Cognito /oauth2/token返回400错误如何解决

问题核心原因与解决方案

1. 首先修正参数名错误

你代码中所有请求的回调参数名写错了,OAuth2 令牌端点要求的标准参数是redirect_uri,你写的是redirect_url,参数名不匹配会直接返回400错误。你在Postman/Insomnia中应该是填对了参数名,所以请求可以正常执行。

你观察到的参数拼接在URL上的是GET请求的用法,POST请求将表单参数放在请求体中是符合规范的,这个不是导致请求失败的原因。

2. 检查Cognito配置

  • 确认应用客户端配置的回调地址,和你传的redirect_uri完全一致,包括协议、域名、路径、末尾斜杠都要完全匹配
  • 在Cognito用户池的应用程序集成配置中,给你的Cognito域名配置CORS规则,允许你站点的域名(比如https://www.xxx.me)发起POST请求

3. 优化请求写法

不需要手动添加Origin请求头,浏览器会自动携带,手动添加反而可能触发额外的CORS预检规则,导致请求异常。

以下是经过验证的正确请求代码:

const tokenURL = 'https://xxx.auth.us-west-2.amazoncognito.com/oauth2/token'
try {
  const response = await fetch(tokenURL, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: new URLSearchParams({
      grant_type: 'authorization_code',
      code: code,
      client_id: '你的客户端ID',
      redirect_uri: 'https://www.xxx.me/xxx'
    })
  })
  if (!response.ok) {
    // 打印原始响应内容排查具体报错
    const errText = await response.text()
    console.error('请求失败详情:', errText, '状态码:', response.status)
    return
  }
  const tokenData = await response.json()
  console.log('令牌获取成功:', tokenData)
} catch (e) {
  console.error('请求异常:', e)
}

额外注意

Cognito返回的授权码是一次性的,只要被调用过一次(包括你在Postman里测试用过)就会立即失效,每次测试都要重新走登录流程获取新的授权码,重复使用也会返回400错误。

内容的提问来源于stack exchange,提问作者levye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:48:03