我是Node-beginner并且遇到以下问题。我使用express,socket.io和passport以及passport.socketio和MongoStore。
我需要使用护照验证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
有谁知道我在这里做错了什么?
答案 0 :(得分:2)
是的,这是两年后已知的问题,尚未解决:
https://github.com/LearnBoost/socket.io/issues/545
正如koenigsbier在这个github问题中所说:
在我的客户端,我有
var socket = io.connect('http://localhost:8080');
,只有你放的时候它才有用 localhost:8080在您的浏览器中。我改变了
var socket = io.connect('http://127.0.0.1:8080');
现在它适用于localhost:8080和127.0.0.1:8080 浏览器。这显然是一个错误,为什么socket.io应该只接受地址映射 在某种程度上? localhost是localhost,与127.0.0.1
相同
答案 1 :(得分:0)
在客户端,尝试输入127.0.0.1而不是localhost
答案 2 :(得分:0)
您需要使用:
key: 'connect.sid',
而不是
key: 'express.sid',
为钥匙。在浏览器中查看cookie,您将看不到express.sid,但connect.sid将有一个值。我在你和我的工作示例之间看到的唯一区别是我将一个var设置为express.cookieParser,然后在app config和io.set授权中使用它。
var cookieParser = express.cookieParser();