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

Flutter调用Bricklink API时遇Invalid Signature错误求助

错误返回内容

{
  "meta":{
    "description":"SIGNATURE_INVALID: Invalid Signature",
    "message":"BAD_OAUTH_REQUEST",
    "code":401
  }
}

我的实现代码

String generateTimestamp(){
    return (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString();
}

String generateNonce() {
    final random = Random.secure();
    final values = List<int>.generate(20, (_) => random.nextInt(256));
    return base64Url.encode(values);
}

void testAPI(id){
    String consumerKey = "my_consumer_key";
    String consumerSecret = "my_consumer_secret";
    String accessToken = "my_access_token";
    String tokenSecret = "my_token_secret";
    String timestamp = generateTimestamp();
    String nonce = generateNonce();
    String signatureMethod = 'HMAC-SHA1';
    String oauthVersion = '1.0';
    String signatureURL = 'https://api.bricklink.com/api/store/v1/items/MINIFIG/$id/subsets';
    String baseString = Uri.encodeComponent('GET&$signatureURL&oauth_consumer_key=$consumerKey&oauth_nonce=$nonce&oauth_signature_method=$signatureMethod&oauth_timestamp=$timestamp&oauth_token=$accessToken');
    String key = '$consumerSecret&$tokenSecret';

    var baseStringUTF = utf8.encode(baseString);
    var keyUTF = utf8.encode(key);

    var hmac = Hmac(sha1, keyUTF);
    var signatureBytes = hmac.convert(baseStringUTF).bytes;
    var signature = base64.encode(signatureBytes);

    var url = '$signatureURL?Authorization={"oauth_signature":"$signature","oauth_nonce":"$nonce","oauth_version":"$oauthVersion","oauth_consumer_key":"$consumerKey","oauth_signature_method":"$signatureMethod","oauth_token":"$accessToken","oauth_timestamp":"$timestamp"}';

    print(Uri.parse(url));
}

问题说明

开发Flutter应用调用Bricklink API,尝试数小时仍持续收到「Invalid Signature」错误。已尝试以下方法:

  • 使用ChatGPT排查问题
  • 查阅Dart OAuth库示例
  • 通过Postman发送请求并生成Dart代码

目前仅Postman生成的代码能成功请求,但仅对Postman中指定的ID有效。已知签名包含URL中的ID,但仍无法解决问题。本人有编程基础,但刚接触Dart和Flutter,恳请帮忙排查错误。

Postman生成的可运行代码

import 'package:http/http.dart' as http;

void main() async {
  var headers = {
    'Authorization': 'OAuth oauth_consumer_key="MY_CONSUMER_KEY",oauth_token="MY_ACCESS_TOKEN",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1741362033",oauth_nonce="dzs01iGFPVs",oauth_version="1.0",oauth_signature="BV9e8ameHBLBOZLqsGL3b8loylw%3D"',
    'Cookie': 'AWSALB=/awBeEwuV8Zy7pxAiM5oV96XCmvj4gKzQpY/Ve/5jCevFS+6vWk5NmU/KmkH+Hv6M0/0d9nSFRhIcDIsDjoSxE76x4ECGN40rturNk8m6S0amjhJM+Z1avqd+h+3; AWSALBCORS=/awBeEwuV8Zy7pxAiM5oV96XCmvj4gKzQpY/Ve/5jCevFS+6vWk5NmU/KmkH+Hv6M0/0d9nSFRhIcDIsDjoSxE76x4ECGN40rturNk8m6S0amjhJM+Z1avqd+h+3'
  };
  var request = http.Request('GET', Uri.parse('https://api.bricklink.com/api/store/v1/items/MINIFIG/sw0181/subsets'));
  
  request.headers.addAll(headers);
  
  http.StreamedResponse response = await request.send();
  
  if (response.statusCode == 200) {
    print(await response.stream.bytesToString());
  }
  else {
    print(response.reasonPhrase);
  }
  
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:02:41