使用Curl与Flutter调用同一接口时JWT Token为何不同?
问题:Flutter与Curl请求AWS Lambda后端返回IDToken不一致
我有一个基于AWS Lambda的C#后端,其中包含一个通过AWS Cognito认证用户并返回IDToken的函数,返回逻辑为:return Ok(idToken);。但用Flutter和Curl发起看似完全相同的HTTP请求时,返回结果却有差异:
Flutter 请求代码
final requestBody = jsonEncode({"Username": "Myusername", "Password": "Mysecretpassword"}); final request = await http.post( Uri.parse( "https://myAWSLink/signin"), headers: {'Content-Type': 'application/json'}, body: requestBody);
Curl 请求命令
curl -X POST "https://myAWSLink/signin" \ -H "Content-Type: application/json" \ -d '{ "Username": "myusername", "Password": "Mysecretpassword" }'
两者请求链接、头信息和请求体看似一致,但Curl返回的IDToken长度为1063字符,Flutter返回的仅为1023字符,导致Flutter获取的Token无法用于API认证,Curl的则可以。看起来Flutter接收Token时丢失了部分字符,请问原因是什么?如何让Flutter的响应与Curl一致?
解决方案
1. 先修正用户名大小写不一致的问题
你忽略了一个关键差异:Flutter代码里的Username值是"Myusername"(首字母大写),但Curl里是"myusername"(全小写)。AWS Cognito的用户名默认是大小写敏感的,这意味着两次请求实际上是在认证两个不同的用户,返回的Token自然不同。
把Flutter代码里的用户名改成和Curl一致的小写:
final requestBody = jsonEncode({"Username": "myusername", "Password": "Mysecretpassword"});
2. 若仍有截断问题,优化响应读取方式
如果修正用户名后还是出现Token截断,可能是Flutter http包默认的字符串解析存在编码或截断问题。可以尝试直接读取响应的字节流再解码:
final response = await http.post( Uri.parse("https://myAWSLink/signin"), headers: {'Content-Type': 'application/json'}, body: jsonEncode({"Username": "myusername", "Password": "Mysecretpassword"})); // 直接从字节解码,避免默认解析的潜在问题 final idToken = utf8.decode(response.bodyBytes);
3. 排查后端返回是否完整
可以登录AWS控制台查看Lambda的执行日志,确认return Ok(idToken);返回的Token是否完整,对比日志里的Token长度和Flutter、Curl拿到的结果,判断是后端返回问题还是客户端接收问题。
内容的提问来源于stack exchange,提问作者Trev347
相关产品推荐
相关产品推荐

