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

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;
    }
}
时间: 2024-11-10 13:51:31

WebSocket实战之——携带Token验证绑定clientId到uid(微信)的相关文章

微信公众平台开发配置项:Token验证

最近由于项目接触了下微信公众号,遇到了token验证失败的问题 ,微信公众号开发文档上示例是php,而且感觉有点混乱,网上百度了一些方案,但总感觉少点什么,所以写下自己解决的全过程,以供大家参考下,能或多或少的帮大家节约下时间.话不多说,我们看下面这张图, token验证失败,苦逼的只能继续看微信公众号开发文档,文档中接入指南是这么写的: 接入概述 接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 ...哇!!! 微

token 验证失败 可能的问题分析

真的得好好看文档,但是由于工作的需要,我们都在赶进度,其实慢下来,仔细看文档,会给你省不少时间. 进入正题. 请看微信接入指南 划横线的这一部分其实很重要,值得仔细推敲. 上面说了,原样返回echostr参数内容,可是如果你在返回echostr之前有任何输出,都将导致token验证失败,无法接入微信. 比如一些php的warning,notice之类的警告,还有一些空格之类的空白字符,都可能导致无法成功接入微信.

thinkphp3.2微信开发者模式 绑定url token 您的服务器没有正确相应token验证

当打开调试模式后就会出现此问题thinkphp3.2微信开发者模式 绑定url token 您的服务器没有正确相应token验证,布布扣,bubuko.com

关于vue的前端项目中token使用以及验证机制 携带token登录详情 vue-router的跳转说明

在login.vue中通过发送http请求获取token//根据api接口获取tokenvar url = ‘http://www.baidudd.com’ + "/session";this.$axios.post(url, {username: this.loginForm.username,password: this.loginForm.pass}).then(res => {// console.log(res.data);this.$message.success('

web api token验证理解

最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 self contained),户口本不会过期(用户名和密码什么时候都有用),携带不方便(用户名和密码从数据库验证),jwt同样也有身份证的缺点,丢了别人有些地方可以用,户口本改名字了,身份证还可以用(同样,用户名和密码修改后jwt不修改).针对身份证的缺点,可以设置较短过期时间,另外token

微信公众号 报token验证失败

最近两天一直碰到token验证失败的问题,如下图所示 然后上网疯狂的搜索答案,碰到的人还真不少,原因大概有这几个: 1)服务器URL未实名认证 2)token重名(基本不可能) 3)服务器部署的项目 访问异常(比如404等) 无奈了,自己都是好的啊这些. 服务器URL已经实名认证,token也没有问题,项目在本地和服务器均正常,到底是什么原因那? 自己用的是阿里云的服务器,刚开始怀疑是绑定的域名的问题.由于自己使用了A域名绑定 以及 隐形URL域名,应该没什么问题吧. 但是无论如何还是一直报to

获取token,绑定微信号,自定义菜单,事件响应demo

摘要: 这个demo包含了获取token,绑定微信号,设置自定义菜单,响应文本和事件 这个教程的基础篇和提升篇都看完了,总感觉有点隔靴挠痒的感觉,讲的东西我都懂,没有吸收多少新鲜的知识.貌似还没有我这个一年前写的脚本好呢,估计也是照顾新人吧.期待高级篇的讲解,不过现在高级篇估计还在录制当中,所以对微信公众平台开发的学习就先到这里吧. 下面介绍一下我很久以前写的这个脚本.基本上常用的几个功能都有了,access_token的获取,用户的微信号和公司的账号的绑定,查询公司服务器上的数据,自定义表单什

IdentityServer4实战 - 谈谈 JWT Token 的安全策略

一.前言 众所周知,IdentityServer4 默认支持两种类型的 Token,一种是 Reference Token,一种是 JWT Token .前者的特点是 Token 的有效与否是由 Token 颁发服务集中化控制的,颁发的时候会持久化 Token,然后每次验证都需要将 Token 传递到颁发服务进行验证,是一种中心化的比较传统的验证方式.JWT Token 的特点与前者相反,每个资源服务不需要每次都要都去颁发服务进行验证 Token 的有效性验证,该 Token 由三部分组成,其中

token验证机制

最近在vue-cli项目实现登录的过程中用到了token验证,在此总结如下 1. 登录时,客户端通过用户名与密码请求登录 2. 服务端收到请求去验证用户名与密码 3. 验证通过,服务端会签发一个Token,再把这个Token以响应发给客户端. 4. 客户端收到Token,存储到本地,如Cookie,SessionStorage,LocalStorage.我们是存在cookie 5. 客户端每次像服务器请求API接口时候,都要带上Token. 6. 客户端每次跳转路由的时候也要验证Token登录态