【发布时间】:2014-01-30 13:00:50
【问题描述】:
我正在使用 Ratchet 和 Autobahn.js。我想在订阅时进行一些用户验证,所以我需要将会话密钥传递给 Ratchet WAMP 服务器。你能告诉我如何在订阅事件中将一些数据传递给服务器吗?
【问题讨论】:
标签: php websocket wamp autobahn ratchet
我正在使用 Ratchet 和 Autobahn.js。我想在订阅时进行一些用户验证,所以我需要将会话密钥传递给 Ratchet WAMP 服务器。你能告诉我如何在订阅事件中将一些数据传递给服务器吗?
【问题讨论】:
标签: php websocket wamp autobahn ratchet
我假设您不是在谈论身份验证,并且您已经与服务器建立了连接。
您无需从客户端传递会话 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);
}
}
}
【讨论】:
我想您可以在继续订阅之前进行身份验证。
Autobahn 已使用 WAMP RPC 实现身份验证握手。
检查 会话验证 部分: http://autobahn.ws/js/reference/#Session_authreq
但是,Ratchet 尚未实现 WAMP CRA 协议。 大约一年前,他们为此创建了一张票。
那张票中的某个人已经分叉了 Ratchet 并自己实现了它。
但如果您可以将服务器切换到 Autobahn Python 可能会更容易,因为它已经支持 WAMP CRA。
【讨论】: