как реализовать авторизацию входа в систему в node.js - PullRequest
73 голосов
/ 03 ноября 2011

У меня работает этот сервер узлов:

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);
    }
});

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

   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 не определен.

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

Ответы [ 5 ]

239 голосов
/ 04 ноября 2011

Вот как я это делаю с 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 / ru / guide / routing.html Если есть необходимость в более сложных вещах, зацените everyauth (доступно множество методов авторизации, для facebook, twitter и т. Д .; хорошее руководство по этому вопросу здесь ).

6 голосов
/ 03 ноября 2011

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

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

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

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

3 голосов
/ 30 июля 2014

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

Рассмотрите возможность использования Passport.js свыше Everyauth .

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


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

2 голосов
/ 05 мая 2017

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

function checkAuth(req, res, next) {
  // if logined or it's 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)
1 голос
/ 20 августа 2018

Я попробовал этот ответ, и он не сработал для меня. Я также новичок в веб-разработке и посещал занятия, где я использовал mlab, но я предпочитаю парсинг, поэтому мне пришлось искать наиболее подходящее решение. Вот мое собственное текущее решение, использующее синтаксический анализ на expressJS.

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

 function isLoggedIn(req, res, next) {
 var currentUser = Parse.User.current();
 if (currentUser) {
     next()
 } else {
     res.send("you are not authorised");
 }
}

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

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

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

  // handling login logic
  app.post('/login', function(req, res) {
  Parse.User.enableUnsafeCurrentUser();
  Parse.User.logIn(req.body.username, req.body.password).then(function(user) {
    res.redirect('/books');
  }, function(error) {
    res.render('login', { flash: error.message });
  });
});

3) Маршрут выхода из системы:

 // logic route
  app.get("/logout", function(req, res){
   Parse.User.logOut().then(() => {
    var currentUser = Parse.User.current();  // this will now be null
    });
        res.redirect('/login');
   });

Это сработало очень хорошо для меня, и я сделал полную ссылку на документацию здесь https://docs.parseplatform.org/js/guide/#users

Спасибо @alessioalex за его ответ. Я только обновил с последними методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...