我正在使用 Ratchet 和 Autobahn.js。我想在订阅时进行一些用户验证,所以我需要将会话密钥传递给 Ratchet WAMP 服务器。你能告诉我如何在订阅事件中将一些数据传递给服务器吗?
问问题
2335 次
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 回答