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

Posted

技术标签:

【中文标题】Laravel 5:使用 Laravel 会话数据的 Socket.io 客户端身份验证【英文标题】:Laravel 5: Socket.io client authentication using Laravel session data 【发布时间】:2015-09-22 21:00:56 【问题描述】:

我想根据 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 会话数据和我存储在 Redis 中的会话数据相互不一致,这将在某个时间点发生。在某些极端情况下,例如过期的会话 id 可能会被重用,并且某些 socket.io 客户端将被错误地验证为另一个用户。目前我想不出更琐碎的案例,但由于这种不一致,我认为可能存在这种情况,安全性和用户体验都可能受到损害。

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

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

【问题讨论】:

【参考方案1】:

我建议你使用 JSON Web Token 认证。

JSON Web 令牌 (JWt) 是一种相对较新的令牌格式,用于空间受限的环境,例如 HTTP 授权标头。 JWT 被构建为一种在各方之间传输安全声明的方法。 More detailed info about JWT

使用 Laravel 最简单的方法是使用像 this one 这样的包。或者你可以自己实现。

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

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

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

【讨论】:

这似乎比我想象的要好得多。我阅读了有关 JWT 的信息,我明白了。但是,如果您稍微扩展您的答案并解释为什么 JWT 可以很好地验证 socket.io 客户端(以防其他人有同样的问题),那就太好了。【参考方案2】:

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

使用 socket.io 验证 JWT 轻而易举。 您可以使用socketio-auth 和jsonwebtoken,正如article 中所描述的那样,对您的用户进行身份验证。此外,您可以使用 dotenv 从 Laravel .env 文件中读取签名令牌的密钥。

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于Laravel 5:使用 Laravel 会话数据的 Socket.io 客户端身份验证的主要内容,如果未能解决你的问题,请参考以下文章

会话如何在 Laravel 5 中工作

在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据

如何在 Laravel 5 中的视图模板上显示会话数据

Laravel 5 异步 AJAX 请求导致会话问题

Laravel 5.1 - 每次刷新时会话重新生成

会话不是用 Laravel 5 编写的