Node Hero: Частина 8 - Аутентифікація у Node.js використовуючи Passport.js

5 хв. читання

Технології

Перед тим, як почати по-справжньому програмувати, давайте розглянемо деякі нові технології, які ми будемо використовувати у наступних розділах.

Що таке 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

Наша мета полягає в тому, щоб реалізувати наступний процес аутентифікації у нашому застосунку:

  1. Користувач вводить ім'я користувача і пароль

  2. Застосунок перевіряє їх на відповідність

  3. Якщо вони відповідають один одному, застосунок посилає заголовок Set-Cookie, який буде використовуватися для аутентифікації на наступних сторінках

  4. Коли користувач відвідує сторінки з одного домена, раніше встановлений cookie буде додаватися до всіх запитів

  5. Аутентифікація обмежених сторінок з цим 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
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація