Php Laravel 5:Socket.io使用Laravel会话数据进行客户端身份验证

Php Laravel 5:Socket.io使用Laravel会话数据进行客户端身份验证,php,node.js,laravel,authentication,socket.io,Php,Node.js,Laravel,Authentication,Socket.io,我想根据Laravel创建的客户端会话数据对socket.io客户端进行身份验证 我想到的是: A-从客户端向服务器发送用户名和电子邮件 B-在用户登录后,将我的socket.io服务器需要的数据存储在php的Redis中,然后根据会话cookie id在Node.js中读取数据。 如果我喜欢这种方法,我可能必须在Redis中存储sessionId->“email,name” C-在Laravel中使用Redis会话驱动程序,解码Laravel设置的cookie,从Node.js访问Larave

我想根据Laravel创建的客户端会话数据对socket.io客户端进行身份验证

我想到的是:

A-从客户端向服务器发送用户名和电子邮件

B-在用户登录后,将我的socket.io服务器需要的数据存储在php的Redis中,然后根据会话cookie id在Node.js中读取数据。 如果我喜欢这种方法,我可能必须在Redis中存储
sessionId->“email,name”

C-在Laravel中使用Redis会话驱动程序,解码Laravel设置的cookie,从Node.js访问Laravel会话值,取消序列化并解码

方法A显然非常不安全,只能用于证明概念

方法C似乎更好,因为我不必复制或管理会话数据,而只需解码它。然而,这种方式将我的应用程序与Laravel管理会话的实现细节结合起来,因此似乎并不合适

方法B看起来更有希望,而且更容易实现。 然而,使用方法B意味着我必须自己管理一些会话数据,以便socket.io能够读取它。这样做可能会使Laravel会话数据和我存储在Redis中的会话数据相互不一致,这将在某个时间点发生。在某些极端情况下,例如,可以重用过期的会话id,并且某些socket.io客户端将作为另一个用户进行不正确的身份验证。我现在想不出比这更微不足道的案例了,但由于这种不一致性,我认为可能存在这种情况,并且安全性和用户体验都可能受到损害

在socket.io应用程序中,基于Laravel会话数据实现用户身份验证的更优雅、更健壮、更安全的方法是什么?如果没有更好的方法,并且我认为方法B是最好的,那么我可以做些什么来提高我使用Redis和Laravel会话数据管理的会话数据之间的一致性。


就我所能总结的全部要点而言,实际上是访问Laravel和php之外的Laravel会话数据,并通过sessionId、电子邮件和用户名识别客户端。

我建议您使用JSON Web令牌身份验证

JSON Web令牌(JWt)是一种相对较新的令牌格式,用于空间受限的环境,如HTTP授权头。JWT的体系结构是一种用于在各方之间传输安全声明的方法

使用Laravel实现这一点的最简单方法是使用类似的包。或者你也可以自己实现

使用JWT auth,您将能够从令牌访问用户。例如:

$user = JWTAuth::parseToken()->toUser();

有关如何使用“jwt auth”的详细信息,请查看。

正如Alexandros所指出的,您应该使用jwt

使用socket.io验证JWTs很容易。 您可以使用和(如本文所述)对用户进行身份验证。此外,您还可以使用从Laravel.env文件中读取签名令牌的密钥


对我来说,它工作得很好,尽管你必须考虑令牌的失效。在Laravel中,jwt auth通过使用黑名单来处理这个问题。因此,在节点服务器中,您必须自己处理这个问题。或者缩短寿命。

大约一年前,我就找到了一个很好的解决方案。我决定把它做成一个模块,它真的很容易使用。帮助您获取cookie而无需硬编码。帮助您获取会话Id并从mysql和redis中检索它


这样,您可以共享所有会话。您还可以利用该会话向用户注册某些房间

这似乎比我想象的要好得多。我读了关于JWT的书,我有了这个想法。不过,如果您稍微扩展一下您的答案,并解释为什么JWT可以很好地用于验证socket.io客户机(以防其他人有同样的问题),那就太好了。