近期发现钉钉机器人添加了安全设置,需要用户必须在自定义关键词、加签、ip地址(段)中选择一个,为了后期更好的使用,我选择加签这个方案,对于方案的具体描述,可详见 https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
在flutter开发过程中,如果需要适配钉钉机器人的加签安全策略,可以参考以下我的实际开发样例进行修改,完全可以进行使用。
首先需要在pubspec.yaml的dependencies下添加 crypto: ^2.1.3
并在使用的dart文件中进行引用 import 'package:crypto/crypto.dart';
static sign() {
int timeStamp = DateTime.now().millisecondsSinceEpoch;
String stringToSign = timeStamp.toString() + "\n" + dingtalkSecret;
var key = utf8.encode(dingtalkSecret);
var bytes = utf8.encode(stringToSign);
var hmacSha256 = new Hmac(sha256, key);
var digest = hmacSha256.convert(bytes);
var signBase64 = base64.encode(digest.bytes).toString();
return "×tamp=" + timeStamp.toString() + "&sign="+Uri.encodeComponent(signBase64);
}
如果要验证所传递的数据是否正确,可以通过Python跑一下进行验证
import time
import hmac
import hashlib
import base64
import urllib
timestamp = long(round(time.time() * 1000))
secret = '1111111'
secret_enc = bytes(secret).encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
print(base64.b64encode(hmac_code))
sign = urllib.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
网友评论