【问题标题】:socket.io client namespace authorizationsocket.io 客户端命名空间授权
【发布时间】:2012-03-02 05:44:08
【问题描述】:

Node.js 似乎有在文档不足或没有文档的情况下获取有用模块的诀窍。 socket.io 就是这样一个模块。我想为命名空间使用内置的授权功能,但我不知道在客户端这将如何工作。服务器端,他们提供了足够的文档,但除此之外我不确定。

编辑:我不想知道如何从客户端获取 cookie 数据——我知道该怎么做,而是如何直接从客户端传递数据(例如用户名和密码)客户端,通过 javascript。

【问题讨论】:

    标签: authentication node.js authorization real-time socket.io


    【解决方案1】:

    有很多关于使用 Socket.IO 进行授权的不错的文档:https://github.com/LearnBoost/socket.io/wiki/Authorizing(向下滚动到“命名空间授权”和“客户端如何处理全局授权”)

    您具体要达到什么目标?这听起来有点像您试图通过 Socket.IO “发布”用户名/密码。 Socket.IO 身份验证发生在握手阶段,因此您可以执行以下操作:

    • 在通用授权后“发出”用户名/密码组合(希望您使用 TLS),并在身份验证错误后断开用户(相当平庸的方法 IMO)

    • 请改用服务器端会话信息进行身份验证。这可能是所需的方法,因为您的服务器端握手数据应该包含您需要确定用户是否经过身份验证的所有内容。您应该在连接到套接字之前依赖对 HTTP 会话的身份验证,这样您就不会在每次尝试连接到 socket.io 时都传输用户名/密码组合(如果您回退,这可能会很多在 XHR 上)。有很多关于此的文章,但这是一个好的开始:http://www.danielbaulig.de/socket-ioexpress/

    【讨论】:

    • 对于这个特定的项目,我保证使用 Websockets,它们是 TLS。我的大部分代码库都在 PHP 中,我只是使用 Node.js 进行实时同步——我宁愿不必更改我的会话 cookie 以供 PHP 和 Node.js 访问。
    • 您不一定需要更改会话 cookie。如果您使用的是分散式会话存储(例如 Redis),您可以直接查询该存储。例如:io.of('/private').authorization(function (handshakeData, callback) { sessionStore.get(cookie['sid'], function(err, session) { if (err || !session) { callback('Error', false); } else { data.session = session; callback(null, true); } }); });
    • 你好像不明白:这有两个问题。首先,我没有使用会话 cookie,其次,我有一个框架,用于这个项目的一个单独部分,用于用 PHP 编写的会话 cookie。
    • 如果您无法访问任何会话,您可以完全忽略 handshakeData 并在握手完成后调用您的 PHP auth API。所以基本上我提到的第一个子弹。允许完整的握手并处理您自己的身份验证。您还可以在握手中使用查询参数来处理身份验证,但是您必须处理每次握手时发送的那个。同样,很难根据您的帖子确切地确定您要做什么,但您的架构似乎从一开始就受到限制。
    • 确实是高度限制,但我几乎别无选择。我在临近截止日期的时候被重新分配到这个项目,现在我是唯一一个在做这个项目的人。由于没有时间对其进行重组,我不得不围绕架构进行工作。如果我有更多的时间,我可能会重写它。不过,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多