Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用php websockets服务器获取经过身份验证的用户id?_Php_Javascript_Websocket - Fatal编程技术网

如何使用php websockets服务器获取经过身份验证的用户id?

如何使用php websockets服务器获取经过身份验证的用户id?,php,javascript,websocket,Php,Javascript,Websocket,我有一个web应用程序,其中我的用户已经在HTTP中进行了身份验证。在HTTP身份验证之后,我想接收视频通话。对于这个任务,我选择了WebSockets服务器(我编写了一个小的PHP CLI脚本) 有一个问题,我找不到在我的WebSocket守护程序上验证已验证用户身份的方法。(因为它是CLI应用程序,所以每个实例都有许多用户。) 我想,获取用户在握手请求中发送到我的WebSocket服务器的头是个好主意。我解析了Cookie并创建了一个会话,其中包含session\u id()和session

我有一个web应用程序,其中我的用户已经在HTTP中进行了身份验证。在HTTP身份验证之后,我想接收视频通话。对于这个任务,我选择了WebSockets服务器(我编写了一个小的PHP CLI脚本)

有一个问题,我找不到在我的WebSocket守护程序上验证已验证用户身份的方法。(因为它是CLI应用程序,所以每个实例都有许多用户。)

我想,获取用户在握手请求中发送到我的WebSocket服务器的头是个好主意。我解析了Cookie并创建了一个会话,其中包含
session\u id()
session\u start()

在许多电路板上,有建议通过JS发送用户id和一些密钥来识别用户,但这并不安全。也许我可以发送带有散列用户密码的用户id,我会将其存储在html的某个地方(js内联常量)?你觉得怎么样


在WebSocket服务器上对用户进行身份验证的最佳方法是什么?请记住,此用户已通过HTTP验证。

我强烈建议您不要使用他们的密码。不要通过WebSockets连接将其传递。一旦用户通过任何一种方式进行了身份验证,就不要再使用他们的密码

您是对的,您不能对同一服务器实例中的多个用户使用
session\u start()
。相反,您必须单独存储用户的数据,并将其与TCP套接字句柄相关联。(TCP套接字句柄是由
socket\u accept()
返回的值)

例如,在WebSockets服务器中,有一个用户类,您可以在其中为每个连接实例化一个新对象。此用户对象将在连接时保持其状态

用户向web应用程序进行身份验证后,在HTTP响应中,在HTTP头或正文(如HTML头中的元素属性)中,作为Javascript中的赋值,或任何对您有意义的地方,发送唯一的。还要将此唯一值存储在WebSockets服务器可以访问的位置,以及分配给它的用户和时间戳

在客户端Javascript中,一旦WebSockets连接建立,就发送安全令牌

在服务器端,只需将令牌与web脚本存储的令牌进行比较,并确保时间戳是最新的。这将告诉您哪个用户刚刚登录,并允许您从数据库中提取他们的首选项

关于时间戳过期的注意事项:WebSockets是一个实时通信系统,在大多数情况下,WebSockets连接是在页面加载期间或
onload
事件后不久建立的。除非您在打开WebSockets连接之前等待用户交互,否则接受超过几分钟的令牌是没有意义的。为了避免会话劫持尝试,请只接受使用特定令牌的第一个连接,不要接受旧令牌

一旦他们连接起来,只要他们保持连接,您就可以至少像使用$\u会话变量一样确定用户的身份。(TCP劫持可能会发生,但攻击者可能已经受到了MITM攻击,并且他们的PHP会话在TCP劫持开始之前就已经完全被破坏了。)