Laravel 5:使用Laravel会话数据的Socket.io客户机authentication

我想基于由Laravel创build的客户端会话数据来validationsocket.io客户端。

我想到的是:

A – 从客户端发送用户名和电子邮件到服务器;

B – 在用户login后,将数据存储在我的socket.io服务器所需的Redis中,然后根据会话Cookie ID在Node.js中读取。 如果我更喜欢这种方法sessionId -> "email, name"我可能必须在Redis中存储sessionId -> "email, name"

C – 在Laravel中使用Redis会话驱动程序,解码由Laravel设置的Cookie,从Node.js访问Laravel会话值,对其进行反序列化和解码;

方法A显然非常不安全,只能用来certificate概念。

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

方法B看起来更有希望,实现起来更简单。 然而,使用方法B意味着我必须自己pipe理一些会话数据,以便socket.io能够读取它。 这样做可能会使我在Redis中存储的Laravel会话数据和会话数据相互不一致,而这会在某个时间点发生。 在某些极端的情况下,例如一个过期的会话ID可以被重用,并且一些socket.io客户端将被错误地authentication为另一个用户。 我现在不能想到更微不足道的情况,但是由于这种情况,我认为有可能存在这种情况,安全和用户体验都可能受到损害。

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

就我所能概括的而言,实际上访问Laravel和php之外的Laravel会话数据,并通过sessionId,电子邮件和用户名来识别客户端。

我build议你使用JSON Web令牌authentication。

JSON Web Token(JWt)是一种相对较新的令牌格式,用于空间受限的环境,如HTTP授权标头。 智威汤逊被devise为一种基于各方之间的安全请求转移方法。 有关智威汤逊的更多详细信息

使用Laravel最简单的方法就是使用一个像这样的包。 或者你可以通过你自己来实现它。

使用JWT身份validation您将能够从令牌访问用户。 例如:

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

有关如何使用“jwt-auth”的详细信息,请参阅此处 。

正如Alexandros已经提到的,你应该使用JWT。

使用socket.iovalidationJWT是一件轻而易举的事情。 如本文所述,您可以使用socketio-auth和jsonwebtoken来validation用户身份。 此外,您可以使用dotenv从Laravel .env文件读取签名令牌的秘密密钥。

对我来说,它工作正常,但你必须考虑令牌的无效。 在Laravel jwt-auth通过使用黑名单来处理这个问题。 所以在你的节点服务器中,你必须自己处理。 或者保持liftetime短。

大约一年前,我find了一个很好的解决scheme。 我决定把它作为一个模块,它非常易于使用。 可以帮助您获得cookie而不用硬编码。 帮助你获得会话ID并从mysql和redis中检索它

https://www.npmjs.com/package/node-laravel-session

这样你可以分享你所有的会话。 你也可以利用这个会话来为某些房间注册一个用户