自訂授權
功能路徑
我的直播 --> 频道设置-->观看条件设置-->自定义授权
功能介紹
開啟直播觀看頁時,直播系統會呼叫客戶系統的驗證介面,客戶自訂驗證邏輯,驗證通過後才能開啟保利威視直播觀看頁,並且介面回傳的觀眾帳號具有唯一性,即同一個帳號不能在兩個地方同時登入,較早登入的帳號會被踢出。

1、Secretkey:用於校驗簽章的產生
2、自訂URL: 用於自訂授權驗證的API介面
自訂授權流程詳解
1、在自訂URL處填寫使用者的授權驗證API介面,需要完整的不帶參數的url位址(不能是localhost等本地伺服器位址,且不能帶 ?號),如:http://myWebsite.com/auth
2、直播系統會將id(直播的頻道)、ts(目前時間的毫秒級時間戳)、sign(用於校驗的簽章)、url(回呼的url位址)等參數提交給使用者自訂的API介面,使用者需要對字串 secretkey + id + secretkey + ts 進行MD5加密後與sign參數的值做比較判斷是否合法。
3、通過校驗和自訂驗證邏輯後,客戶系統將userid(學員唯一識別,僅支援英文大小寫、數字和底線)、nickname(暱稱)、avatar(頭像)、actor(用戶頭銜名稱,非必須)、actorFColor(用戶頭銜字體顏色,非必須,請使用CSS Hex值帶#號)、actorBgColor(用戶頭銜背景顏色,非必須,請使用CSS Hex值帶#號)、vid(回放的影片id)、ts(目前時間的毫秒級時間戳)、sign(校驗簽章)等參數提交到回呼的url介面。
4、直播系統會對簽章做校驗後判斷是否允許學員觀看。校驗通過後將進入直播觀看頁,聊天區域將顯示觀眾的暱稱和頭像。一次成功請求後,該連結將失效。
流程圖如下

提交的參數描述
| 參數名 | 說明 |
|---|---|
| id | 直播的頻道號,如: 10000 |
| ts | 目前時間的毫秒數長整型。如: 1466648001977 |
| sign | 用於校驗的簽章,產生的規則:對字串 secretkey + id + secretkey + ts 進行MD5加密產生的字串 |
| url | 用於回呼url位址,使用者在通過校驗並處理後會跳到這個url |
| vid | 回放影片id,非必須欄位,如透過回放位址連結登入觀看頁,則會將該參數提交給使用者自訂位址。如:e07738ddd6 |
直播系統會將上面的參數提交給使用者自訂的api介面,使用者需要對字串 secretkey + id + secretkey + ts 進行MD5加密後與sign參數的值做比較判斷是否合法。
回呼的url的參數描述
| 參數名 | 說明 |
|---|---|
| userid | 使用者id,重複id時先登入的觀眾會被踢出直播間【僅支援英文大小寫、數字和底線,長度最大64位元字元,超出64位元的部分將被截取不做記錄】 |
| nickname | 使用者的暱稱進行base64加密的字串後再進行urlencode,註:暱稱編碼前不能包含&、<、"、'等字元,不得含有xss腳本,否則會被轉義處理 |
| marqueeName | 自訂跑馬燈欄位進行base64加密的字串後再進行urlencode,該欄位會透過【URL自訂跑馬燈】中code參數回呼 |
| avator | 使用者的頭像,完整的圖片位址字串 |
| actor | 使用者頭銜名稱,非必須欄位 |
| actorFColor | 使用者頭銜自訂字體顏色,非必須欄位 |
| actorBgColor | 使用者頭銜自訂背景色,非必須欄位 |
| vid | 回放影片id,非必須欄位。 如:e07738ddd6。 該值可使用介面【查詢影片庫列表】回傳的videoId |
| ts | 目前的系統時間的毫秒數,長整型。如: 1466648001977 |
| sign | 用於校驗的簽章,產生的規則:對字串 secretkey + id + secretkey + ts + secretkey + userid 進行MD5加密產生的字串 |
通過第一步的校驗後使用者介面需要將上面相關的參數提交到回呼的url介面,直播系統會對簽章做校驗後判斷是否允許使用者觀看。一次成功請求後,該連結將失效。
程式碼範例(Java)
註:LiveSignUtil屬於直播SDK,如不使用直播SDK可使用以下第二點中的「MD5簽章方法」。
@Slf4j
@Controller
@RequestMapping(value = "/polyv")
public class PolyvController {
private static final String SECRET = "******";
@GetMapping("custom")
public String custom(String id, Long ts, String sign, String url) throws UnsupportedEncodingException {
Assert.assertNotBlack(id);
Assert.assertNotNull(ts);
Assert.assertNotBlack(sign);
Assert.assertNotBlack(url);
long timeMillis = System.currentTimeMillis();
long diffTime = Math.abs(timeMillis - ts);
//1、时间戳判断
if (diffTime > 5 * 60 * 1000) {
log.error("时间戳验证错误");
return "";
}
String signText = SECRET + id + SECRET + ts;
try {
signText = LiveSignUtil.md5Hex(signText);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (signText == null || !signText.equals(sign)) {
return "";
}
String viewerId = "sadboy";
String nickname = URLEncoder.encode(new BASE64Encoder().encode("保利威".getBytes(StandardCharsets.UTF_8)), "GBK");
String marqueeName = URLEncoder.encode(new BASE64Encoder().encode("跑马灯".getBytes(StandardCharsets.UTF_8)),
"GBK");
String avatar = "http://live.polyv.net/assets/images/avatars/9avatar.jpg"; //学员的头像
String mySign = SECRET + id + SECRET + timeMillis + SECRET + viewerId;
try {
mySign = LiveSignUtil.md5Hex(mySign);
} catch (NoSuchAlgorithmException e) {
log.error("签名异常", e);
}
url += "?userid=" + viewerId + "&nickname=" + nickname + "&marqueeName=" + marqueeName + "&avatar=" + avatar +
"&ts=" + timeMillis + "&sign=" + mySign;
return "redirect:" + url;
}
}
程式碼範例(PHP)
<?php
$secretkey = "jlw42byyJ6"; //后台secretKey,在自定义授权地址设置页面
$id = $_GET["id"]; //直播的频道id
$ts = $_GET["ts"]; //当前时间
$sign = $_GET["sign"]; //用于检验的签名
$url = $_GET["url"]; //回调的url
$md5 = md5($secretkey . $id . $secretkey . $ts); //若md5字符串与sign不符合,则不做任何处理
if (!($sign == $md5)) {
return;
}
$userid = "eciyhturt8"; //学员唯一标识
$nickname = urlencode(base64_encode("保利威")); //学员的昵称
$marqueeName = urlencode(base64_encode("polyv")); //自定义跑马灯内容
$avatar = "http://live.polyv.net/assets/images/avatars/9avatar.jpg"; //学员的头像
$callbackTs = time() * 1000; //当前的系统时间
$callbackSign = md5($secretkey . $id . $secretkey . $callbackTs . $secretkey . $userid); //用于检验的签名
$callbackUrl = $url . "?userid=" . $userid . "&nickname=" . $nickname . "&marqueeName=" . $marqueeName. "&avatar=" . $avatar . "&ts=" . $callbackTs . "&sign=" . $callbackSign; //新的直播页面url
//打开新的直播页面url
echo "<script language='javascript' type='text/javascript'>location.href='" . $callbackUrl . "'</script>"
?>
展示效果
http://live.polyv.cn/watch/104400
注意事項
1、要保證自訂驗證介面回傳的userid的唯一性,當多個觀眾使用同一個userid進入觀看頁時,較早登入的觀眾會被後面登入的觀眾踢出,觀看頁會提示「帳號在另外的地方登入,您將被退出觀看」。如下圖:

2、學員的暱稱進行base64加密後再進行urlencode加密,否則可能會造成觀看頁暱稱顯示亂碼現象。
3、學員的暱稱不能為空,否則保利威系統會取預設暱稱 xxx觀眾/數字
