【问题标题】:What is the best approach for Authorization with node.js and Socket.io使用 node.js 和 Socket.io 进行授权的最佳方法是什么
【发布时间】:2013-10-09 12:43:04
【问题描述】:

我一直在“玩”使用 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 验证用户身份的最有效方法(我知道有各种各样的文章,但事情似乎已经发生了变化。很难跟踪最新的内容)。

【问题讨论】:

    标签: node.js authentication express socket.io


    【解决方案1】:

    您需要传递一个秘密来解析签名的 cookie。这个函数:

    connect.utils.parseSignedCookie();
    

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

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

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

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

    【讨论】:

    • 更新答案,其实是不同的原因。
    • 如果没有发送cookie,客户端是否应该设置cookie并重试?
    • 如果没有cookie,就没有会话。这也意味着您无法进行身份验证。会话是可靠地从另一个客户端识别每个客户端。
    【解决方案2】:
    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-

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2016-04-12
      • 1970-01-01
      • 2013-10-07
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2016-05-18
      相关资源
      最近更新 更多