Wes Johnson..
6
你很接近,但我建议设置一个请求标题而不是设置查询字符串参数.data授权功能中的变量是握手数据,其中包含您可以使用的请求标头和cookie信息.以下是设置cookie的示例:
在服务器上
io.configure(function() {
io.set('authorization', function(handshake, callback) {
var cookie, token, authPair, parts;
// check for headers
if (handshake.headers.cookie &&
handshake.headers.cookie.split('=')[0]=='myapp') {
// found request cookie, parse it
cookie = handshake.headers.cookie;
token = cookie.split(/\s+/).pop() || '';
authPair = new Buffer(token, 'base64').toString();
parts = authPair.split(/:/);
if (parts.length>=1) {
// assume username & pass provided, check against db
// parts[0] is username, parts[1] is password
// .... {db checks}, then if valid....
callback(null, true);
} else if(parts.length==1) {
// assume only username was provided @ parts[0]
callback(null,true);
} else {
// not what we were expecting
callback(null, false);
}
}
else {
// auth failed
callback(null, false);
}
});
});
在客户端
在您致电之前,请socket.connect使用您的身份验证/用户信息设置一个cookie:
function writeCookie(value, days) {
var date, expires;
// days indicates how long the user's session should last
if (days) {
date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
expires = "; expires="+date.toGMTString();
} else {
expires = "";
}
document.cookie = "myapp="+Base64.encode(value)+expires+"; path=/";
};
// for a 'viewer' user:
writeCookie('usernameHere', 1);
// for the 'host' user:
writeCookie('usernameHere:passwordHere', 1);
除非您的浏览器支持,否则您需要在客户端使用Base64库btoa().
值得注意的是,这不是一个好的身份验证结构.直接在查询字符串或标头信息中传递用户凭证是不安全的.不过,这种方法可以让您更接近更安全的方法.我建议你查看一个像passport.js或everyauth这样的auth库.您可以在此代码中进行子操作,以利用这些库在运行检查时存储的会话信息.