客户端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
相关产品推荐
相关产品推荐

