как реализовать авторизацию входа в узел.js
у меня есть этот сервер узла работает:
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);
}
}
пожалуйста, предложите, как я могу добавить сеанс в этом я попытался добавить , запросить переменную в функции входа и попытался установить запрос.переменная сеанса это говорит запрос.сеанс не определен .
пожалуйста, предложите, как я могу написать этот модуль входа, который может поддерживать аутентификацию входа правильно для каждого пользователя .
5 ответов:
вот как я это делаю с Экспресс.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'); });если вы хотите узнать подробнее о Экспресс.js проверьте их сайт здесь:expressjs.com/en/guide/routing.html Если есть необходимость в более сложных вещах, проверьте everyauth (это имеет большое двиг методов, для facebook, Twitter и т. д; хороший учебник по нему здесь).
на самом деле это не совсем ответ на вопрос, но это лучший способ, чтобы сделать это.
Я предлагаю вам использовать подключиться/экспресс как http-сервер, так как они экономят вам много времени. Вы явно не хотите изобретать велосипед. В вашем случае управление сеансами намного проще с connect / express.
кроме того, для аутентификации я предлагаю вам использовать everyauth. Который поддерживает много аутентификации стратегия. Высокий для быстрого развития.
все это может быть легко вниз с некоторой копией вставки из их документации!
чтобы добавить к псевдо-ответу Фарида,
рассмотрите возможность использования паспорт.js over everyauth.
ответы этот вопрос дайте некоторое представление о различиях.
есть много преимуществ для разгрузки аутентификации пользователя в Google, Facebook или другой веб-сайт. Если требования вашего приложения таковы, что вы можете использовать Passport в качестве единственного поставщика аутентификации или вместе с ним традиционный вход, это может сделать опыт проще для ваших пользователей.
@alessioalex ответ является идеальным демо для свежего пользователя узла. Но в любом случае, трудно написать промежуточное программное обеспечение checkAuth во все маршруты, кроме входа в систему, поэтому лучше переместить checkAuth из каждого маршрута в одну запись с приложением.использовать. Например:
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)
я попробовал этот ответ, и это не сработало для меня. Я также новичок в веб-разработке и брал классы, где я использовал mlab, но я предпочитаю разбор, поэтому мне пришлось искать наиболее подходящее решение. Вот мое собственное текущее решение с помощью parse на 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 за его ответ. Я только обновил с последними практиками.
Comments