好的,Greg 非常友好地提供了一个完整的客户端实现示例,所以我不会再做任何事情了。它只需对我能想到的几乎所有用例进行一些调整和修改即可工作。我会将他的答案标记为正确答案。但他的意见只涵盖了后端实现的理论,所以我将尝试在这里填补空白以备后验。
不过我必须指出,这里的解决方案并不完整,因为它没有在我的 SPA/REST 连接和我的 WS 连接之间提供共享会话。
我发现高速公路传输的身份验证请求实际上是 RPC 的变体,并且出于某种原因硬编码的主题名称奇怪地类似于常规 url:
- 'http://api.wamp.ws/procedure#authreq' - for auth requests
- 'http://api.wamp.ws/procedure#auth' - for signed auth client responses
我需要在我的 Laravel routes.php 中再创建两条路线
// WS CRA routes
Latchet::topic('http://api.wamp.ws/procedure#authreq', 'app\\socket\\AuthReqController');
Latchet::topic('http://api.wamp.ws/procedure#auth', 'app\\socket\\AuthReqController');
现在,Latchet 控制器有 4 种方法:subscribe
、publish
和。由于 autobahn 发出的 authreq 和 auth 调用都是 RPC 调用,它们由控制器上的方法处理。call
unsubscribe
call
该解决方案首先由 oberstet 提出,然后由 Greg 支持,该解决方案描述了根据请求生成的临时身份验证密钥和秘密,并临时保留足够长的时间以供 WS CRA 程序验证。因此,我创建了一个生成持久键值对的 REST 端点。这里不包括端点,因为我确信这是微不足道的。
class AuthReqController extends BaseTopic {
public function subscribe ($connection, $topic) { }
public function publish ($connection, $topic, $message, array $exclude, array $eligible) { }
public function unsubscribe ($connection, $topic) { }
public function call ($connection, $id, $topic, array $params) {
switch ($topic) {
case 'http://api.wamp.ws/procedure#authreq':
return $this->getAuthenticationRequest($connection, $id, $topic, $params);
case 'http://api.wamp.ws/procedure#auth':
return $this->processAuthSignature($connection, $id, $topic, $params);
}
}
/**
* Process the authentication request
*/
private function getAuthenticationRequest ($connection, $id, $topic, $params) {
$auth_key = $params[0]; // A generated temporary auth key
$tmpUser = $this->getTempUser($auth_key); // Get the key value pair as persisted from the temporary store.
if ($tmpUser) {
$info = [
'authkey' => $tmpUser->username,
'secret' => $tmpUser->secret,
'timestamp' => time()
];
$connection->callResult($id, $info);
} else {
$connection->callError($id, $topic, array('User not found'));
}
return true;
}
/**
* Process the final step in the authentication
*/
private function processAuthSignature ($connection, $id, $topic, $params) {
// This should do something smart to validate this response.
// The session should be ours right now. So store the Auth::user()
$connection->user = Auth::user(); // A null object is stored.
$connection->callResult($id, array('msg' => 'connected'));
}
private function getTempUser($auth_key) {
return TempAuth::findOrFail($auth_key);
}
}
现在在这里的某个地方我出错了。因为如果我应该继承我的应用程序持有的 ajax 会话,我将能够从任何其他基于 WS Latchet 的控制器调用 Auth::user() 并自动显示当前登录的用户。但这种情况并非如此。因此,如果有人看到我做错了什么,请大声疾呼。请!
由于我无法获得共享会话,因此我目前正在通过将真实用户名作为 RPC 调用传输而不是执行完整的 CRA 来作弊。