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

Dart应用实现Wikimedia OAuth2授权流程时触发invalid_request错误:需检查grant_type参数

解决Wikimedia OAuth2获取Access Token的invalid_request错误

我一眼就看出问题所在了——你把OAuth2接口要求的表单参数打包成了JSON,再塞进单个param字段里,但Wikimedia的access_token端点根本不接受这种格式!它需要的是标准的application/x-www-form-urlencoded键值对,也就是直接把grant_type、code这些参数作为独立的表单字段传递,而不是嵌套在JSON里。

修正后的代码

直接用Dart http库的原生能力处理表单参数,它会自动帮你完成URL编码、设置正确的Content-Type和Content-Length,完全不用手动折腾:

Future<http.Response> response = http.post(
  Uri.parse('https://meta.wikimedia.org/w/rest.php/oauth2/access_token'),
  body: <String, String>{
    'grant_type': 'authorization_code',
    'redirect_uri': redirectUri, // http库会自动处理URL编码,不用手动调用encodeFull
    'code': authCode,
    'client_id': CLIENT_ID,
    'client_secret': clientSecret,
  },
);

为什么之前的代码会出错?

  1. 参数格式完全不符合要求:接口期望每个参数是独立的表单键值对(比如grant_type=authorization_code),但你把所有参数打包成JSON后塞进了param字段,导致接口找不到grant_type这个必填参数。
  2. 手动处理Content-Length有风险:虽然你手动计算了字节长度,但如果编码过程和接口预期不一致,会引发长度不匹配的问题,直接用http库的默认处理就能避免这个坑。
  3. 多余的双重编码:你提前对redirect_uri做了Uri.encodeFull,但http库在处理表单时会自动编码,双重编码反而可能导致参数值无效。

额外排查要点

如果修正后还是报错,可以检查这几点:

  • 确认redirect_uri和你在Wikimedia开发者后台注册的完全一致(包括协议、域名、路径,不能有任何差异)。
  • 确认authCode是刚获取的有效授权码,没有过期或被使用过。
  • 检查CLIENT_ID和client_secret是否正确复制,没有多余的空格或字符。

内容的提问来源于stack exchange,提问作者underwhelmingToaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:22:27