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 客户端身份验证的主要内容,如果未能解决你的问题,请参考以下文章