【问题标题】:Hmac sha1 and base 64 encoding in dart飞镖中的 Hmac sha1 和 base 64 编码
【发布时间】:2019-04-14 19:22:02
【问题描述】:

我正在尝试生成 oauth_signature 以使用 Fatsecret API,但收到无效签名错误。

要创建 oauth_signature 值,文档说:

使用 [RFC2104] 定义的 HMAC-SHA1 签名算法对请求进行签名,其中 text 是 Signature Base String,key 是由“&”字符分隔的 Consumer Secret 和 Access Secret 的连接值(显示'&' 即使 Access Secret 为空,因为某些方法不需要访问令牌)。
计算出的摘要八位字节字符串,首先按照 [RFC2045] 进行 base64 编码,然后使用 [RFC3986] 百分比编码 (%xx) 机制进行转义,即 oauth_signature。

以下代码用于生成签名

String _generateSignature(String method, String url, Map<String, String> params) {
// sort the parameters
var sortedParams = SplayTreeMap.from(params);

// Concatenate the sortedParams with '&'
String concatenatedParams = sortedParams.keys.map((key) {
  return '$key=${sortedParams[key]}';
}).join('&');

// encode the sorted and concatenated params string
var encodedParams = Uri.encodeComponent(concatenatedParams);

var encodedUrl = Uri.encodeComponent(url);

String baseString = '$method&$encodedUrl&$encodedParams';
print(baseString);

String signingKey = '${Uri.encodeComponent(SHARED_SECRET)}&';

var hmac = Hmac(sha1, signingKey.codeUnits);

return base64Encode(hmac.convert(baseString.codeUnits).bytes);
}

当我调用 API 时,它会返回

11-12 09:52:45.924 15525-15612/com.example.delete I/flutter: {error: {code: 8, message: Invalid signature: oauth_signature 'y81+JIzX/P+xNqOCYLgbrMtDV2I='}}

请帮帮我,伙计们...我已经被困了好几个星期了!

【问题讨论】:

  • 你弄明白了吗?
  • 不。 :( 支持这个问题,以便我们获得帮助。
  • 你可以看看我在this answer最近的项目中使用的代码

标签: dart flutter


【解决方案1】:

如果我像下面这样修改代码,那么我不会收到任何Invalid signature 错误。

String _generateSignature(String method, String url, Map<String, dynamic> params) {
    // Sort the parameters
    var sortedParams = SplayTreeMap.from(params);

    // Concatenate the sortedParams with '&'
    String concatenatedParams = sortedParams.keys.map((key) {
      return '$key=${sortedParams[key]}';
    }).join('&');

    // encode the sorted and concatenated params string
    var encodedParams = Uri.encodeComponent(concatenatedParams);

    var encodedUrl = Uri.encodeComponent(url);

    String baseString = '$method&$encodedUrl&$encodedParams';

    String signingKey = '${Uri.encodeComponent(SHARED_SECRET)}&';

    var hmac = Hmac(sha1, signingKey.codeUnits);

    return Uri.encodeComponent(base64Encode(hmac.convert(baseString.codeUnits).bytes));
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多