Как правильно организовать авторизацию в node.js?

На данный момент сделал так: Отправляю GET запросом логин/пароль.

var data = {
        'username': username,
        'password': password
        };

        $.ajax({
          type: "GET",
          url: 'login',
          data: data,
          success: console.log('response sucsess')
    });

На сервере принимаю и сверяю с базой:

router.get('/', function(req, res) {

    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'user',
        password : 'password',
        database : 'database'
    });

    connection.connect();

    var username = req.query.username,
    password = req.query.password
    connection.query('SELECT password FROM `users` WHERE login = "' + username +'"',            function(err, rows, fields) {
        if (err) throw err;
        else if (rows.length > 0 && password == rows[0].password) {
            console.log('Hello');
        } else {
            console.log('Go away!');
        }
    });

    connection.end();
    res.end();
});

Но походу это все очень не правильно и не безопасно. Как сделать безопасную авторизацию с сессиями? Кокой их общий принцип роботы? Можно ли кокой либо готовй пример вида: отправил данные -> получил сессию и дальше проверяешь что-то вроде if (registered){ ... }
  • Вопрос задан
  • 21882 просмотра
Решения вопроса 1
Revencu
@Revencu
1. Сначала сделайте простой запрос (без авторизации) для получения произвольного кода (на сервере генерируем случайный ключ и возвращаем)
2. Полученный ключ (code) кодируем на клиенте через SHA256 (code+username+password)
3. Делаем запрос авторизации отправляя шифрованный код
4. На Сервере проверяем в базе комбинацию SHA256(ключ+полеUSER+полеPASSWORD). Если нашли - Вуаля! и убиваем ключ

Таким образом будет отправляться всегда новый код для авторизации и снифферы не уловят ваши данные.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
kostia256
@kostia256
Стоит понимать что принцип авторизации везде одинаков.
1. Идентификация (проверка существование пользователя по login)
2. Аутентификация (проверка пароля)
3. Авторизация (проверка прав доступа)
Сохраняете информацию о пользователе в сессии достаточную чтобы миновать этапы 1 и 2, и сразу переходить к этапу 3. Соответственно когда умирает сессия нужно повторно произвести все шаги авторизации.
Ответ написан
@LiguidCool
И да, юзают https дабы пароль не утёк налево.
Ответ написан
Комментировать
haiku
@haiku
1) Кука + сессия
2) OAuth можно

И вы уверены, что написаный в коде руками SQL запрос защищен от SQL-injection атаки?
var username = req.query.username - как-то не очень хорошо, с морды же все что угодно может прилететь. username = '; DROP TABLE users' какой-нить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы