Рубрики
Без рубрики

Как создать простую систему аутентификации на основе сеанса с Nodejs с нуля.

Этот учебник научит вам, как создать простую систему аутентификации на основе сеанса с Nodejs с нуля.

Автор оригинала: Mayowa Adegbola.

Для тех из нас не знаком с какой системой аутентификации, не бойся.

А Система Uthentication – это то, что позволяет пользователю получить доступ к ресурсу только после того, как прилагаемые учетные данные сравниваются с тем, что хранится в базе данных и обнаруживается одинаково.

Аутентификация может быть либо На основе сессии или Токен на основе Отказ Аутентификация на основе сеансов использует файлы cookie, хранящуюся в браузере пользователя, чтобы проверить их идентичность после входа в систему, когда аутентификация на основе токена использует JSON Web Tokens (JWT), который отправляется вместе с каждым запросом, чтобы проверить идентичность пользователя, и это делает это без гражданства. Чтобы узнать больше о своих различиях Читать далее…

После поиска в Интернете на Как написать систему аутентификации на основе сеанса в Nodejs с нуля без использования какого-либо модуля/библиотеки И я не мог найти ни одного хорошего ресурса на этом, я решил придумать этот учебник для любопытных умов, как я.

Давайте начнем. Ниже приведены список технологий/пакетов, необходимых для создания нашей системы аутентификации:

Nodejs : Это JavaScript Runtime, построенный на двигателе Chrome’s V8 JavaScript. Node.js (или nodejs) использует, управляющую событиями, не блокирующая модель ввода/вывода, которая делает его легким и эффективным. Это будет наш задний язык для этого проекта.

(Узел пакета Manager) NPM : Это менеджер по пакетам для Nodejs.

Экспресс : Это быстрый, неотпированный, минималистский веб-каркас для Nodejs. Несомненно, является самым популярным веб-каркасом для NODEJS, которая обеспечивает надежный набор функций для веб и мобильных приложений.

Sequelize : Sequelize – это Node.js объект Node.js Relational Mapper (ORM) для Postgres, MySQL, SQLite и Microsoft SQL Server. Он имеет поддержку твердой транзакции, отношения, прочитайте репликацию и многое другое.

PostgreSQL : PostgreSQL – это продвинутая система управления базами данных, реляционной базы данных Это поддерживает расширенный подмножество стандарта SQL, включая Транзакции, иностранные ключи, подзапросы, триггеры, пользовательские типы и функции.

Тело-парсер : Это промежуточное программное обеспечение для анализа тела, которая позволяет вам проанализировать входящие телы запроса в промежуточное освещение перед вашими обработчиками, доступными в рамках свойства REQ.

Cookie-Parser : Это промежуточное программное обеспечение для приготовления печенья, которое позволяет вам разбирать заголовок Cookie и заполнять Req.cookies с объектом, ключенным именами cookie.

Экспресс-сессия : Это простое сеанс промежуточное программное обеспечение для Express, которое позволяет управлять сеансами в приложениях Nodejs-Express.

BCRYPT : Это пакет Nodejs, который позволяет нам использовать пароли для целей безопасности.

Морган : Это HTTP-запрос на промежуточное программное обеспечение для NODEJS, которое позволяет печатать информацию о вашем запросе в командной строке.

Конвенции и допущения: 1. Для командных команд я не буду упоминаться «Нажмите Enter», чтобы сэкономить время. Пожалуйста, нажмите клавишу «Enter» после набора команд. 2. Предполагается, что вы используете приложение командной строки UNIX, например Силовая оболочка на Windows или Терминал на Mac. 3. Кодовые фрагменты, которые начинаются с $ Указывает команды, которые должны быть запущены в вашей командной строке (в основном один режим), в то время как те, которые не начнутся с $ должны быть внутри наших файлов. 4. Целью этого учебного пособия является не в первую очередь, чтобы следовать в Конвенции и лучших практиках, но в основном показать нам, как создать простую систему аутентификации в Nodejs.

