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

7

我希望能够基于Laravel创建的客户端会话数据来验证socket.io客户端。

我的想法是:

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

B - 用户登录后在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客户端将被错误地验证为另一个用户。我目前无法想到更微不足道的情况,但由于这种不一致性,我认为存在这种情况并且安全性和UX都可能会受到影响。

有没有更优雅,更强大,更安全的方法来实现基于Laravel会话数据的用户身份验证?如果没有更好的方法,我假设方法B是最好的,那么我能做什么来提高Redis中管理的会话数据与Laravel会话数据之间的一致性。

总的来说,关键是在Laravel和php之外访问Laravel会话数据,并通过sessionId、email和username识别客户端。

3个回答

7

我建议您使用JSON Web Token身份验证。

JSON Web Token(JWt)是一种相对较新的令牌格式,用于空间受限的环境,例如HTTP授权标头。 JWT的架构被设计为在各方之间传输基于安全性声明的方法。有关JWT的更详细信息

使用Laravel进行此操作的最简单方法是使用像这样的软件包。或者您也可以自行实现。

使用JWT身份验证,您将能够从令牌中访问用户。 例如:

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

关于如何使用 'jwt-auth' 的详细信息,请查看此处


2
这似乎比我想的更好。我了解了JWT并理解了它的概念。如果您能进一步解释为什么JWT适用于验证socket.io客户端,那就太好了(以防其他人有同样的问题)。 - Boris D. Teoharov

1

如Alexandros所述,您应该使用JWT。

使用socket.io验证JWT非常简单。 您可以像这篇文章中描述的那样使用socketio-authjsonwebtoken来验证用户。此外,您可以使用dotenv从Laravel .env文件中读取签名令牌的密钥。

对我而言,它运行良好,尽管您必须考虑令牌的失效。在Laravel jwt-auth中通过使用黑名单来处理此问题。因此,在您的节点服务器上,您必须自己处理此问题。或者将生命周期保持较短。


0

大约一年前,我找到了一个很好的解决方案。我决定将其制作成一个模块,非常容易使用。它可以帮助您获取cookie而无需硬编码。还可以帮助您获取会话ID并从mysql和redis中检索它。

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

这样你就可以共享所有的会话。你还可以利用会话来将用户注册到特定的房间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接