七牛云推流鉴权方式有五种:
无校验鉴权(none)
也就是给一个 URL,URL 中不含有任何的 token、key 一类的,人人都可以猜到,人人都可以按照协议往这里面推流。
肯定不会有人用这个啦。
限时鉴权(expiry)
参数:expire:过期时间,1970年1月1日到过期时间之间的秒数。
token:是经过 hmac_sha1 签算 SignStr 再经过 base64 生成。
限时鉴权sk(expiry_sk)
参数:e:过期时间,1970年1月1日到过期时间之间的秒数。
token:是经过 hmac_sha1 签算 SignStr 再经过 base64 生成,然后再在前面加上七牛云的 AccessKey 和冒号。
动态鉴权(dynamic)
参数:nonce:比上次推流使用的 nonce 大的任意值。
token:是经过 hmac_sha1 签算 SignStr 再经过 base64 生成。
静态鉴权(static)
参数:key:也就是流的 PublishKey,这个通过其 SDK 中 Stream 对象获得。
可以看出:相同含义的参数,不一定具有相同的名称。
相同名称的参数,不一定具有相同的含义。
五种鉴权方式中,后台只能设置前面 3 种,而无鉴权我们又不推荐,所以其实我们只能使用:限时鉴权(expiry)、限时鉴权sk(expiry_sk),但是这两种鉴权方式中,官方 SDK 中又恰恰没有提供,我们这里提供一下:public static string publishUrl(string accessKey, string secretKey, Stream stream, long nonce)
{
const string defaultScheme = "rtmp";
if ("dynamic".Equals(stream.PublishSecurity))
{
return generateDynamicUrl(stream, nonce, defaultScheme);
}
else if ("static".Equals(stream.PublishSecurity))
{
return generateStaticUrl(stream, defaultScheme);
}
else if ("expiry".Equals(stream.PublishSecurity))
{
// 原 SDK 中不存在此方法,这里是我们新增的。
return generateExpiryUrl(stream, nonce, defaultScheme);
}
else if ("expiry_sk".Equals(stream.PublishSecurity))
{
// 原 SDK 中不存在此方法,这里是我们新增的。
return generateExpirySKUrl(accessKey, secretKey, stream, nonce, defaultScheme);
}
else
{
// "dynamic" as default
return generateDynamicUrl(stream, nonce, defaultScheme);
}
}
///
/// 限时鉴权(expiry)。
///
///
///
///
///
private static string generateExpiryUrl(Stream stream, long expireAt, string scheme)
{
if (expireAt <= 0)
{
expireAt = DateTimeHelperClass.CurrentUnixTimeMillis() / 1000 + 3600; // 一个小时后过期。
}
string baseUri = "/" + stream.HubName + "/" + stream.Title + "?expire=" + expireAt;
string publishToken = Credentials.sign(stream.PublishKey, baseUri);
return string.Format("{0}://{1}{2}&token={3}", scheme, stream.PublishRtmpHost, baseUri, publishToken);
}
///
/// 限时鉴权sk(expiry_sk)。
///
///
///
///
///
///
///
private static string generateExpirySKUrl(string accessKey, string secretKey, Stream stream, long expireAt, string scheme)
{
if (expireAt <= 0)
{
expireAt = DateTimeHelperClass.CurrentUnixTimeMillis() / 1000 + 3600; // 一个小时后过期。
}
string baseUri = "/" + stream.HubName + "/" + stream.Title + "?e=" + expireAt;
string publishToken = Credentials.sign(secretKey, baseUri);
return string.Format("{0}://{1}{2}&token={3}:{4}", scheme, stream.PublishRtmpHost, baseUri, accessKey, publishToken);
}