Чтобы убедиться, что у вас есть Nodejs, NPM и PostgreSQL на вашем компьютере, введите следующие команды на вашей командной строке один за другим:

$ node --version
$ npm --version
$ psql --version

Если у вас есть их версия, то вы хотите пойти. Давайте создадим пользовательскую базу данных и базу данных для нашего приложения. Введите следующее на вашей командной строке:

$ psql -c 'CREATE ROLE "postgres" with Login Superuser Createrole CreateDB Replication BypassRLS'

Нам нужно создать эквивалентную базу данных для Postgres Пользователь, прежде чем мы сможем работать с ним.

$ psql -c 'CREATE DATABASE "postgres"'

А затем создайте базу данных для нашего приложения:

$ psql -U postgres -c 'CREATE DATABASE "auth-system"'

Давайте создадим каталоги на нашу заявку. Перейдите к желаемой корневой папке (E.g: Desktop/Documents) на вашей командной строке, затем введите:

$ mkdir auth-system && cd auth-system

Первая команда создает папку во время второй команды навигации к каталогу. Давайте создадим оставшиеся каталоги.

$ mkdir models public

модели Каталог пройдет ваш Пользователь Модель пока публичный Справочник будет размещать наши статические файлы.

Чтобы инициализировать приложение Nodejs и убедительно избежать ненужных вопросов по мистеру NPM, введите это на командную строку:

$ npm init -f

Готовый? Давайте установим пакеты NPM, необходимые нашим приложением. Введите это на командной строке:

$ npm install --save bcrypt body-parser cookie-parser express express-session morgan pg sequelize

Приведенная выше команда добавит пакеты в наш список зависимостей внутри Package.json файл и также создаст node_modules каталог (если никто не существует) с нашими пакетами, установленными внутри.

Далее – создать наши Пользователь Модель файла и файл Express-Configuration. Введите следующее на вашей командной строке:

$ touch models/user.js server.js

Приведенная выше команда создаст user.js Файл внутри каталога моделей, а также server.js Файл в вашем корневом каталоге.

Наша структура папки теперь должна выглядеть таким образом:

Застрел на экране 2017-04-06 в 9,24,56 вечера.

Теперь давайте добавим следующий код для нашего Модели/user.js файл:

var Sequelize = require('sequelize');
var bcrypt = require('bcrypt');

// create a sequelize instance with our local postgres database information.
var sequelize = new Sequelize('postgres://postgres@localhost:5432/auth-system');

// setup User model and its fields.
var User = sequelize.define('users', {
    username: {
        type: Sequelize.STRING,
        unique: true,
        allowNull: false
    },
    email: {
        type: Sequelize.STRING,
        unique: true,
        allowNull: false
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false
    }
}, {
    hooks: {
      beforeCreate: (user) => {
        const salt = bcrypt.genSaltSync();
        user.password = bcrypt.hashSync(user.password, salt);
      }
    },
    instanceMethods: {
      validPassword: function(password) {
        return bcrypt.compareSync(password, this.password);
      }
    }    
});

// create all the defined tables in the specified database.
sequelize.sync()
    .then(() => console.log('users table has been successfully created, if one doesn\'t exist'))
    .catch(error => console.log('This error occured', error));

// export User model for use in other files.
module.exports = User;

Пожалуйста, обратитесь к комментариям над каждым блоком для объяснения, на что делает каждый блок кода. Не стесняйтесь использовать окно комментариев ниже для любых проблем.

Пришло время настроить нашу экспресс-конфигурацию внутри server.js файл:

var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var morgan = require('morgan');
var User = require('./models/user');

// invoke an instance of express application.
var app = express();

// set our application port
app.set('port', 9000);

// set morgan to log info about our requests for development use.
app.use(morgan('dev'));

// initialize body-parser to parse incoming parameters requests to req.body
app.use(bodyParser.urlencoded({ extended: true }));

// initialize cookie-parser to allow us access the cookies stored in the browser. 
app.use(cookieParser());

