WebSocket实战之——携带Token验证绑定clientId到uid(微信)

时间:2016-10-16 13:47:17   收藏:0   阅读:7602

 

HTML代码:通过为、

<!DOCTYPE>
<html>
<meta charset="utf-8"/>
<title>WebSocket Test</title>
<script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
    var wsUri = "ws://120.26.220.223:8283";
    var output;
    var clientId;

    function init() {
        output = document.getElementById("output");
        testWebSocket();
        websocket.send("hello \n");
    }

    function testWebSocket() {
        websocket = new WebSocket(wsUri);
        websocket.onopen = function (evt) {
            onOpen(evt)
        };
        websocket.onclose = function (evt) {
            onClose(evt)
        };
        websocket.onmessage = function (evt) {
            onMessage(evt)
        };
        websocket.onerror = function (evt) {
            onError(evt)
        };
    }
    function onOpen(evt) {
        writeToScreen("CONNECTED");
    }

    function onClose(evt) {
        writeToScreen("DISCONNECTED");
    }

    function onMessage(evt) {
        writeToScreen(<span style="color: blue;">RESPONSE:  + evt.data + </span>);
    }

    function onError(evt) {
        writeToScreen(<span style="color: red;">ERROR:</span>  + evt.data);
    }

    function forExample() {
        var myJsonStr = setJson(myJsonStr, "clientId", clientId);
        myJsonStr = setJson(myJsonStr, "type", "say");
        myJsonStr = setJson(myJsonStr, "userId", "565081");
        myJsonStr = setJson(myJsonStr, "userName", "龙隆蟀舞");
        myJsonStr = setJson(myJsonStr, "userImage", "http:\/\/wx.qlogo.cn\/mmopen\/eMWJkc6M6KoWxQqLKuGfPjxRPGO3SmMjeY0I0jJ6WTdGwaEuBm6Z42SsHtVG3afwD71HLb0ZBV8DepIYGVDdVVscQdyQ4siax\/0");
        myJsonStr = setJson(myJsonStr, "roomId", "005");
        myJsonStr = setJson(myJsonStr, "message", "哇哈哈哈哈");
        myJsonStr = setJson(myJsonStr, "time", "1470300123908");
        writeToScreen("EXAMPLE: " + myJsonStr);
    }

    function writeToScreen(message) {
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
    }

    //添加或者修改json数据
    function setJson(jsonStr, name, value) {
        if (!jsonStr)jsonStr = "{}";
        var jsonObj = JSON.parse(jsonStr);
        jsonObj[name] = value;
        return JSON.stringify(jsonObj)
    }

    function toJson(str) {
        var json = eval(( + str + ));
        return json;
    }

    function sub(){
        var $userId = 123456;
        websocket.send("{‘user_id‘:"+$userId+"}"+"\n");
    }
    window.addEventListener("load", init, false);
</script>

<h2>WebSocketDemo</h2>
        token:<input type="text" name="token" id="token"><p></p>
        数据:<input type="text" style="height: 50px; width: 100%;" name="data" id="data"><p></p>
        <button id="submit" onclick="sub()" >提交</button> <p></p>
        <button id="submit" onclick="forExample()" >JSON数据</button> <p></p>

<div id="output"></div>
</html>

