0

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

4

2 回答 2

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);
        }
    }
}
于 2014-02-13T18:17:16.737 回答
1

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

Autobahn 已经使用 WAMP RPC 实现了身份验证握手。

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

但是,Ratchet 还没有实现 WAMP CRA 协议。大约一年前,他们为此创建了一张票。

那张票中的某个人已经分叉了 Ratchet 并自己实现了它。

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

于 2014-02-12T08:35:24.410 回答