Dart的Hmac sha1和base 64编码

时间:2018-11-12 04:23:49

标签: dart flutter

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

要创建oauth_signature值,文档应说明:

  

使用[RFC2104]定义的HMAC-SHA1签名算法对请求进行签名,其中文本是“签名基本字符串”,密钥是用“&”字符分隔的Consumer 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='}}

请帮助我,伙计们……我在这个问题上呆了几个星期!

1 个答案:

答案 0 :(得分:1)

如果我按如下所示修改代码,则不会出现任何service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.auth.uid != null; } match /School/{schoolName} { allow read, write: if get(/databases/{database}/documents/School/$(schoolName)/Users/{userId}).data.SchoolName[(schoolName)] } } } 错误。

Invalid signature