繁体   English   中英

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

[英]Laravel 5: Socket.io client authentication using Laravel session data

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

我想到的是:

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

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

C - 在Laravel中使用Redis会话驱动程序,解码由Laravel设置的cookie,从Node.js访问Laravel会话值,反序列化和解码它们;

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

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

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

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

就我总结而言,重点实际上是访问Laravel和php之外的Laravel会话数据,并通过sessionId,email和username识别客户端。

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

JSON Web Token(JWt)是一种相对较新的令牌格式,用于空间受限的环境,例如HTTP Authorization标头。 JWT的架构是一种基于各方之间转移安全声明的方法。 有关JWT的更多详细信息

使用Laravel最简单的方法是使用像这样的包。 或者你可以由yourserlf实现它。

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

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

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

正如Alexandros已经指出的那样,你应该使用JWT。

使用socket.io验证JWT是一件轻而易举的事。 您可以使用socketio-authjsonwebtoken本文中非常好地描述来验证您的用户。 此外,您可以使用dotenv从Laravel .env文件中读取签名标记的密钥。

对我来说它工作得很好,虽然你必须考虑令牌的失效。 在Laravel中,jwt-auth通过使用黑名单来解决这个问题。 因此,在您的节点服务器中,您必须自己处理。 或者保持提升时间。

大约一年前,我找到了一个很好的解决方案。 我决定把它变成一个模块,它非常容易使用。 帮助您获得cookie而无需对其进行硬编码。 帮助您获得该会话ID并从mysql和redis中检索它

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

这样你就可以分享你所有的会话。 您还可以利用会话以便将用户注册到某些房间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM