Аутентификация¶
В Node.js аутентификация чаще всего реализуется с использованием функций промежуточной обработки, предоставляемых библиотекой passport.js, которая устанавливается с помощью npm.
1 | |
Для инициализации passport.js обязательно используется функция промежуточной обработки initialize().
1 | |
Если аутентификация не требуется для каждого обращения пользователя к URL, а будет проходить один раз, то для установки сессии необходимо использовать функцию промежуточной обработки session().
1 | |
Логин и пароль¶
Для Node.js аутентификации по логину и паролю необходимо дополнительно установить модуль passport-local.
1 | |
Теперь рассмотрим пример.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | |
Здесь установлен модуль connect-flash, который позволяет использовать flash-сообщения, используемые библиотекой passport.js.
Начнем рассмотрение примера с маршрута /login, определенного для метода POST. Здесь в качестве обработчика указан метод passport.authenticate(), которому передается два параметра:
- Тип стратегии аутентификации, в данном случае
localозначает, что это будет авторизация в пределах разрабатываемого приложения, обычно по логину и паролю; - Объект конфигурации со следующими свойствами:
successRedirect- URL для перехода в случае успешной аутентификации;failureRedirect- URL для перехода в случае ошибки;failureFlash- булевое значение, еслиtrue, то добавит flash-сообщение, переданное методуdone()в случае ошибки.
1 2 3 4 5 | |
Далее идем к функции промежуточной обработки passport.use(), в которой определена логика Node.js аутентификации с помощью выбранной стратегии. В приведенном примере при создании экземпляра стратегии LocalStrategy ее конструктору передается функция, которой передается три параметра:
- имя пользователя;
- пароль пользователя;
- callback-функция, с помощью которой задается результат процесса аутентификации.
По умолчанию ожидается, что имя пользователя и пароль находятся в теле запроса в полях username и password соответственно. Чтобы изменить стандартное поведение - передайте при создании стратегии первым параметром следующий объект.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Callback-функции обязательно передается два аргумента: ошибка исключения, если таковое произошло, и данные пользователя. Если аутентификация прошла неудачно по ошибке самого пользователя (неправильный логин или пароль), то первым параметром передается null, вторым - false. Также при неудачном входе третьим параметром можно передать объект с описанием ошибки, которая будет установлена в качестве flash-сообщения, если в методе passport.authenticate() задан в true параметр failureFlash.
Данные пользователя обязательно должны содержать его идентификатор, иначе будет ошибка.
В случае успешной аутентификации в объекте запроса в свойстве user сохраняются переданные данные пользователя. Именно по наличию данных в req.user и определяется, аутентифицирован пользователь или нет. В примере за эту проверку отвечает функция checkAuth().
1 2 3 4 5 6 | |
Для записи/получения данных пользователя в сессию обязательно необходимо использовать функции промежуточной обработки passport.serializeUser() и passport.deserializeUser().
1 2 | |
Функции промежуточной обработки для записи/чтения пользователя необходимы только в том случае, если используется app.use(passport.session()).
Google и Facebook¶
Использование в Node.js библиотеки passport.js также позволяет осуществлять аутентификацию через социальные сети. Рассмотрим аутентификацию через аккаунты Google и Facebook.
Для аутентификации через Google требуется установка модуля passport-google-oauth.
1 | |
Модуль поддерживает протоколы OAuth 1.0 и OAuth 2.0, но здесь рассмотрим именно OAuth 2.0 в виду того, что он является более новой версии.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | |
Стратегии аутентификации GoogleStrategy передаются два параметра:
- объект с параметрами вашего аккаунта Google (
GOOGLE_CLIENT_IDиGOOGLE_CLIENT_SECRET) и указанием маршрута, к которому нужно обратиться после процесса аутентификации; - функция, описывающая логику аутентификации и устанавливающая конечный результат; принимает следующие параметры:
accessToken;refreshToken;profile- данные профиля пользователя из аккаунта Google;done- функция, с помощью которой задается результат аутентификации (после ее вызова происходит переход на указанный в callbackURL маршрут).
Сама аутентификация начинается с обращения к маршруту /auth/google, в котором с помощью метода passport.authenticate() указывается тип используемой стратегии (google) и параметры так называемого scope.
В маршруте /auth/google/callback указывается, на какие маршруты необходимо перейти в случае успешной или неудачной аутентификации.
Проверка авторизованности пользователя осуществляется по наличию объекта user в объект запроса.
Аутентификация через Facebook практически идентична аутентификации через Google. Сначала необходимо установить модуль passport-facebook.
1 | |
Теперь необходимо заменить описание стратегии и маршрутов-обработчиков из примера аутентификации через Google на следующее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |