Технології
Перед тим, як почати по-справжньому програмувати, давайте розглянемо деякі нові технології, які ми будемо використовувати у наступних розділах.
Що таке Passport.js?
Проста, ненав'язлива аунтентифікація для Node.js - passportjs.org
Passport - міддлвер аутентифікації для Node.js. Надзвичайно гнучкий і популярний, Passport можна використовувати у будь-якому застосуванні на базі Express. Набір з різними видами аутентифікації, використовуючи ім'я користувача і пароль, Facebook, Twitter та ін. Ми будемо використовувати Passport для управління сесіями.
Що таке Redis?
Redis - сховище ключ-значення, яке розміщується у пам'яті, воно використовується як база даних, кеш та брокер повідомлень. - redis.io
Ми будемо зберігати інформацію про сесію користувача на Redis.
Демо-Застосунок
Для прикладу, давайте створимо застосунок, який робить наступне:
- надає форму входу,
- надсилає дві закриті сторінки:
- сторінка профілю,
- безпечні нотатки
Структура Проекту
Ви вже знаєте, як структурувати проекти на Node.js з попередніх розділів Node Hero, то давайте ж використаємо ці знання на практиці!
Ми будемо використовувати наступну структуру:
├── app
| ├── authentication
| ├── note
| ├── user
| ├── index.js
| └── layout.hbs
├── config
| └── index.js
├── index.js
└── package.json
Як ви бачите, ми будемо розміщувати файли та директорії по властивостям. Ми матимемо сторінку користувача, сторінку нотаток та деякі функціональності для аутентифікації.
Завантажте повний код на https://github.com/RisingStack/nodehero-authentication
Процес Аутентифікації у Node.js
Наша мета полягає в тому, щоб реалізувати наступний процес аутентифікації у нашому застосунку:
-
Користувач вводить ім'я користувача і пароль
-
Застосунок перевіряє їх на відповідність
-
Якщо вони відповідають один одному, застосунок посилає заголовок
Set-Cookie
, який буде використовуватися для аутентифікації на наступних сторінках -
Коли користувач відвідує сторінки з одного домена, раніше встановлений cookie буде додаватися до всіх запитів
-
Аутентифікація обмежених сторінок з цим cookie
Для того, щоб створити таку стратегію аутентифікації, виконаємо наступні три кроки:
Крок 1: Налаштування Express
Ми будемо використовувати Express для серверного фреймворку. Про Express писалося у попередніх розділах.
// file:app/index.js
const express = require('express')
const passport = require('passport')
const session = require('express-session')
const RedisStore = require('connect-redis')(session)
const app = express()
app.use(session({
store: new RedisStore({
url: config.redisStore.url
}),
secret: config.redisStore.secret,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
Що ми тут зробили?
Перш за все, ми підключили всі залежності, які необхідні для управління сесіями. Після цього ми створили новий зразок з модуля express-session
, який буде зберігати наші сесії.
Для резервного сховища ми використовуємо Redis, але ви можете використовувати і щось інше, наприклад MySQL або MongoDB.
Крок 2: Налаштування Passport для Node.js
Passport - чудовий приклад бібліотеки, яка використовує плагіни. Для цього туторіалу ми додаємо модуль passport-local
, який дає змогу легко інтегрувати простий локальний процес аутентифікації використовуючи імена користувачів і паролі.
Для простоти, в цьому прикладі ми не будемо використовувати друге резервне сховище, а використаємо лише користувацькі екземпляри, які розміщуються у пам'яті. У реальних застосунках findUser
буде шукати користувача у базі даних.
// file:app/authenticate/init.js
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const user = {
username: 'test-user',
password: 'test-password',
id: 1
}
passport.use(new LocalStrategy(
function(username, password, done) {
findUser(username, function (err, user) {
if (err) {
return done(err)
}
if (!user) {
return done(null, false)
}
if (password !== user.password ) {
return done(null, false)
}
return done(null, user)
})
}
))
Після того, як findUser
повернеться з нашим об'єктом користувача, єдине, що нам залишиться зробити, - порівняти введений коритувачем і реальний паролі, щоб перевірити на збіжність.
Якщо вони збігаються, ми даємо користувачу право на вхід (повернувши користувача passport"у - return done(null, user)
), якщо ні, то ми повертаємо помилку аутентифікації (нічого не повернувши passport"у - return done(null)
).
Крок 3: Додаємо Закриті Кінцеві Точки
Для додавання закритих кінцевих точок, ми використовуємо шаблон міддлверу, який використовує Express. Для цього давайте спочатку створимо міддлвер аутентифікації:
// file:app/authentication/middleware.js
function authenticationMiddleware () {
return function (req, res, next) {
if (req.isAuthenticated()) {
return next()
}
res.redirect('/')
}
}
Єдине, що він робить, - якщо користувача аутентифіковано (отримано правильні cookie), він просто викликає наступний міддлвер; в іншому випадку він перенаправляє на сторінку, на якій користувач може увійти в систему.
Його використання таке ж просте, як і додавання нового міддлверу у маршрут.
// file:app/user/init.js
const passport = require('passport')
app.get('/profile', passport.authenticationMiddleware(), renderProfile)
Далі: Частина 9 - модульне тестування у Node.js
Ще немає коментарів