獨立授權
功能路徑
【我的直播】 --> 【頻道設定】-->【觀看條件設定】-->【獨立授權】
功能介紹
開啟直播觀看頁時 URL 需帶上指定的參數,經過直播系統驗證請求合法後,直接進入直播觀看頁,同時將使用者所傳參數作為觀看頁的觀眾資訊進行設定,要求介面回傳的觀眾帳號具有唯一性,即同一個帳號不能在兩個地方同時登入,較早登入的帳號會被踢出。

1、Secretkey:用於校驗簽章的產生。
獨立授權流程詳解
1、將頻道設定為獨立授權後,透過後台或 API 介面取得使用者獨立授權觀看條件的 secretkey。
2、在請求保利威直播觀看頁時需帶上相關參數,如:https://live.polyv.cn/watch/1965681?userid=1b448be323&ts=1498547407000&sign=dd9dc9e42ad7c0204398e925a4ee0f46&nickname=viewerTests&avatar=http://livestatic.videocc.net/assets/wimages/missing_face.png
3、直播系統會對使用者提交的 sign 參數的值做比較判斷是否合法,一次成功請求後,該連結將失效(sign 只能成功使用一次),如果合法,直播系統將使用 nickname、userid、avatar,進入到保利威視直播觀看頁聊天區將顯示學員的暱稱和頭像。如果驗證失敗,則顯示錯誤頁面。
請求參數描述
| 參數名 | 必選 | 類型 | 說明 |
|---|---|---|---|
| userid | true | String | 觀眾 id,重複 id 時先登入的觀眾會被踢出直播間【僅支援英文大小寫、數字和底線,長度最大 64 位字元,超出 64 位的部分將被截取不做記錄】。注意 userid 中的 i 為小寫 |
| ts | true | Long | 當前 13 位毫秒級時間戳記,3 分鐘內有效 |
| sign | true | String | 用於校驗的簽章,產生規則是 secretkey + userid + secretkey + ts 進行 MD5 加密 |
| nickname | true | String | 觀眾暱稱,需要進行 url 安全的 base64 編碼 |
| avatar | false | String | 觀眾頭像的 url 地址 |
| vid | false | String | 回放影片 id,如需回放某個回放影片,則需要傳該參數,如:e07738ddd6 該值可使用介面【查詢影片庫列表】回傳的 videoId |
| param4 | false | String | 統計觀眾觀看日誌的自訂參數,需要先進行 base64 加密後再進行 urlencode |
| param5 | false | String | 統計觀眾觀看日誌的自訂參數,需要先進行 base64 加密後再進行 urlencode |
| failRedirectUrl | false | String | 獨立授權驗證失敗則轉跳到該 url,不填則跳轉預設失敗頁 |
| secretData | false | String | 存放目標參數(SM2)加密後的字串 |
| actor | false | String | 觀眾個人化頭銜 |
參數加密
支援 SM2 的加密方式,加密的參數列表: userid、nickname、param4、param5
| 參數名 | 支援加密 | 類型 | 說明 |
|---|---|---|---|
| userid | Y | String | 觀眾用戶 ID,加密可選 |
| nickname | Y | String | 觀眾暱稱,加密可選 |
| param4 | Y | String | 參數 4,加密可選 |
| param5 | Y | String | 參數 5,加密可選 |
| secretData | N | String | 存放目標參數加密後的字串 |
加密樣式
secretData 存放加密後的值,加密之前的值: userid={userid}&nickname={nickname}
watch_url?userid=xx&nickname=xx&ts={ts}&sign=md5(secretkey + userid + secretkey + ts)&secretData=SM2(userid={userid}&nickname={nickname}¶m4={param4}¶m5={param5})
參數組裝
簽章: 參與加密的參數真實值用於簽章,簽章方式保持不變。
需要注意的時候,加密後參數長度變大,考慮到瀏覽器 GET 請求參數總長度的限制,需要控制參數值的長度,參數總長度 1k 個字元為大部分瀏覽器支援。
解密
解密後的參數,將取代外層對應的參數值,若解密後沒有對應的參數或值為空不填充,則保持原值。外層參數可以用一些隨機值來佔位,例如 userid=test&nickname=test¶m4=test¶m5=test
例如
場景1: SM2(userid={userid}&nickname={nickname}) 解密後將替換外層的明文參數 userid、nickname
場景2: SM2(userid={userid}&nickname={nickname}¶m4={param4}) 解密後將替換外層的明文參數 userid、nickname、param4
場景3: SM2(userid={userid}&nickname={nickname}¶m5={param5}) 解密後將替換外層的明文參數 userid、nickname、param5
場景4: SM2(userid={userid}&nickname={nickname}¶m4={param4}¶m5={param5}) 解密後將替換外層的明文參數 userid、nickname、param4、param5
程式碼範例(Java)
//TODO 设置为独立授权的SecretKey
private static final String DIRECT_SECRET_KEY = "******";
public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {
// TODO 设置直播观看页地址
// 如果使用定制域名,可在“查询频道信息”接口中获取到频道的观看地址 watchUrl
// https://help.polyv.net/index.html#/live/api/v4/channel/operate/get_channel_detail
String url = "https://live.polyv.cn/watch/";
//TODO 设置为独立授权的频道号
String channelId = "2292421";
//TODO 设置观众id,同一个观众id,后面进入的会把前面的观众挤出频道
String userId = "sadboy";
String ts = String.valueOf(System.currentTimeMillis());
//url安全的base64编码
String nickname = "保利威";
nickname = new String(org.apache.commons.codec.binary.Base64.encodeBase64URLSafe(nickname.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
String avatar = "http://live.polyv.net/assets/images/avatars/9avatar.jpg";
String sign = DIRECT_SECRET_KEY+userId+DIRECT_SECRET_KEY+ts;
sign = LiveSignUtil.md5Hex(sign);
url += channelId+"?userid="+userId+"&ts="+ts+"&sign="+sign+"&nickname="+nickname+"&avatar="+avatar;
//浏览器直接访问url即可进入直播间
System.out.println(url);
}
程式碼範例(PHP)
<?php
$secretkey = "qwertyui"; //后台secretKey
$userid = "test" . rand(0, 5); //直播的用户ID
$ts = time() * 1000; //当前时间
$sign = md5($secretkey . $userid . $secretkey . $ts); //用于校验的sign
$nickname = urlencode(base64_encode("保利威")); //学员的昵称
$avatar = "http://live.polyv.net/assets/images/avatars/9avatar.jpg"; //学员的头像
$url = "https://live.polyv.cn/watch/108008";
$callbackUrl = $url . "?userid=" . $userid . "&nickname=" . $nickname . "&avatar=" . $avatar . "&ts=" . $ts . "&sign=" . $sign;
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>login</title>
</head>
<body>
<div id="btn">
<input type="button" onclick="openurl()" value="独立授权观看" class="btn" >
</div>
<script>
function openurl(){
location.href="<?php
echo $callbackUrl ?>";
};
</script>
</form>
</body>
</html>
展示效果
http://demo.ipolyv.cn/wfy/directAuth.php
注意事項
1、要保證提交的 userid 的唯一性,當多個觀眾使用同一個 userid 進入觀看頁時,較早登入的觀眾會被後面登入的觀眾踢出,觀看頁會提示 "帳號在另外的地方登入,您將被退出觀看。如下圖:

