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

Laravel 5: Socket.io client authentication using Laravel session data

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

我想到的是:

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

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

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

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

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

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

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

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

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

JSON Web 令牌 (JWt) 是一种相对较新的令牌格式,用于 space-constrained 环境,例如 HTTP 授权 headers。 JWT 被设计为一种在各方之间传输安全声明的方法。 More detailed info about JWT

使用 Laravel 执行此操作的最简单方法是使用 this one 这样的程序包。或者你也可以自己实现。

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

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

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

正如 Alexandros 已经指出的,您应该使用 JWT。

使用 socket.io 验证 JWT 轻而易举。 您可以使用 socketio-auth and jsonwebtoken as described very well in this article to authenticate your users. Furthermore you could use dotenv 从 Laravel .env 文件中读取签名令牌的密钥。

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

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

检索它

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

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