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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:00:10