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