Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dart中的Hmac sha1和base 64编码_Dart_Flutter - Fatal编程技术网

dart中的Hmac sha1和base 64编码

dart中的Hmac sha1和base 64编码,dart,flutter,Dart,Flutter,我正在尝试生成oauth_签名以使用Fatsecret API,但收到一个无效的签名错误 要创建oauth_签名值,文档说明: 使用[RFC2104]定义的HMAC-SHA1签名算法对请求进行签名,其中文本是签名基字符串,密钥是消费者机密和访问机密的串联值,由“&”字符分隔(即使访问机密为空,也显示“&”,因为某些方法不需要访问令牌)。 计算出的摘要八位字节字符串是oauth_签名,该字符串首先根据[RFC2045]进行base64编码,然后使用[RFC3986]百分比编码(%xx)机制进行转义

我正在尝试生成oauth_签名以使用Fatsecret API,但收到一个无效的签名错误

要创建oauth_签名值,文档说明:

使用[RFC2104]定义的HMAC-SHA1签名算法对请求进行签名,其中文本是签名基字符串,密钥是消费者机密和访问机密的串联值,由“&”字符分隔(即使访问机密为空,也显示“&”,因为某些方法不需要访问令牌)。
计算出的摘要八位字节字符串是oauth_签名,该字符串首先根据[RFC2045]进行base64编码,然后使用[RFC3986]百分比编码(%xx)机制进行转义

下面的代码用于生成签名

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);
}

请帮帮我,伙计们…我已经被困在这几个星期了

如果我像下面这样修改代码,那么我不会得到任何
无效签名
错误

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));
  }
String\u generateSignature(字符串方法、字符串url、映射参数){
//对参数进行排序
var sortedParams=SplayTreeMap.from(参数);
//用“&”连接已排序的参数
String concatenatedParams=sortedParams.keys.map((键){
返回“$key=${sortedParams[key]}”;
}).加入(“&”);
//对排序和连接的参数字符串进行编码
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);
返回Uri.encodeComponent(base64Encode(hmac.convert(baseString.codeUnits.bytes));
}

你找到答案了吗?没有(向上投票这个问题,这样我们就可以得到帮助。你可以看看我在最近的一个项目中使用的代码
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));
  }