Добавление аутентификации в экспресс с паспортом

Введение Аутентификация пользователей - одна из тех вещей, о которых вы, вероятно, не слишком много задумываетесь, но практически каждый веб-сайт или приложение требует этого. Если бы вам пришлось реализовать аутентификацию самостоятельно, не могли бы вы? Что ж, не волнуйтесь, вам, вероятно, не придется. Поскольку эта функция настолько распространена, почти для каждого языка / веб-фреймворка, с которым я столкнулся, уже есть готовое решение, а для Node вы можете использовать плагин Express Passport. Как всегда, рекомендую доверять населению

Вступление

Аутентификация пользователей - одна из тех вещей, о которых вы, вероятно, не слишком много задумываетесь, но практически каждый веб-сайт или приложение требует этого. Если бы вам пришлось реализовать аутентификацию самостоятельно, не могли бы вы? Что ж, не волнуйтесь, вам, вероятно, не придется. Поскольку эта функция настолько распространена, почти для каждого языка / веб-фреймворка, с которым я столкнулся, уже есть готовое решение, а для Node вы можете использовать плагин Express Passport.

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

Что такое паспорт

Пакет Passport - это расширяемое модульное промежуточное ПО для аутентификации для Node.js, которое добавляет функциональность аутентификации в ваше приложение Express. Когда большинство людей думают об аутентификации, они думают о традиционной комбинации имени пользователя и пароля. Хотя это все еще очень популярно, использование других сервисов для аутентификации пользователя через OAuth стало еще одним популярным методом. Поскольку Passport является очень расширяемым промежуточным программным обеспечением, он позволяет подключать более 300 различных поставщиков аутентификации, таких как Facebook, Twitter, Google и другие, большинство из которых используют стандарт OAuth.

Однако не все стратегии используют OAuth. Вы также можете выбрать на основе хэша (передача хеша через строку запроса, данные POST или в заголовках HTTP), веб-токены JSON или даже обычную аутентификацию HTTP (например: http://username: [email protected] / ). Хотя некоторые из этих стратегий могут принимать разные параметры, они в основном будут одинаковыми, поэтому вы сможете легко менять стратегии, если это необходимо.

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

Как пользоваться паспортом

Чтобы использовать Passport, вам необходимо подключить его к своему app Express, как и любое другое промежуточное ПО :

 var express = require('express'); 
 var passport = require('passport'); 
 
 var app = express(); 
 
 app.configure(function() { 
 app.use(express.cookieParser()); 
 app.use(express.bodyParser()); 
 app.use(express.session({ secret: 'derpy' })); 
 
 app.use(passport.initialize()); 
 app.use(passport.session()); // Required for persistent login sessions (optional, but recommended) 
 }); 

Обратите внимание, что если вы решите включить сеансы, вам необходимо использовать express.session() перед passport.session() чтобы убедиться, что сеанс входа пользователя восстанавливается в правильном порядке.

В большинстве случаев вам нужно включить сеансы, иначе пользователь не будет запоминаться между запросами.

После того, как вы инициализировали Passport и настроили сеансы, пришло время настроить вашу стратегию. Как я сказал ранее, большинство из них очень похожи по настройке, поэтому давайте просто взглянем на наиболее часто используемую стратегию, LocalStrategy :

 var LocalStrategy = require('passport-local').Strategy; 
 
 // Express/Passport setup here... 
 
 passport.use(new LocalStrategy( 
 { 
 usernameField: 'email', 
 passwordField: 'password' 
 }, 
 function(email, password, done) { 
 User.loadOne({ email: email }).then(function(user) { 
 if (!user || !user.authenticate(password)) { 
 return done(null, false, { message: 'Incorrect email or password.' }); 
 } 
 
 done(null, user); 
 }); 
 }) 
 ); 

Часть User.loadOne... будет специфичной для вашего приложения (здесь я использую Camo ODM). Обратный вызов отправляет вам имя пользователя / адрес электронной почты и пароль, которые в случае «Локальной стратегии» были получены из представленных данных формы с полями ввода с именами email и password .

HTML-форма, из которой поступают эти данные, может выглядеть примерно так:

 <form method="post" role="form"> 
 <input type="text" name="email"/> 
 <input type="password" name="password"/> 
 <button type="submit">Login</button> 
 </form> 

Обратите внимание, что поля называются email и password как мы указали в LocalStrategy выше.

Поскольку этот адрес электронной почты и пароль извлекаются из req помощью Passport, мы можем найти пользователя в нашей базе данных, а затем сравнить данный пароль с тем, который мы получили из базы данных (не волнуйтесь, это соленый хеш пароля). Возврат действительного объекта пользователя в done сообщает Passport, что учетные данные действительны. В противном случае мы возвращаем false и сообщение об ошибке.

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

 // Express/Passport setup here... 
 
 // Passport strategy setup here... 
 
 passport.serializeUser(function(user, done) { 
 done(null, user.id); 
 }); 
 
 passport.deserializeUser(function(id, done) { 
 User.loadOne({ _id: id }).then(function(user) { 
 done(null, user); 
 }).catch(function(err) { 
 done(err, null); 
 }); 
 }); 

В приведенной serializeUser мы уже получили данные пользователя из базы данных и должны сообщить Passport, какую информацию использовать в файле cookie для однозначной идентификации пользователя, которым в данном случае является user.id

Для deserializeUser Passport получил строку cookie (идентификатор пользователя) и должен преобразовать ее в объект пользователя. Поэтому мы используем id для поиска пользователя в базе данных. То, что вы здесь возвращаете, передается в каждом запросе как req.user к маршруту.

Заключение

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

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

Что вы думаете о паспорте и как вы его использовали в прошлом? Дайте нам знать об этом в комментариях!

comments powered by Disqus