Node.js Passport.socketio:握手总是未经授权的

Node.js Passport.socketio:握手总是未经授权的,node.js,express,socket.io,passport.js,Node.js,Express,Socket.io,Passport.js,我是一个节点初学者,有以下问题。我使用express、socket.io和passport以及passport.socketio和MongoStore 我需要使用passport对socket.io进行身份验证(我使用passport.socketio进行验证),但即使成功登录,握手也始终是未经授权的。以下是我目前的代码: var http = require('http') var socketio = require('socket.io') var express = require('e

我是一个节点初学者,有以下问题。我使用express、socket.io和passport以及passport.socketio和MongoStore

我需要使用passport对socket.io进行身份验证(我使用passport.socketio进行验证),但即使成功登录,握手也始终是未经授权的。以下是我目前的代码:

var http = require('http')
var socketio = require('socket.io')
var express = require('express')
var stylus = require('stylus')
var passport = require('passport')
var passportSocketIo = require('passport.socketio')
var LocalStrategy = require('passport-local').Strategy
var mongo = require('mongoskin')
var MongoStore = require('connect-mongo')(express)

var DB = mongo.db('mongo://127.0.0.1/accounts', {safe:false})
DB.bind('accounts')
DB.bind('SessionStore')

SessionStore = new MongoStore({ db: 'SessionStore' })


var app = express()  

app.configure(function () {
  app.set('views', __dirname + '/views')
  app.set('view engine', 'jade')
  app.use(express.cookieParser())
  app.use(express.bodyParser())
  app.use(express.session({
    secret: 'somekey',
    store: SessionStore
  }));
  app.use(passport.initialize())
  app.use(passport.session())
  app.use(app.router)   
})
这里是我登录的地方:

app.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                    failureRedirect: '/login_failed',
                                                    failureFlash: false }))
在这里,我尝试访问一个页面(“/content”),我需要授权:

app.get('/content', ensureAuthenticated, function(req, res){
  res.render('content', { user: req.user })
})

var server = http.createServer(app).listen(5050)

var io = socketio.listen(server)

io.set('authorization', passportSocketIo.authorize({
  cookieParser: express.cookieParser, 
  key:          'express.sid',        
  secret:       'somekey',  
  store:         SessionStore,      
  fail: function(data, accept) {      
  accept(null, false);              
  },
  success: function(data, accept) {
    accept(null, true);
  }
}))
但如果客户端现在尝试访问“/content”,服务器总是响应“未经授权的握手”:

// on client side
socket = io.connect('http://localhost:5050'); 

// on server side
io.sockets.on( 'connection', function( socket ) { 
  console.log(socket.handshake.user._id) 
}
-> handshake unauthorized

有人知道我在这里做错了什么吗?

在客户端,尝试将127.0.0.1而不是localhost设置为是这是一个两年来就知道的问题,但尚未解决:

正如koenigsbier在本期github中所说:

在我的客户端,我有
var套接字=
io.connect('http://localhost:8080');并且只有当您将
浏览器中的localhost:8080

我通过
var socket=io.connect('http://127.0.0.1:8080');
现在它在您的应用程序中使用localhost:8080和127.0.0.1:8080
浏览器

这显然是一个bug,为什么socket.io只接受地址映射 在某种程度上?localhost是localhost,与127.0.0.1相同

您需要使用:

key:          'connect.sid',
而不是

key:          'express.sid',
找钥匙。在浏览器中签出cookie,您将看不到express.sid,但connect.sid将有一个值。我在您的示例和我的工作示例之间看到的唯一其他区别是,我将一个var设置为express.cookieParser,然后在app config和io.set authorization中使用它

var cookieParser = express.cookieParser();