使用node.js和Socket.io进行授权的最佳方法是什么

时间:2013-10-02 23:51:29

标签: node.js authentication express socket.io

我一直在使用node.js,express和socket.io

进行身份验证

我在这里尝试了http://howtonode.org/socket-io-auth

这个例子
app.use(express.cookieParser("rocks"));
app.use(express.session());

io.set('authorization', function(handshakeData, accept) {
    console.log('in authorization');
    if(handshakeData.headers.cookie) {
            handshakeData.cookie = cookie.parse(handshakeData.headers.cookie);
            handshakeData.sessionID = connect.utils.parseSignedCookie(handshakeData.cookie['express.sid']);
            if (handshakeData.cookie['express.sid'] == handshakeData.sessionID) {
                    return accept('Cookie is invalid.', false);
            }
    } else {
            return accept('No cookie transmitted.', false);
    }
    accept(null, true);
});

我不断收到连接产生的错误,更具体地说是此调用行

  connect.utils.parseSignedCookie(handshakeData.cookie['express.sid']);

/workspace/node_modules/connect/node_modules/cookie-signature/index.js:39
if ('string' != typeof secret) throw new TypeError('secret required');
                                   ^
TypeError: secret required

我试图找到express.cookieParser(我有)和express.session(我没有)的api文档,并查看了有问题的源代码。我想我设置项目的方式正在发生,因为connect似乎有一个cookieParser以及express,或者express正在使用来自connect的cookieParser。

我的package.json看起来像

 {
  "name": "mplayer",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
 "dependencies": {
   "socket.io":"0.9.16",
    "express": "3.4.0",
   "jade": "*",
   "stylus": "*",
   "cookie": "*"
  }
}

有人可以解释为什么我会收到此错误,其次可以有人分享使用Node.js,socket.io和express 验证用户的最有效方式(我知道那里)那里有各种各样的文章,但事情似乎已经发生了变化。很难跟踪当前的情况。)

2 个答案:

答案 0 :(得分:1)

您需要传递一个秘密来解析已签名的Cookie。这个功能:

connect.utils.parseSignedCookie();

接受两个参数,第一个是req.cookies,第二个是秘密。这就是您需要使用该功能的方法:

var signedCookies = connect.utils.parseSignedCookie(handshake.headers.cookie, 'secret');
// signedCookies['express.sid']

您收到错误的原因是您没有将字符串作为第二个参数传递,这是typeof 'string'检查失败的原因。

至于在与Express一起使用时验证Socket.IO用户的最有效方法,它已经是您已经使用它的方式。

答案 1 :(得分:0)

var cookieParser = require('cookie-parser');
var cookie = require('cookie');
var secret = config.get('session:secret');

io.set('authorization', function(handshake, callback){        
        async.waterfall([
            function(callback) {
                handshake.cookies = cookie.parse(handshake.headers.cookie || '');
                var sidCookie = handshake.cookies[config.get('session:key')];                
                var sid = cookieParser.signedCookie(sidCookie, secret);               
            }
        });

https://www.npmjs.com/package/cookie-parser#cookieparser-signedcookie-str-secret-