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

AWS Cognito授权码换Token遇400(invalid_client)问题排查咨询

AWS Cognito授权码兑换Token遇invalid_client错误排查

问题背景

我正在用AWS Cognito实现登录流程,登录成功后Cognito会携带授权码(code)重定向到我的应用。我知道需要通过/oauth2/token端点把授权码兑换成Token,但一直收到400 Bad Request错误,错误信息是invalid_client,但我用的client_id和/login、/signup接口是一致的。(我用TypeScript编写AWS栈代码)

请求详情

请求:

POST https://<domain name>.amazoncognito.com/oauth2/token?client_id=<client_id>&grant_type=authorization_code&redirect_uri=http://localhost:4200&code=<登录后获取的code参数>

请求头:

Authorization: Basic <app credential>
Content-Type: application/x-www-form-urlencoded

其中<app credential>通过以下代码生成:

const secret = this.userPoolClient.userPoolClientSecret as any;
this.appCredentials = btoa(this.userPoolClient.userPoolClientId + ":" + secret.value);

请求体为null

(我知道应该用SecretManagerStack存储密钥,但现在先优先解决Token获取问题,后续再处理密钥保护)

疑问

  1. 从Cognito登录页面返回后,是不是必须用/oauth2/token端点?有没有其他方式?
  2. 我调用/oauth2/token API的方式对吗?参数和请求头有没有遗漏?
  3. 我的应用凭证是不是错了?该怎么正确获取客户端密钥?

问题解答

1. 端点选择

没错,授权码模式下必须用/oauth2/token端点来兑换Token,这是OAuth2.0和Cognito OAuth流程的标准步骤,没有其他官方替代方式。

2. API调用正确性

你的调用有两个明显问题:

  • 参数位置错误:client_id、grant_type、redirect_uri、code这些参数应该放在请求体里(匹配Content-Type: application/x-www-form-urlencoded的要求),而不是URL查询参数中。Cognito的/oauth2/token端点要求这些参数通过表单提交,放在URL里会被忽略或导致校验失败。
  • 请求体不能为空:需要把参数以key=value&key2=value2的格式放在请求体中,示例如下:
    client_id=<client_id>&grant_type=authorization_code&redirect_uri=http://localhost:4200&code=<授权码>
    

3. 应用凭证与客户端密钥获取

  • 凭证生成逻辑:如果你的用户池客户端是机密客户端(创建时勾选了Generate client secret),那么用client_id:client_secret做base64编码生成Basic Auth凭证是对的;但如果是公共客户端(没有客户端密钥),则不需要Authorization头,直接提交请求体参数即可。
  • 密钥获取正确性:在CDK中,userPoolClient.userPoolClientSecret返回的是SecretValue对象,正确获取其值的方式是用secret.secretValue.toString(),而非secret.value(value属性无法正确解析密钥内容)。修改后的代码示例:
    const secret = this.userPoolClient.userPoolClientSecret;
    if (secret) {
      this.appCredentials = btoa(`${this.userPoolClient.userPoolClientId}:${secret.secretValue.toString()}`);
    }
    
  • 额外校验项:确认用户池客户端配置中,redirect_uri和你请求中使用的http://localhost:4200完全一致(包括协议、域名、端口,不能有多余斜杠或大小写差异);同时确认客户端已开启Authorization code grant的OAuth流模式。

内容的提问来源于stack exchange,提问作者Hyun Woo Krassilchikoff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:38:25