【问题标题】:Passport.socketio: handshake is always unauthorizedPassport.socketio:握手总是未经授权的
【发布时间】:2013-08-24 23:56:57
【问题描述】:

我是 Node 初学者,遇到以下问题。我使用 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

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

【问题讨论】:

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


    【解决方案1】:

    是的,这是两年前已知的问题,但尚未解决:

    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一样

    【讨论】:

      【解决方案2】:

      在客户端,尝试使用 127.0.0.1 而不是 localhost

      【讨论】:

        【解决方案3】:

        你需要使用:

        key:          'connect.sid',
        

        而不是

        key:          'express.sid',
        

        钥匙。查看浏览器中的 cookie,您不会看到 express.sid,但 connect.sid 会有一个值。我在您的示例和我的工作示例之间看到的唯一其他区别是我将 var 设置为 express.cookieParser,然后在应用程序配置和 io.set 授权中使用它。

        var cookieParser = express.cookieParser();
        

        【讨论】:

          猜你喜欢
          • 2021-06-08
          • 1970-01-01
          • 2017-06-22
          • 2018-03-25
          • 2014-03-16
          • 2018-04-08
          • 2016-10-01
          • 1970-01-01
          • 2020-06-26
          相关资源
          最近更新 更多