Как реализовать login auth в node.js

У меня работает этот сервер node:

var server=http.createServer(function(request, responsehttp) {
    if (request.method == 'POST') {
        var body = '';
        request.on('data', function (data) {
            body += data;
        });
        request.on('end', function () {
            var POST = qs.parse(body);
            processquery(POST, request, responsehttp);
        });
    } else {
        var url_parts = url.parse(request.url, true);
        var query = url_parts.query;
        console.log(query);
        processquery(query, request, responsehttp);
    }
});

Я хочу добавить регистрационную форму для этого сервера .so, когда пользователь аутентифицирован, он покажет.

   function processquery(query, request, responsehttp){
    var returnResult = function (data){
        responsehttp.end(JSON.stringify(data));
    };

    if (!query.command) {
        fileprocess(request, responsehttp);
    }
    responsehttp.writeHead(200, {"Content-Type": "application/json"});
    switch(query.command) {
        case 'logout':
            logout(query, returnResult);
            break;
        case 'login':
            login(query, returnResult);
            break;
    }    
}

в функции запроса процесса, возвращающей файлы клиенту, если какая-либо команда не указана, поэтому я могу отправить команду входа от клиента к серверу, но какой сервер должен делать, когда он получит команду входа с паролем имени пользователя, как он должен передать запрос на вход и вернуть вход или неудачу входа в систему, для написания этой части мне нужна помощь.

что я пытался.

function login(request, callback) {
    if(request.username==users[request.username] && request.password==users[request.username].password) {
        users[request.username].auth=true;
        var data = {result:'success','message':'login successful'};
        callback(data);
    } else {
        var data = {result:'error','message':'login incorrect'};
        callback(data);
    }
}

Пожалуйста, предложите, как я могу добавить сеанс в этом, я попробовал добавить, запросить переменную в функции входа и попытался установить параметр request.session, который говорит request.session undefined.

Пожалуйста, предложите, как я могу написать этот модуль входа, который может поддерживать аутентификацию входа для каждого пользователя.

Ответ 1

Вот как я это делаю с Express.js:

1) Проверка подлинности пользователя. У меня есть функция промежуточного программного обеспечения с именем CheckAuth, которую я использую на каждом маршруте, который требует аутентификации пользователя:

function checkAuth(req, res, next) {
  if (!req.session.user_id) {
    res.send('You are not authorized to view this page');
  } else {
    next();
  }
}

Я использую эту функцию в своих маршрутах следующим образом:

app.get('/my_secret_page', checkAuth, function (req, res) {
  res.send('if you are viewing this page it means you are logged in');
});

2) Маршрут входа:

app.post('/login', function (req, res) {
  var post = req.body;
  if (post.user === 'john' && post.password === 'johnspassword') {
    req.session.user_id = johns_user_id_here;
    res.redirect('/my_secret_page');
  } else {
    res.send('Bad user/pass');
  }
});

3) Маршрут выхода:

app.get('/logout', function (req, res) {
  delete req.session.user_id;
  res.redirect('/login');
});      

Если вы хотите узнать больше о Express.js, проверьте их сайт здесь: expressjs.com/en/guide/routing.html Если вам нужны более сложные вещи, проверьте everyauth (у него много доступных методов auth, для facebook, twitter и т.д., Хороший учебник по нему здесь).

Ответ 2

На самом деле это не ответ на вопрос, но это лучший способ сделать это.

Я предлагаю вам использовать connect/express как сервер http, так как они сэкономит вам много времени. Вы, очевидно, не хотите изобретать велосипед. В вашем случае управление сеансом намного проще с помощью connect/express.

Кроме того, для аутентификации я предлагаю вам использовать everyauth. Это поддерживает множество стратегий аутентификации. Удивительно для быстрого развития.

Все это может быть легко скомпилировано с помощью какой-либо копии из их документации!

Ответ 3

Чтобы добавить к псевдодару Фарида,

С помощью Passport.js над everyauth.

Ответы на этот вопрос дают некоторое представление о различиях.


Существует множество преимуществ для разгрузки пользовательской аутентификации в Google, Facebook или на другом веб-сайте. Если ваши требования к приложениям таковы, что вы можете использовать Passport в качестве вашего единственного поставщика аутентификации или наряду с традиционным входом в систему, это облегчит пользователям работу.

Ответ 4

@alessioalex ответ - прекрасная демонстрация для нового пользователя node. Но в любом случае трудно написать checkAuth middleware во все маршруты, кроме логина, поэтому лучше переместить checkAuth из каждого маршрута в одну запись с помощью app.use. Например:

function checkAuth(req, res, next) {
  // if logined or it login request, then go next route
  if (isLogin || (req.path === '/login' && req.method === 'POST')) {
    next()
  } else {
    res.send('Not logged in yet.')
  }
}

app.use('/', checkAuth)