
Підтримайте мене, прочитавши його з його першоджерела: ОРИГІНАЛЬНИЙ ДЖЕРЕЛО
У цій статті ви дізнаєтеся, як обробляти автентифікацію для вашого сервера Node за допомогою Passport.js. Ця стаття не охоплює автентифікацію Frontend. Використовуйте це для налаштування автентифікації Backend (Створіть маркер для кожного користувача та захистіть маршрути).
Майте на увазі, що якщо ви застрягнете на будь-якому кроці, ви можете звернутися до цього репозиторію GitHub .
У цій статті я навчу вас наступному:
- Обробка захищених маршрутів
- Обробка токенів JWT
- Обробка несанкціонованих відповідей
- Створення базового API
- Створення моделей та схем
Вступ
Що таке Passport.js?
Passport - це проміжне програмне забезпечення для автентифікації для Node.js. Оскільки паспорт є надзвичайно гнучким і модульним, його можна ненав’язливо впустити в будь-яку веб-програму на базі Express. Комплексний набір стратегій підтримує автентифікацію за допомогою імені користувача та пароля, Facebook, Twitter тощо. Дізнайтеся більше про паспорт тут.
Підручник
Створення нашого вузлового сервера з нуля
Створіть новий каталог за допомогою цього “app.js”файл всередині:
Для легшої розробки ми встановимо nodemon.
і тоді ми будемо запускати наш "app.js" з ним.
$ nodemon app.js

Створення моделі користувача
Створіть нову папку під назвою “моделі”,і створіть файл “Users.js” всередині цієї папки.Тут ми визначимо нашу “Схему користувачів”. Ми збираємось використовувати JWT
і Crypto
генерувати hash
і salt
з отриманого password
рядка. Пізніше це буде використано для перевірки користувача.

Давайте додамо нову модель до “app.js”.
Після налаштування додайте наступний рядок у файл "app.js" Mongoose
:
require('./models/Users');

Налаштуйте паспорт
Створіть нову папку “config” із файлом “паспорт.js” всередині неї:
У цьому файлі ми використовуємо метод, validatePassword
який ми визначили вUser model
. На підставі результату ми повертаємо різні результати, як у Passport LocalStrategy
.

Давайте підключимо файл “visa.js” до нашого файлу “app.js”. Додайте такий рядок нижче всіхmodels
:
require('./config/passport');

Маршрути та параметри автентифікації
Створіть нову папку під назвою „routes” із файлом „auth.js” всередині неї.
У цьому файлі ми використовуємо функцію getTokenFromHeaders
для отримання маркера JWT, який буде надісланий з боку клієнта в заголовках запиту . Ми також створити auth
об'єкт optional
і required
властивості. Ми використаємо їх пізніше в наших маршрутах.
У тій же папці „routes” створіть файл „index.js”:
Тепер нам потрібна папка “api” всередині папки “routes”, а в ній - інший файл “index.js”.

Тепер давайте створимо файл “users.js”, який нам потрібен в “api / index.js”.
По-перше, ми збираємося створити додатковий маршрут автентифікації,‘/’
який буде використовуватися для створення нової моделі (реєстру).
router.post('/', auth.optional, (req, res, next) ...
Після цього ми збираємося створити ще один додатковий маршрут авторизації‘/login’
. Це буде використано для активації конфігурації нашого паспорта та підтвердження отриманого пароля електронною поштою.
router.post('/login', auth.optional, (req, res, next) ...
Нарешті, ми створимо необхідний маршрут авторизації , який буде використаний для повернення поточного авторизованого користувача. Доступ до цього маршруту мають лише зареєстровані користувачі (користувачі, яким маркер успішно відправлений через заголовки запитів).
router.get('/current', auth.required, (req, res, next) ...

Давайте додамо нашу папку „routes” до „app.js”.Додайте такий рядок під наш паспортrequire
:
app.use(require('./routes'));

Тестування маршруту
Я буду користуватися Поштаремнадсилати запити на наш сервер.
Наш сервер приймає таке тіло:
{ "user": { "email": String, "password": String } }
Створення запиту POST для створення користувача
Тест:

Відповідь:
{ "user": { "_id": "5b0f38772c46910f16a058c5", "email": "[email protected]", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgxNTEsImlhdCI6MTUyNzcyNDE1MX0.4TWc1TzY6zToHx_O1Dl2I9Hf9krFTqPkNLHI5U9rn8c" } }
Тепер ми використаємо цей маркер і додамо його до наших “Заголовків” у конфігурації Листоноші.

And now let’s test our auth only route.
Creating a GET request to return the currently logged in user
Request URL:
GET //localhost:8000/api/users/current
Response:
{ "user": { "_id": "5b0f38772c46910f16a058c5", "email": "[email protected]", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgzMTgsImlhdCI6MTUyNzcyNDMxOH0.5UnA2mpS-_puPwwxZEb4VxRGFHX6qJ_Fn3pytgGaJT0" } }
Let’s try to do it without token in “Headers”.
Response:

The end
Thank you for going through this tutorial. If you notice any errors please report them to me. If you got stuck on any step, please refer to this GitHub repo.
You can contact me through:
- erdeljac DOT antonio AT gmail.com
Check out my app SwipeFeed.