首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Passport.socketio:握手始终是未经授权的

Passport.socketio:握手始终是未经授权的
EN

Stack Overflow用户
提问于 2013-08-22 18:00:19
回答 3查看 3.1K关注 0票数 0

我是Node初学者,有以下问题。我使用快递、socket.io和passport,也使用passport.socketio和MongoStore。

我需要使用passport对socket.io进行身份验证(为此我使用passport.socketio ),但是即使在成功登录之后,握手也总是未经授权的。到目前为止,我的代码如下:

代码语言:javascript
复制
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)   
})

这里是我登录的地方:

代码语言:javascript
复制
app.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                    failureRedirect: '/login_failed',
                                                    failureFlash: false }))

这里我尝试访问一个需要授权的页面('/content'):

代码语言:javascript
复制
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',服务器总是响应‘握手未授权’:

代码语言:javascript
复制
// 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

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

EN

回答 3

Stack Overflow用户

发布于 2013-10-10 17:27:31

是的,这是一个两年前就知道的问题,但目前还没有解决:

https://github.com/LearnBoost/socket.io/issues/545

正如koenigsbier在本期github中所说:

在我的客户端,我有var socket = io.connect('http://localhost:8080');,只有当你在浏览器中放入

:8080时,它才能工作。

我通过var socket = io.connect('http://127.0.0.1:8080');对其进行了更改,现在它可以在浏览器中使用localhost:8080和127.0.0.1:8080。

这显然是一个bug,为什么socket.io应该只以一种方式接受地址映射呢?本地主机是本地主机,与127.0.0.1相同

票数 2
EN

Stack Overflow用户

发布于 2013-09-14 19:53:00

在客户端,尝试将127.0.0.1替换为localhost

票数 0
EN

Stack Overflow用户

发布于 2013-11-07 02:03:52

您需要使用:

代码语言:javascript
复制
key:          'connect.sid',

而不是

代码语言:javascript
复制
key:          'express.sid',

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

代码语言:javascript
复制
var cookieParser = express.cookieParser();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18377296

复制
相关文章

相似问题

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