秘钥

对于设置了秘钥的 Webhook,DM Hub 向消息接收地址发送请求时,会使用秘钥生成消息内容的 hmac sha256 hex 摘要签名,携带在 header 的 X-Clab-Hmac-Signature 中。

在接收消息的代码中,使用相同的秘钥生成接收到的 payload 的 hmac sha256 hex 摘要签名,并与 header 中的签名进行比对,如果两者一致,则验签通过,表明消息来源可靠且消息内容没有被篡改过。

生成 hmac sha256 hex 摘要签名: 使用的 jar 包:

com.google.code.gson:gson:2.8.1
commons-codec:commons-codec:1.10

生成签名代码示例:

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import org.apache.commons.codec.digest.HmacUtils

String sign(Map payload, String secret) {
    Gson gson = new GsonBuilder().create();
    String str = gson.toJson(payload);
    return HmacUtils.hmacSha256Hex(secret, str.replaceAll("\\s+", ""));
}

基本认证

对于设置了基本身份认证的 Webhook, DM Hub向消息地址发送请求时,会在HTTP header中添加Authorization请求头。示例代码如下:

String content = username + ":" + password;
String token = "Basic " + Base64.getEncoder().encodeToString(content("utf-8"));
httpPost.setHeader("Authorization", token);

接收Webhook消息的服务可以用相同的方法验证请求的完整性。

OAuth2

对于设置了OAuth2认证的 Webhook, DM Hub首先会向token获取地址请求并获取access_token,然后携带access_token参数向消息接收地址发送消息。

  1. 获取token的方式如下:
GET https://{token获取地址}?appid={appid}&secret={secret}&grant_type=client_credentials
  1. 发送消息时的参数名为access_token,如:
POST https://{消息接收地址}

不使用任何鉴权方式

如果Webhook鉴权设置无,则不做任何鉴权,直接访问接受消息地址