连接时身份认证

UID

用户连上来时服务器判断如果是刚连的就发一个需要验证信息的命令让用户马上验证身份,具体要怎么做?

4765 3 1
3个回答

bevin1984

在onConnect里可以发起啊。

  • 暂无评论
walkor

可以使用定时器,在客户端onConnect后多久没有发送数据过来就close掉

如果是基于worker做的代码类似如下

$worker = new Worker(...);
$worker->onConnect = function($connection)
{
    $timeout = 5;
    // 这里timerId是给connection动态添加的属性,用来保存这个connection的关连接的定时器id
    // 方便后面身份验证后删除定时器
    $connection->timerId = Timer::add($timeout, function($connection){
        $connection->close();
    }, array($connection), false);
};
$worker->onMessage = function($connection, $data)
{
    // $connection->timerId不为空,则该连接还没验证,则尝试验证
    if(!empty($connection->timerId))
    {
        // 你的验证函数,验证ok
        if(you_check_auth_func($data))
        {
            // 删除定时器
            Timer::del($connection->timerId);
            // 删除timerId,标记已经验证ok
            $connection->timerId = null;
        }
        // 没通过验证则关闭连接
        else
        {
            $connection->close();
        }
    }
};

如果是基于GatewayWorker做的
简单的方法是使用心跳来做,服务端设置心跳间隔,如果客户端在制定时间内没有发来数据则断开连接。参考手册 http://gatewayworker-doc.workerman.net/gateway-worker-development/heartbeat.html

如果觉得心跳不能满足要求,下面是GatewayWorker的做法,与基于worker的方法类似

class Event
{
    public static function onConnect($client_id)
    {
        // 设置一个定时器,$timeout 秒后关闭连接
        $timeout = 5;
        $_SESSION = Timer::add($timeout, function($client_id){
            Gateway::closeClient($client_id);
        }, array($client_id), false);
    }

    public static function onMessage($client_id, $data)
    {
        // 如果没有验证过则尝试验证
        if(!empty($_SESSION))
        {
            // 验证通过
            if(your_check_auth_func($data))
            {
                // 删除定时器
                Timer::del($_SESSION);
                // 删除timerId,标记已经验证ok
                unset($_SESSION);
            }
            // 没验证通过则关闭连接?
            else
            {
                Gateway::closeClient($client_id);
            }
        }
        .....
    }

}
  • 暂无评论
UID

3Q试下

  • 暂无评论
年代过于久远,无法发表回答
🔝