// initialize express-session to allow us track the logged-in user across sessions.
app.use(session({
    key: 'user_sid',
    secret: 'somerandonstuffs',
    resave: false,
    saveUninitialized: false,
    cookie: {
        expires: 600000
    }
}));


// This middleware will check if user's cookie is still saved in browser and user is not set, then automatically log the user out.
// This usually happens when you stop your express server after login, your cookie still remains saved in the browser.
app.use((req, res, next) => {
    if (req.cookies.user_sid && !req.session.user) {
        res.clearCookie('user_sid');        
    }
    next();
});


// middleware function to check for logged-in users
var sessionChecker = (req, res, next) => {
    if (req.session.user && req.cookies.user_sid) {
        res.redirect('/dashboard');
    } else {
        next();
    }    
};


// route for Home-Page
app.get('/', sessionChecker, (req, res) => {
    res.redirect('/login');
});


// route for user signup
app.route('/signup')
    .get(sessionChecker, (req, res) => {
        res.sendFile(__dirname + '/public/signup.html');
    })
    .post((req, res) => {
        User.create({
            username: req.body.username,
            email: req.body.email,
            password: req.body.password
        })
        .then(user => {
            req.session.user = user.dataValues;
            res.redirect('/dashboard');
        })
        .catch(error => {
            res.redirect('/signup');
        });
    });


// route for user Login
app.route('/login')
    .get(sessionChecker, (req, res) => {
        res.sendFile(__dirname + '/public/login.html');
    })
    .post((req, res) => {
        var username = req.body.username,
            password = req.body.password;

        User.findOne({ where: { username: username } }).then(function (user) {
            if (!user) {
                res.redirect('/login');
            } else if (!user.validPassword(password)) {
                res.redirect('/login');
            } else {
                req.session.user = user.dataValues;
                res.redirect('/dashboard');
            }
        });
    });


// route for user's dashboard
app.get('/dashboard', (req, res) => {
    if (req.session.user && req.cookies.user_sid) {
        res.sendFile(__dirname + '/public/dashboard.html');
    } else {
        res.redirect('/login');
    }
});


// route for user logout
app.get('/logout', (req, res) => {
    if (req.session.user && req.cookies.user_sid) {
        res.clearCookie('user_sid');
        res.redirect('/');
    } else {
        res.redirect('/login');
    }
});


// route for handling 404 requests(unavailable routes)
app.use(function (req, res, next) {
  res.status(404).send("Sorry can't find that!")
});


// start the express server
app.listen(app.get('port'), () => console.log(`App started on port ${app.get('port')}`));

Статические файлы

Теперь давайте создадим необходимые статические файлы ( feignup.html , login.html и dashboard.html ) для нашего приложения. Введите следующую команду в вашей командной строке:

$ touch public/signup.html public/login.html public/dashboard.html

Наша структура папки теперь должна выглядеть таким образом:

Выстрел на экране 2017-04-06 в 10.33.14 PM.PNG

Давайте добавим следующий код для нашего Public/feignup.html :


    
        Login Here
        
    
    
        

        

        

Далее – Public/login.html :


    
        Login Here
        
    
    
        

        

        

И, наконец, наш Public/Dashboard.html :


    
        Login Here
        
    
    
        

        

        

Hi, Welcome to your Dashboard

Теперь давайте выстрелите сервер, введите следующую команду в вашей командной строке:

$ node server.js

Откройте свой браузер и перейдите к http://localhost: 9000/Регистрация , зарегистрируйтесь с именем пользователя, электронной почтой и паролем.

После регистрации и успешного входа в систему, проверьте ваш браузер, чтобы подтвердить, что файл cookie был сохранен. Вы должны увидеть что-то похожее на это:

Снятый на экран 2017-04-06 в 10.38.50 PM.PNG

Нажмите кнопку «Выйти» и проверьте ваше cookie еще раз, чтобы подтвердить, что он был удален.

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

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

Мне нравится и цените обратную связь, пожалуйста, используйте комментарий ниже для вопросов, предложений и отзывов. Спасибо