我正在尝试通过 socketIO 对 MySQL 数据库进行身份验证。我已经建立了连接并且可以毫无问题地查询结果,但是由于某种原因,我无法将用户是否通过身份验证传递给connection
socketio 的部分。这个想法是我的应用程序有主机和观众。如果连接到应用程序而不在应用程序中发送密码,QueryString
则应用程序假定其为查看器并接受连接。如果发送了密码,则会针对 DB 进行检查并接受/拒绝连接。我想要一个变量传递给我,connection
这样我就可以在我的应用程序事件中使用它。这是我到目前为止所拥有的,但显然data.query['ishost']
没有传递到应用程序中。
sio.configure(function() {
sio.set('authorization', function (data, accept) {
UserID = data.query['username'];
try {
UserID = UserID.toLowerCase();
} catch(err) {
return accept("No WebBot Specified. ("+err+")", false);
}
// if not sending a password, skip authorization and connect as a viewer
if (data.query['password'] === 'undefined')
{
return accept(null, true);
}
// if sending a password, attempt authorization and connect as a host
else
{
client.query(
'SELECT * FROM web_users WHERE username = "'+UserID+'" LIMIT 1',
function selectCb(err, results, fields) {
if (err) {
throw err;
}
// Found match, hash password and check against DB
if (results.length != 0)
{
// Passwords match, authenticate.
if (hex_md5(data.query['password']) == results[0]['password'])
{
data.query['ishost'] = true;
accept(null, true);
}
// Passwords don't match, do not authenticate
else
{
data.query['ishost'] = false;
return accept("Invalid Password", false);
}
}
// No match found, add to DB then authenticate
else
{
client.query(
'INSERT INTO web_users (username, password) VALUES ("'+UserID+'", "'+hex_md5(data.query['password'])+'")', null);
data.query['ishost'] = "1";
accept(null, true);
}
client.end();
}
);
// Should never reach this
return accept("Hacking Attempt", false);
}
// Definitely should never reach this
return accept("Hacking Attempt", false);
});
});
写入data.query
使其可以通过 handshakeData 访问。但由于某种原因,它没有通过应用程序传递它。任何帮助表示赞赏,谢谢。