【问题标题】:403 forbidden - socket.io connection across subdomains with Passport.io + express + socket.io403 禁止 - 使用 Passport.io + express + socket.io 跨子域的 socket.io 连接
【发布时间】:2013-10-03 03:42:59
【问题描述】:

我在 data.domain.com 有一个 NodeJS express 服务器,而我的 AngularJS 客户端位于 subdomain.domain.com。我正在使用护照/快递在服务器上创建会话。然后我的客户端尝试连接到同一服务器上的 socket.io。我在 socket.io 连接上收到 403(禁止)。

我认为这是一个跨域问题。我已经在 express 服务器上启用了 COR。我正在使用我的服务器 data.domain.com 中的 TLD 设置一个 cookie,即 express cookie 域配置是 .domain.com。

我已检查我的会话 cookie 是否已在客户端上设置 - 'expressSid' 与 TLD .domain.com。当我注释掉开始 io.set("authorization"...

的块时,一切都会立即生效

一切都在 HTTPS 下运行。我正在使用 RedisStore 进行会话存储。

Passport.io / socket.io 配置:

io.configure(function () { 
   io.set('transports', ['xhr-polling']); 
   io.set('polling duration', 10); 
   io.set('log level', 1);

   io.set("authorization", passportSocketIo.authorize({
      cookieParser: express.cookieParser, //or connect.cookieParser
      key:          'expressSid',        //the cookie where express (or connect) stores its session id.
      secret:        expressSecret,  //the session secret to parse the cookie
      store:         sessionStore,      //the session store that express uses
      fail: function(data, accept) {      // *optional* callbacks on success or fail
     accept(null, false);              // second param takes boolean on whether or not to allow handshake
  },
  success: function(data, accept) {
    accept(null, true);
  }
 }));

});

快速配置:

var allowCrossDomain = function(req, res, next) {
    var oneof = false;
    if(req.headers.origin) {
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Credentials', true);
    oneof = true;
    }
    if(req.headers['access-control-request-method']) {
    res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
    oneof = true;
    }
    if(req.headers['access-control-request-headers']) {
    res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
    oneof = true;
}
if(oneof) {
    res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
}

// intercept OPTIONS method
if (oneof && req.method == 'OPTIONS') {
    res.send(200);
}
else {
    next();
}
};

appSecure.configure(function(){

   appSecure.use(allowCrossDomain);
   appSecure.use(express.cookieParser(expressSecret));
   appSecure.use(express.bodyParser());
   appSecure.use(express.methodOverride());
   appSecure.use(org.expressOAuth({onSuccess: '/home', onError: '/oauth/error'}));  // <--- nforce middleware
   appSecure.set('port', port); 
});

appSecure.configure('production', function(){
   appSecure.use(express.errorHandler());
   appSecure.use(express.session({ secret: expressSecret, store: sessionStore, key:'expressSid', cookie: { domain:'.domain.com'}})); 
   appSecure.use(passport.initialize());
   appSecure.use(passport.session());
   appSecure.use(appSecure.router);
   appSecure.use(express.static(__dirname + '/public'));
});

【问题讨论】:

  • 我认为我的问题是来自早期开发迭代的旧会话 cookie 在 socket.io 连接请求上发送。我清除了浏览器中的 cookie,一切似乎变得更好了。

标签: node.js express socket.io passport.js


【解决方案1】:

已通过清除 Chrome 中的浏览器 cookie 修复。

我确实开始将 express 秘密传递给 cookieParser,但我认为仅此一项并不能解决问题。我在早期迭代的请求中传递了几个会话 cookie。从浏览器中清除 cookie 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 2012-07-16
    • 2012-02-16
    • 1970-01-01
    • 2014-12-27
    • 2015-04-04
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多