AWS Cognito OAuth/Token端点返回invalid_request问题求助
针对你的代码和问题,从以下几个方向逐一排查:
Base64编码的潜在问题
你用btoa()对clientId:clientSecret进行编码,但btoa()仅支持ASCII字符集,若你的客户端密钥包含非ASCII字符或URL特殊字符(如+、/、=),会导致编码结果不符合Basic Auth的要求。
建议替换编码方式:- 若在Node.js环境,改用
Buffer.from(${this.clientId}:${this.clientSecret}).toString('base64'); - 若在浏览器环境,先对clientId和clientSecret分别用
encodeURIComponent()编码,再拼接后执行btoa():const encodedClientId = encodeURIComponent(this.clientId); const encodedClientSecret = encodeURIComponent(this.clientSecret); const credentials = btoa(`${encodedClientId}:${encodedClientSecret}`);
- 若在Node.js环境,改用
严格匹配redirect_uri
Cognito对redirect_uri的匹配要求完全一致,包括大小写、末尾斜杠、协议(http/https)。确认你在token请求中传入的redirect_uri,和获取authorization code时使用的redirect_uri完全相同,哪怕只差一个斜杠都会触发错误。authorization code的有效性
Cognito的authorization code仅能使用一次,且有效期为5分钟。若你重复使用同一个code,或code已过期,都会返回invalid_request。确保你传入的code是刚获取的、未被使用过的。客户端类型配置
确认你的用户池客户端被设置为机密客户端(Confidential Client)。如果误配置为公共客户端(Public Client),Cognito会拒绝带有客户端密钥的Basic Auth请求,直接返回错误。请求头与参数检查
检查是否有axios拦截器或其他逻辑修改了请求头,确保Content-Type严格为application/x-www-form-urlencoded,且Authorization头的格式正确(Basic后紧跟Base64编码的凭证,无多余空格)。参数完整性
确认所有必填参数都已正确传入:grant_type为authorization_code,client_id、redirect_uri、code的值都非空且格式正确。
内容的提问来源于stack exchange,提问作者Filbert Okafor

