Autobahn.js - 如何在订阅上传递数据

时间:2014-01-30 13:00:50

标签: php websocket wamp autobahn ratchet

我正在使用Ratchet和Autobahn.js。我想在订阅上进行一些用户验证,所以我需要将会话密钥传递给Ratchet WAMP服务器。你能告诉我如何在订阅活动中将一些数据传递给服务器吗?

2 个答案:

答案 0 :(得分:4)

我认为您不是在谈论身份验证,而是您已经与服务器建立了连接。

您无需从客户端传递会话ID,WAMP会为您处理。订阅时您可以传递的唯一信息是主题。

在php端,您可以访问可用于验证的会话ID。

public function onSubscribe(ConnectionInterface $conn, $topic) 
{
    $sessionId = $conn->WAMP->sessionId
}



替代解决方案:如果您真的必须从客户端传递会话ID,那么您可以执行以下操作:

使用Javascript:

var appSession = null;

ab.connect(
   // The WebSocket URI of the WAMP server
   wsuri,

   // The onconnect handler
   function (session) {
      appSession = session;
   }
);


appSession.call('myValidationChannelForUser', appSession.sessionid(), 'otherValidationParams').then(function(result)
{
    if (result.success)
    {
        console.log('you have been subscribed to xyz..');
    }
}

PHP:

public function onCall(ConnectionInterface $conn, $id, $fn, array $params) 
{ 
    $sessionId = $conn->WAMP->sessionId;

    if ($fn == 'myValidationChannelForUser')
    {
        // validation...
        // $params[0] == appSession.sessionid() passed from JS
        // $params[1] == otherValidationParams passed from JS

        // validation passed, subcribe to channel
        if (validated)
        {
            $this->onSubscribe(ConnectionInterface $conn, $topic); 

            return $conn->callResult($id, array('success' => 1);
        }
    }
}

答案 1 :(得分:1)

我猜您可以在继续订阅之前进行身份验证。

Autobahn已经与WAMP RPC实施了身份验证握手。

检查会话身份验证部分: http://autobahn.ws/js/reference/#Session_authreq

然而,Ratchet尚未实施WAMP CRA协议。 他们大约一年前为此创造了一张票。

那张票中有人分叉了Ratchet并自己实施了。

但是如果你可以将服务器切换到Autobahn Python可能会更容易,因为它已经支持WAMP CRA。