首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Passport.socketio有查找会话的问题

Passport.socketio有查找会话的问题
EN

Stack Overflow用户
提问于 2014-08-22 22:52:59
回答 5查看 4.9K关注 0票数 2

我试图从套接字访问会话,但似乎无法建立连接。毫无疑问,授权会失败,我将得到带以下消息的fails回调:

代码语言:javascript
复制
failed connection to socket.io: No session found

我将把我的所有代码放在这里,这样就可以更容易地发现我做错了什么。

代码语言:javascript
复制
var express  = require('express');
var app      = express();
var http     = require('http');
var socketio = require('socket.io')
var passportSocketIo = require('passport.socketio');
var port     = process.env.PORT || 3000;
var mongoose = require('mongoose');
var passport = require('passport');
var flash    = require('connect-flash');

var morgan       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var session      = require('express-session');
var MongoStore   = require('connect-mongo')(session);

var server   = http.createServer(app);
var io       = socketio.listen(server);

var dbConfig = require('./config/database.js');
mongoose.connect(dbConfig.url);
var sessionStore = new MongoStore({ db: mongoose.connection.db });

require('./config/passport')(passport);

app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.set('view engine', 'ejs');

app.use(session({
    key: 'connect.sid',
    secret: 'secret',
    store: sessionStore,
    resave: true,
    saveUninitialized: true
}));

app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use(express.static(__dirname + '/public'));

require('./app/routes.js')(app, passport);

server.listen(3000, function() {
    console.log('App running on port: ' + port);
});

io.use(passportSocketIo.authorize({
    passport:     passport,
    cookieParser: cookieParser,
    key:          'connect.sid',
    secret:       'secret',
    store:        sessionStore,
    success:      onAuthorizeSuccess,
    fail:         onAuthorizeFail
}));

function onAuthorizeSuccess(data, accept){
  console.log('successful connection to socket.io');
  accept(null, true);
}

function onAuthorizeFail(data, message, error, accept){
  if(error)
    throw new Error(message);
  console.log('failed connection to socket.io:', message);
  accept(null, false);
}

io.sockets.on('connection', function(socket) {
    var date = new Date();
    var time = date.getHours() + ":" + date.getMinutes();
    socket.emit('message', {username: 'Server', message: 'welcome to the chat'});
    socket.on('send', function(data) {
        io.sockets.emit('message', data);
    });
});

我应该如何与socket.io建立与会话的连接?

此外,我还看到用户数据是通过socket.handshake.user访问的。在这种情况下这是正确的吗?

为了清楚起见,这些版本如下:

代码语言:javascript
复制
express: 4.8.5
passport: 0.2.0
socket.io: 1.0.6
passport.socketio: 3.2.0

编辑

问题的一部分似乎是已经存在的localhost127.0.0.1的错误。然而,现在我没有得到任何握手数据。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-09-25 20:28:25

首先,正如我在问题编辑中所指出的,请确保直接键入IP,而不是使用localhost127.0.0.1。这是一个已知的错误,当指向localhost时,它将不允许您正确地发送cookie。

针对Github页面 1.x的授权回调,护照-socketioGithub页面最终被更新如下。

代码语言:javascript
复制
function onAuthorizeSuccess(data, accept){
  console.log('successful connection to socket.io');
  accept();
}

function onAuthorizeFail(data, message, error, accept){
  console.log('failed connection to socket.io:', data, message);
  if(error)
    accept(new Error(message));
}

此外,握手数据不再存储在相同的位置。将socket.handshake.user替换为socket.request.user

票数 3
EN

Stack Overflow用户

发布于 2014-09-25 12:51:33

我也有同样的问题。对我来说,解决方案不是在web服务器上,而是由于在浏览器中调用localhost。改变到127.0.0.1或我的文化IP使生活更快乐。

还请参见对:Javascript document.cookie总是空字符串的答复和评论

票数 1
EN

Stack Overflow用户

发布于 2014-09-01 14:37:57

passport.socketio不适用于新版本的socket.io。

您应该能够删除passport.socketio并将当前的io.use替换为下面的一个:

代码语言:javascript
复制
var cookieParser = require('cookie-parser')('secret'); // <- your secret here
io.use(function(socket, next){
    cookieParser(socket.handshake, {}, function(err){
        if (err) {
            console.log("error in parsing cookie");
            return next(err);
        }
        if (!socket.handshake.signedCookies) {
            console.log("no secureCookies|signedCookies found");
            return next(new Error("no secureCookies found"));
        }
        sessionStore.get(socket.handshake.signedCookies["connect.sid"], function(err, session){
            socket.session = session;
            if (!err && !session) err = new Error('session not found');
            if (err) {
                 console.log('failed connection to socket.io:', err);
            } else {
                 console.log('successful connection to socket.io');
            }
            next(err);
        });
    });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25456656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档