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获取问题,后续再处理密钥保护)
疑问
- 从Cognito登录页面返回后,是不是必须用
/oauth2/token端点?有没有其他方式? - 我调用
/oauth2/tokenAPI的方式对吗?参数和请求头有没有遗漏? - 我的应用凭证是不是错了?该怎么正确获取客户端密钥?
问题解答
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
相关产品推荐
相关产品推荐

