事件通知 -奇异果体育app竞彩官网下载
在videoworks中使用工作流处理媒资时,可以按照工作流中的通知设置,向待通知地址发送预定格式的通知消息,表示媒资处理已完成或失败。
在工作流中,除了开始节点,其他节点都可以设置通知。在此工作流运行中,设置了通知的节点运行结束后,会向通知指定地址发送一个通知消息,客户收到消息后,可以按自己的业务逻辑进行相应处理。
在工作流中设置通知前,需要先在控制台通知管理中添加可用的通知。通知地址支持http和https协议,https协议的通知地址需要客户预先准备好证书配置,在进行通知设置前,建议先测试下通知的endpoint是否能正常接受请求。通知请求的body内容如下:
{
"id" : "ntf-xxxx",
"endpoint" : "" ,
"content" : "" ,
"expire" : 1565235600000
}
body的每个参数说明如下:
参数 | 说明 |
---|---|
id | 通知id |
endpoint | 用户设置的通知地址 |
content | 通知内容 |
mediaid | 处理的媒资id |
workflowid | 处理的工作流id |
workflowname | 处理的工作流名称 |
instnaceid | 运行的实例id |
instancestatus | 运行的实例状态,success/failed |
taskresult | 发送通知的节点运行信息 |
expire | 通知发送过期时间 |
如果设置了通知验证,通知的请求header中会附带验证信息,用户可以通过验证header的合法性来判断通知请求是否是第三方恶意请求。
例如,用户在videoworks的console中创建了一个通知,通知设置是这样的:
{
"notificationid": "not-xxxxxxx",
"name": "noti",
"endpoint": "http://qwe.com/vw/callback",
"status": "enable",
"token": "qweasd123",
"authtype": "sign",
}
用户的userid为e95e33a028bd49dbb3e08f068dc975d5(可以在console-用户中心获取)。
用户将此通知设置到一个工作流的发布节点中,在这个工作流处理完成后,videoworks将会发送通知给用户。在此实例中,通知的内容如下:
post /vw/callback http/1.1
notification-auth-expire: 1572923085545
notification-auth-user: e95e33a028bd49dbb3e08f068dc975d5
notification-auth-token: 67d987295025dccf2ea669b68e0eb5427009e0cb26b8663b19378d3ac77fec64
content-type: application/json;charset=utf-8
content-length: 155
host: qwe.com
accept: */*
user-agent: ahc/2.0
{"mediaid":"mda-jijg31ym688jpuuc","workflowid":"wfs-jkec6badx3d8e6nn","workflowname":"aaaa","instanceid":"ins-jkedr4cu5mmeii2s","instancestatus":"success"}
可以注意到,设置了通知验证后,在通知请求的header中,有3个headernotification-auth-expire, notification-auth-user, notification-auth-token
,这3个header是这样设置的。
notification-auth-user
是用户的userid;
notification-auth-expire
是发送通知时取的时间戳(并非精准的过期时间,仅用于计算token);
notification-auth-token
的计算公式为
content = post;endpoint;body;notification-auth-expire;notification-auth-user
notification-auth-token = sha256-hex(token, content)
endpoint是通知设置里的endpoint, body是通知请求的body, sha256-hex是一个hash算法,。
为了便于用户开发,下面将给出java实现的计算notification-auth-token的方法,其他语言版本可以自行实现。
import javax.crypto.mac;
import javax.crypto.secretkey;
import javax.crypto.spec.secretkeyspec;
import java.nio.charset.charset;
import java.nio.charset.standardcharsets;
import java.security.invalidkeyexception;
import java.security.nosuchalgorithmexception;
import org.apache.commons.codec.binary.hex;
public class sha256helper {
private static final string hmac_sha256 = "hmacsha256";
private static final charset charset_utf8 = standardcharsets.utf_8;
public static string hmacsha256(string secretkey, string input) {
return hmacsha256(secretkey.getbytes(charset_utf8), input.getbytes(charset_utf8));
}
public static string hmacsha256(byte[] secretkey, byte[] input) {
return hmacsha256(secretkey, input, 0, input.length);
}
private static string hmacsha256(byte[] secretkey, byte[] input, int offset, int length) {
return new string(hex.encodehex(mac(input, offset, length, new secretkeyspec(secretkey, hmac_sha256))));
}
private static byte[] mac(byte[] input, int offset, int length, secretkey secretkey) {
try {
mac mac = mac.getinstance(secretkey.getalgorithm());
mac.init(secretkey);
mac.update(input, offset, length);
return mac.dofinal();
} catch (nosuchalgorithmexception | invalidkeyexception ex) {
throw new runtimeexception(ex);
}
}
public static void main(string[] args) {
string endpoint = "http://qwe.com/vw/callback"; // notification endpoint
string token = "qweasd123";
string userid = "e95e33a028bd49dbb3e08f068dc975d5"; // notification-auth-user
string expiretime = "1572923085545"; // notification-auth-expire
string body = "{\"mediaid\":\"mda-jijg31ym688jpuuc\",\"workflowid\":\"wfs-jkec6badx3d8e6nn\","
"\"workflowname\":\"aaaa\",\"instanceid\":\"ins-jkedr4cu5mmeii2s\",\"instancestatus\":"
"\"success\"}"; // request body
string content = string.format("post;%s;%s;%s;%s", endpoint, body, expiretime, userid);
string auth = sha256helper.hmacsha256(token, content);
system.out.println(auth);
}
}