签名机制

  • API服务会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(sign)信息。通过使用app_id、secret_key以及参数信息进行MD5摘要运算来验证请求的发送者身份。

  • app_id和secret_key 由微吼云官方颁发给访问者( 控制台->对应应用->设置->应用信息),其中:

  • app_id 用于标识应用的信息。

  • secret_key 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有微吼云和用户知道。

用户在访问时,按照下面的方法对请求进行签名处理:

1 、按照参数名称的字典顺序对请求中所有的请求参数进行排序。

  • 注意 :请求参数包括文档中描述的“公共请求参数”和给定了的请求接口的自定义参数,但不能包括“公共请求参数”中提到 sign 参数本身文件类型参数

  • javaScript代码示例

	// 用户秘钥
	var secret_key = "f145b675f441cc00dd3e55746a0f4780";
	
	// 用户参数
	var param = {
		"room_id" : "lss_5b2cef",
		"app_id" : "3eb7261"
	}
	
	// 按名称字段排序后结果是
	param = {
		"app_id" : "3eb7261"
		"room_id" : "lss_5b2cef",
	}

2、 按 键值键值 方式拼接成字符串。

  • javaScript代码示例
	// 用户参数来自上一个例子
	// 拼接出来的字符串就是
	var signParam = "app_id3eb7261room_idlss_5b2cef"

3 、在此字符串首尾各拼接一次secret_key。

  • javaScript代码示例
	// 用户参数来自上一个例子
	 signParam="f145b675f441cc00dd3e55746a0f4780app_id3eb7261room_idlss_5b2ceff145b675f441cc00dd3e55746a0f4780"

4 、对拼接后的字符串进行md5,得到sign。

  • javaScript代码示例
	// 用户参数来自上一个例子
	signParam=md5("f145b675f441cc00dd3e55746a0f4780app_id3eb7261room_idlss_5b2ceff145b675f441cc00dd3e55746a0f4780")
	
signParam = "e316af53a0dc14d42209fcad750a78c9";

5 、将得到的sign作为请参数之一传递。

  • javaScript代码示例
	// 用户参数来自上一个例子
	param['sign'] =  "e316af53a0dc14d42209fcad750a78c9";
	// 添加sign后,为最终的请求参数

6 、VOP服务器收到所有参数后,根据app_id取得对应的secret_key,然后依照同样的算法计算sign。验证与传递的sign是否一致。

  • 完整代码流程以PHP代码为例
// 由微吼云提供
$secret_key = "f145b675f441cc00dd3e55746a0f4780";//应用密钥,从微吼云控制台获得

// 用户参数示例
$params = [
    "room_id"=> "123456789",//业务参数房间ID,根据不同业务接口增加相应的业务参数
    "app_id"=> "3eb7261",//应用ID,从微吼云控制台获得
    "signed_at"=> "1484620708"//时间戳,服务器当前时间的时间戳即可
];

// 按参数名升序排列
ksort($params);

// 初始化签名字串
$str = '';

// 将键值组合连接到签名字串上
foreach ($params as $k => $v) {
$str .= $k.$v;
}

// 将签名字串前后两端加上秘钥进行MD5运算
$sign = md5($secret_key.$str.$secret_key);

// 将sign签名放到请求数据中
$params["sign"] = $sign;
  • 签名函数以PHP代码为例
    /**
     * 获取API签名
     * @param array $arr
     * @param $secret_key
     * @return string
     */
	function sign( array $arr, $secret_key ) {
		// 去除因重复调用可能产生的sign字段
		unset($arr['sign']);
		
		// 按键名称排序
		ksort($arr);
		
		// 初始化签名字串
		$str = '';
		
		// 将键值组合连接到签名字串上
		foreach ($arr as $k => $v) {
			$str .= $k.$v;
		}
		// 将签名字串前后两端加上秘钥
		$str = $secret_key.$str.$secret_key;
		
		// 返回MD5运算后的结果
		return md5($str);
    }