通过JS的websocket直接向消息服务器发送消息:

 //自动检查当前页面时候可以观看

    function authCheck($parm,$flag,$isRepeal) {
        if($isRepeal == false){
            closeVideo();
            return false;
        }
        var returnCode; // 存放同步过来的数据
        var $openId = "{{openId}}";
        var $liveId = "{{live.id}}";
        console.warn($openId);
        var url = "/redis/authcheck";
        var data = {
            ‘openId‘: $openId,
            ‘liveId‘:$liveId
        };
        var $userId;
        $.ajax({
            ‘type‘: ‘POST‘,
            ‘url‘: url,
            ‘data‘: data,
            ‘dataType‘: ‘json‘,
            async: false,   //true 异步,false 同步
            success: function (response) {
                console.warn(‘这是第一次执行‘ + response);
                if (response.errcode == 200) {
                    returnCode = response.errcode;
                    if ($flag == false) {
                        //initPost($parm, $userId);
                        var data = {
                            user_id:response.user_id,
                            openId:response.openId,
                            sign:response.sign
                        };
                        websocket.send(JSON.stringify(data));//这里携带的参数将会在消息服务器端接受【】
                    }
                    console.log(‘恭喜你第一次执行时可以看直播视频了‘);
                    $(".channel").each(function () {
                        var ch = $(this);
                        var id = ch.attr("id");
                        var ad = ch.data("ad");
                        var HLS = "http://{{live.server|default(‘cdn1.amailive.com‘)}}/hls/" + id + ".m3u8";
                        ch.data("src", "");

                        var state = ch.data("state");
                        if (state != 3) {
                            if (ad != null && ad != "") {
                                ch.data("src", ad);
                            }
                            return;
                        }

                        $.get(HLS, function () {
                            ch.data("src", HLS);
                        }).fail(function () {
                            if (ad != null && ad != "") {
                                ch.data("src", ad);
                            }
                        });
                    });
                } else if (response.errcode == 500) {
//                    alert(‘500:‘+$userId);
                    $(".channel").each(function () {
                        var ch = $(this);
                        ch.data("src", "");
                    });
                    closeVideo();   //
                    console.log(‘你没有权限观看这个视频页面1111‘);
                } else {
                    $(".channel").each(function () {
                        var ch = $(this);
                        ch.data("src", "");
                    });
                    console.log(‘未知的错误‘);
                }
            }

        });
    }
    //    setInterval(‘authCheck()‘,10000);

 

 

【1】通过WEB服务端代码:绑定clientId和Uid

  //将 client_id 与 uid 绑定
    public function bindUserAction()
    {
        header("Access-Control-Allow-Origin:*");
        header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
        Gateway::$registerAddress = ‘120.26.220.223:1238‘;
        $userId = $this->request->getPost(‘userId‘);
        $clientData = json_decode($this->request->getPost(‘clientData‘), true);
        $clientId = Gateway::bindUid($clientData[‘clientId‘], $userId);
        if($clientId == true){
            $result = array("errcode" => 200, "errmsg" => "bind userId success", "status" => "{$clientId}");
            return $this->toJson($result);
        }
        $result = array("errcode" => 500, "errmsg" => "bind userId fail", "status" => "{$clientId}");
        return $this->toJson($result);
    }

【2】通过消息服务端代码:绑定clientId 和Uid(携带参数验证的)

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     *
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        // 向当前client_id发送数据
        $arr = array(‘status‘ => ‘Connection Success‘, ‘clientId‘ => $client_id);
        Gateway::sendToClient($client_id, json_encode($arr));
    }

    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public static function onMessage($client_id, $message)
    {
        $msgDate = json_decode($message, true);
        // 检测签名
        if (!isset($msgDate[‘sign‘])) {
            Gateway::sendToAll("$client_id:Signature cannot be empty");
            return false;
        }
        //获取本地token签名
        $signToken = self::checkSign($msgDate[‘user_id‘], $msgDate[‘openId‘]);
        //token签名验证通过则绑定uid
        if ($signToken != $msgDate[‘sign‘]) {
            Gateway::sendToAll("$client_id:Signature verification failed or expired");
            return false;
        }
        GateWay::bindUid($client_id, $msgDate[‘user_id‘]);
        Gateway::sendToAll("$client_id:$message");
    }

    /**
     * 当用户断开连接时触发
     * @param int $client_id 连接id
     */
    public static function onClose($client_id)
    {
        // 向所有人发送
        //GateWay::sendToAll("$client_id logout");
    }

    // 服务端签名
    public static function checkSign($uid, $openId)
    {
        $key = ‘http://ford4s.amailive.com/‘;
        $sign = md5($key . $uid . $openId);
        return $sign;
    }
}

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!