SocketIO + MySQL-Authentifizierung
Ich bin versucht, die Authentifizierung über eine MySQL-DB über socketIO. Ich habe die Verbindung hergestellt und können Abfrageergebnisse, ohne ein Problem, aber aus irgendeinem Grund kann ich nicht gehen, ob der Benutzer authentifiziert ist in der connection
Teil von socketio. Die Idee ist, meine app hat Gastgeber und Zuschauer. Wenn Sie eine Verbindung zu der app, ohne dass ein Kennwort in die QueryString
die app nimmt seine Zuschauer und nimmt Verbindung. Wenn Sie ein Kennwort gesendet wird, wird geprüft, gegen die DB und akzeptiert/verwirft die Verbindung. Ich möchte eine variable zu übergeben, in der connection
damit ich es in meine apps Ereignisse. Hier ist, was ich bisher aber offenbar die data.query['ishost']
ist nicht vorbei in der app.
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);
});
});
Schriftlich an die data.query
macht es zugänglich durch handshakeData. Aber aus irgendeinem Grund nicht übergeben werden, über die app. Jede Hilfe ist willkommen, danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist in der Nähe, aber ich würde empfehlen die Einstellung einer Anfrage-header über die Einstellung einen query-string param. Die
data
variable, die in Ihrer Bewilligung Funktion handshake-Daten, enthält request-header-und cookie-Informationen, die Sie verwenden können. Hier ist ein Beispiel mit setzen eines cookie:Auf dem server
Auf dem client
Vor rufen Sie
socket.connect
, ein cookie gesetzt, mit Ihren auth /user info:Benötigen Sie eine Base64 Bibliothek auf der client-Seite, es sei denn, Ihr browser unterstützt
btoa()
.Es ist wichtig zu beachten, dass dies nicht eine gute Struktur-Authentifizierung. Übergeben von Anmeldeinformationen entweder direkt in query-strings oder header-Informationen, ist nicht sicher. Diese Methode bringt Sie näher an eine sicherere Methode, aber. Ich würde empfehlen, sich in einer Bibliothek, wie auth passport.js oder everyauth. Sie können die sub in diesem code zu nutzen, um die session-Daten, die diese Bibliotheken store in der Ausführung Ihrer Prüfungen.