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

使用node.js和Socket.io进行授权的最佳方法是什么,node.js,authentication,express,socket.io,Node.js,Authentication,Express,Socket.io,我一直在使用node.js、express和socket.io“玩”身份验证 我在这里试过这个例子 我不断收到connect生成的错误,更确切地说是这条电话线 connect.utils.parseSignedCookie(handshakeData.cookie['express.sid']); /workspace/node_modules/connect/node_modules/cookie-signature/index.js:39 if ('string' != typeof

我一直在使用node.js、express和socket.io“玩”身份验证

我在这里试过这个例子

我不断收到connect生成的错误,更确切地说是这条电话线

  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对用户进行身份验证的最有效方法吗?(我知道有很多文章,但事情似乎有所进展。很难了解最新情况).

您需要传递一个用于解析签名cookie的秘密。此功能:

connect.utils.parseSignedCookie();
var signedCookies = connect.utils.parseSignedCookie(handshake.headers.cookie, 'secret');
// signedCookies['express.sid']
接受两个参数,第一个是
req.cookies
,第二个是secret。以下是您需要如何使用该功能:

connect.utils.parseSignedCookie();
var signedCookies = connect.utils.parseSignedCookie(handshake.headers.cookie, 'secret');
// signedCookies['express.sid']
出现错误的原因是您没有将字符串作为第二个参数传递,这是导致“string”类型检查失败的原因

至于与Express结合使用时对Socket.IO用户进行身份验证的最有效方法,它已经是您使用它的方式

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);               
            }
        });

更新的答案,实际上是另一个原因。如果没有传输cookie,客户端是否应该设置cookie并重试?如果没有cookie,则没有会话。这也意味着您无法进行身份验证。会话是可靠地将每个客户机与另一个客户机标识的对象。