我一直在使用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 验证用户的最有效方式(我知道那里)那里有各种各样的文章,但事情似乎已经发生了变化。很难跟踪当前的情况。)
答案 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-