【问题标题】:What are the possible ways to authorize a websocket connection request in Express.io?在 Express.io 中授权 websocket 连接请求的可能方法是什么?
【发布时间】:2014-03-18 12:34:48
【问题描述】:

我遇到了两种可能性,我更喜欢在完全建立 websocket 之前执行检查的解决方案。

var express = require("express.io");
var app = express().http().io();

app.use(express.json());
app.use(express.cookieParser());
app.use(express.session({secret: process.env.COOKIESECRET}));

选项 1:如何获取 Express 会话对象?
更新:这可能不可行,因为 Express.io 注册了自己的“授权”功能,这使得 Express 会话可用于 Socket.io。

app.io.configure(function() {
  app.io.set("authorize", function(handshake, authorize) {
    // Cookie is available...?
    //handshake.headers.cookie
  });
});

选项 2:容易获得 Express 会话,但已建立连接。

app.io.route("test", function(req) {
  if(!req.session.IsAuthorized) {
    req.io.disconnect();
  }
});

【问题讨论】:

    标签: javascript node.js session express.io


    【解决方案1】:

    您可以传入对会话存储的引用,以便在配置套接字服务器时可用:

    var sessionStore = new express.session.MemoryStore();
    
    app.use(express.session({secret: process.env.COOKIESECRET, store: sessionStore}));
    

    我认为您应该能够通过将handshake.headers 对象与会话存储中的内容匹配来从那里获得其余部分。请注意,默认存储保存在内存中,这对于生产目的来说不是很好(但我猜现在还可以)。以上与您的选项1方法有关。

    【讨论】:

    • 虽然我在使用 thisthis 让 Redis 存储正常工作时遇到了麻烦,但我并没有特别询问这个问题。我的理解是 Express.io 已经结合了 Express 和 Socket.io 会话处理,如选项 2 所示。Express.io 已经定义了一个“授权”函数,它与您建议的会话匹配。
    • 您的问题是什么?我为您提供了在建立连接之前访问会话的方法,我理解这是您的问题。
    • 我已经用新的发现更新了这个问题。您推荐的内容已经由 Express.io 完成,因此选项 1 不可行(据我了解)。
    • app.io.configure 设置了自己的授权函数是正确的,但如果你愿意,你可以覆盖它(就像 JavaScript 中的任何东西一样)。
    • 我希望不要这样做,因为它提供了潜在有用的功能。我宁愿在 Express.io 框架内工作,而不是处理更新后出现的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多