Автор оригинала: 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
Файл в вашем корневом каталоге.
Наша структура папки теперь должна выглядеть таким образом:
Теперь давайте добавим следующий код для нашего Модели/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
Наша структура папки теперь должна выглядеть таким образом:
Давайте добавим следующий код для нашего Public/feignup.html
:
Login Here Simple Auth-System
Далее – Public/login.html
:
Login Here Simple Auth-System
И, наконец, наш Public/Dashboard.html
:
Login Here Simple Auth-System
Hi, Welcome to your Dashboard
Теперь давайте выстрелите сервер, введите следующую команду в вашей командной строке:
$ node server.js
Откройте свой браузер и перейдите к http://localhost: 9000/Регистрация , зарегистрируйтесь с именем пользователя, электронной почтой и паролем.
После регистрации и успешного входа в систему, проверьте ваш браузер, чтобы подтвердить, что файл cookie был сохранен. Вы должны увидеть что-то похожее на это:
Нажмите кнопку «Выйти» и проверьте ваше cookie еще раз, чтобы подтвердить, что он был удален.
Yippee !!! Мы только что закончили построить нашу систему мини-аутентификации, не используя паспорт или любой другой волшебный модуль для достижения этого, и это было довольно просто !!!.
Остерегайтесь следующего эпизода этого учебника, в котором мы будем использовать механизм шаблонов, который позволит нам рендерировать Dymanic содержимое на нашей странице, а также для повторного использования контента.
Мне нравится и цените обратную связь, пожалуйста, используйте комментарий ниже для вопросов, предложений и отзывов. Спасибо