gpt4 book ai didi

node.js - 403 禁止 - 使用 Passport.io + express + socket.io 跨子域的 socket.io 连接

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:08 25 4
gpt4 key购买 nike

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

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

我已检查我的 session cookie 是否已在客户端上设置 - “expressSid”,TLD 为 .domain.com。当我注释掉以 io.set("authorization"... 开头的 block 时,一切都会立即生效

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

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'));
});

最佳答案

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

我确实开始将明确的 secret 传递给 cookieParser,但我认为仅靠这一点并不能解决问题。我有几个 session cookie 在早期迭代的请求中传递。从浏览器中清除 cookie 解决了该问题。

关于node.js - 403 禁止 - 使用 Passport.io + express + socket.io 跨子域的 socket.io 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com