Python套接字服务器使用令牌进行客户端身份验证
问题描述
基本上我想解决两个问题:
客户端在初始化与服务器的连接时发送查询字符串
服务器端在握手中验证用户令牌(不是在建立连接之后,然后验证包含令牌的流消息),并相应地设置用户会话。
我读了一篇文章(https://auth0.com/blog/2014/01/15/auth-with-socket-io/),其中谈到了在NodeJS中实现的这个过程,我只是想知道使用Python是否可以实现相同的功能。(目前我正在做一些关于扭曲的研究,但没有发现任何类似的东西)
PS:我想演示用例也很有帮助。用户可以通过正常的http登录到您的服务器,然后服务器将向他/她颁发有效的访问令牌。然后,该用户可能需要与服务器(或其他服务器)建立套接字连接,然后服务器需要在建立套接字连接之前查明用户是谁并进行验证。解决方案
查询字符串是HTTPURL的一部分。
如果您构建的是一个TCP套接字服务器而不是HTTP服务器,则不会获得URL、头或任何其他带外内容。*您得到的只是一个数据流。您需要为您的数据制定一个可以容纳令牌的协议。
这意味着服务器无法"在建立套接字连接之前弄清用户是谁并进行验证"。它必须建立套接字连接、读取第一条消息、对其进行解析、验证令牌,然后丢弃或继续连接。(当然,您可以建立一个前端服务器,该服务器接受连接、验证它们,然后将它们迁移或代理到真正的后端服务器。但必须有人接受、阅读和分析。)
请注意,这正是HTTP所做的-在接受连接并读取第一行数据之前,它看不到查询字符串。
同时,您看到的示例似乎使用的是WebSockets。WebSockets客户端一开始就不能与套接字服务器通信(除非您在套接字服务器上构建WebSockets服务器,或者在其前面建立代理)。
*这不完全正确。您可以将40个字节的选项塞进TCP报头扩展。但是,你必须低于人们通常谈论的"套接字服务器"的水平--而且很有可能它不会通过互联网。此外,确实有"带外"数据的概念,但这在这里并不相关;您仍然必须接受连接并从中读取才能获得OOB数据。
相关文章