Workerman的Event使用JWT身份认证导致的用户信息共享
以下是WS连接后进行JWT认证和Client绑定的代码
public static function onWebSocketConnect($client_id, $data)
{
// \Log::notice('WK:' . json_encode($data));
$data_get = $data['get'];
$res = [
'type' => 'connection',
'status' => 'error'
];
// 判断token
if (!isset($data_get['token'])) {
$res['msg'] = 'Token不存在';
Gateway::sendToClient($client_id, json_encode($res, JSON_UNESCAPED_UNICODE));
Gateway::closeClient($client_id);
} else {
// 判断格式是否正确
if (count(explode('.', $data_get['token'])) !== 3) {
$res['msg'] = 'Token格式错误';
Gateway::sendToClient($client_id, json_encode($res, JSON_UNESCAPED_UNICODE));
Gateway::closeClient($client_id);
} else {
// 获取登陆的用户
$user = null;
$user = auth('api')->setToken($data_get['token'])->user();
if (!$user) {
$res['msg'] = 'Token格式错误';
Gateway::sendToClient($client_id, json_encode($res, JSON_UNESCAPED_UNICODE));
Gateway::closeClient($client_id);
} else {
$res['status'] = 'success';
$res['msg'] = $user->toArray();
Gateway::sendToClient($client_id, json_encode($res, JSON_UNESCAPED_UNICODE));
Gateway::bindUid($client_id, $user->id);
}
}
}
}
出现的问题是,当用户1访问后,用户2345…获取到的用户信息全都是用户1的信息,所有的ClientId也都被绑定到了用户1的上边。也就是最核心的这一句$user = auth('api')->setToken($data_get['token'])->user();
这要第一次setToken后无论后边Token的值如何改变$user都是第一个用户,求解!
解决方案,不生成对象,只使用JWT解析用户ID。
$user_id = JWTAuth::setToken($data_get['token'])->getPayload()->get('sub');
推荐文章: