Рубрики
Без рубрики

Создание простых API с Nodejs, Expressjs, PostgreSQL DB и JWT – 3

В этой части мы узнаем, как защитить наши конечные точки с JWT (JSON Web Token) таким, что только аутентифицированные пользователи могут получить доступ к ним.

Автор оригинала: Olawale Aladeusi.

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

Мы начали эту серию, создав пять простых конечных точек, используя основные объекты JS, чтобы сохранить наши данные. В части 2 мы узнали, как подключить наше приложение для PostgreSQL DB и сохранить данные пользователя напрямую на нем. Мы также решили не использовать ORM, чтобы мы могли лучше понять, как использовать RAW SQL, чтобы запросить наши данные в БД, которые мы узнали, потому что мы смогли создать Размышления Таблица, вставка, обновление, удаление и извлечение данных из таблицы с помощью RAW SQL-запросов. Однако с тем, что мы сделали до сих пор, когда пользователь Пользователь A создает отражение Пользователь B Также можно увидеть то же отражение. Наша цель была для отражений, созданных, чтобы всегда быть частным таким, что только Пользователь A можно увидеть его/ее собственное отражение. Пользователь B не должен быть в состоянии увидеть Пользователь B Размышления или любые отражения других пользователей в системе. Как мы решаем это? В этой части мы узнаем, как защитить наши конечные точки с JWT (JSON Web Token) таким, что только аутентифицированные пользователи могут получить доступ к ним.

Todo Ниже приведены шаги, которые мы будем следовать в достижении нашей цели

  • Установите необходимые зависимости. jsonwebkoken – будет использоваться для генерации и проверки токена и BCRYPT – Будет использоваться для использования пароля пользователя, прежде чем сохранить его в БД.
  • Создайте таблицу пользователей и настройте отношения в одну ко многим между таблицей пользователей и таблицей отражений в БД
  • Создайте класс HELPER – нам нужно создать некоторые помощники, которые помогут нам в генерации токена, пароля HASHING, проверяющих пароль пользователя с соответствующим HASHED Password и проверкой, если введите адрес электронной почты действителен.
  • Создать регистрацию, логин, Удалить методы контроллера
  • Создать Auth Marmware
  • Обновить контроллер отражений, чтобы запросить БД на основе текущего идентификатора пользователя
  • Обновить Server.js.

Шаг 1 – Установка зависимостей

Запустите следующую команду на терминале, чтобы установить требуемые зависимости

$ npm install --save bcrypt jsonwebtoken

Как я объяснил раньше, нам нужно BCRYPT Чтобы записать пароль пользователя перед сохранением его в БД и jsonwebkoken будет использоваться для генерации и проверки токена.

Шаг 2 – Создать таблицу пользователя

Мы создадим новый стол Пользователи с ID , Email , пароль , create_date и modified_date Отказ Нам также нужно настроить один ко многим отношения между Пользователи стол и Размышления Таблица – это означает, что пользователь может иметь более одного отражения. Мы достигнем этого, создав внешний ключ в таблице размышлений, которые ссылаются на таблицу пользователей через его первичный ключ. Концепция иностранного ключа в основном, чтобы помочь в соединении двух таблиц вместе через первичный ключ на главной таблице. Вы можете прочитать больше об этом онлайн. Обновить db.js со следующим кодом

alt.

Здесь мы сделали несколько изменений, они включают следующее;

  • Создана новая функция CreateUsertable С запросом для создания Пользователи Таблица. Это следует тот же формат, который мы использовали в создании Размышления Таблица в части 2 этой серии. Что это за запрос Создать таблицу, если не существует пользователей (...) Есть ли создать новую таблицу под названием Пользователи С определенными определенными столбцами (идентификаторами, электронной почтой, паролем, созданием_date и Modified_date), если оно не существует в БД. Таблица требует только электронного письма и пароля, чтобы сделать это простым. Вы заметите, что Электронная почта varchar (128) Уникальный не нуль Уникальный, это сделать электронную почту уникальным. Если пользователь пытается зарегистрироваться с уже существующим электронным письмом, он бросит ошибку.
  • Создана новая функция drobusertable бросить Пользователи Таблица. Также следует тот же формат, который мы использовали для падения Размышления Таблица в части 2 этой серии. Настольная таблица, если существует пользователи Выпадение/удалить таблицу (пользователи), если она существует.
  • Мы сделали некоторую корректировку до предыдущих функций, чтобы сделать его более конкретным. Мы изменили капли к Droprefliectable и CreateTables к CreateReflectionTable Отказ
  • Мы внесли новые изменения в CreateReflectionTable SQL Query, добавив Owner_id Uuid не нуль и Зарубежный ключ (INVERAL_ID) Ссылки пользователей (ID) на удалении каскада Отказ Мы добавляем suder_id Чтобы иметь новый столбец на таблице, которая принимает удостоверение личности пользователя, это поможет нам в отслеживании, которым принадлежит конкретное отражение. Мы используем Зарубежный ключ (INVERAL_ID) Ссылки пользователей (ID) на удалении каскада ссылаться на таблицу отражений, указав его внешний ключ Иностранный ключ (Subster_id) – столбец, связанный с внешним ключом здесь suder_id Отказ Рекомендации пользователей (ID) используется для ссылки на основной стол в этом случае Пользователи стол и использовать (ID) Чтобы указать его первичный ключевой столбец. Мы использовали это На удалении каскада Чтобы сказать нашу БД, чтобы удалить каждое отражение, связанное с конкретным пользователем, когда этот пользователь был удален из БД – это означает, что когда мы удаляем Пользователь A , каждое отражение, созданное Пользователь A будет автоматически удален из БД.
  • Наконец, мы создали еще две новые функции CreatealLtabltables () – Звонки для выполнения двух других функций, которые создают таблицы пользователей и размышления, а Dropalltables () – Призывы к выполнению двух других функций падения. Причина этих двух функций заключалась в том, чтобы избежать запуска двух отдельных команд при создании или отброшении двух таблиц (пользователей и размышления).

Шаг 3 – Создать класс помощника

Создайте новый файл JS в SRC/ИспользованиеDB/Контроллеры/ и назвать это Helper.js Добавьте следующий код в файл.

alt.

Мы создали новый Помощник объект с четырьмя методами.

  • hashpassword () Метод Возвращает хешированное значение строки с использованием BCRYPT Упакованные открытые Hashsync метод. Hashsync Принимает два параметра строка (пароль) и количество раундов/соли – количество раундов определяет количество раз, когда предоставленная строка будет хэшироваться. Чтобы генерировать нашу соль, мы использовали другой BCRYPT Расстоянный метод Gensaltsync И мы отправляем в 8 как количество раундов, которые мы хотим, чтобы пароль был хэш.
  • Сравнительное слово () – Этот помощник будет необходим, когда пользователь хочет войти в систему. Метод принимает два аргумента пароль – Войдите в систему предоставляют пароль и hashpassword – Хэш-пароль, извлеченный из БД на основе чего пароль пользователь, используемый во время регистрации. Мы использовали Сравнитель другой BCRYPT Модуль открытый метод по сравнению с двумя паролем, и он возвращает либо верно, либо false в зависимости от того, если два совпадания пароля совпадают или нет.
  • ISVALDEMAIL () Метод использует Regex в проверке предоставленного адреса электронной почты пользователя.
  • GenerateToken () : Мы использовали jwt.sign (..) При подписании токена пользователя, отправив UsilID в качестве полезной нагрузки и установки токена, чтобы истечь через 7 дней.

Шаг 4 – Создать регистрацию, логин, Удалить методы контроллера

Теперь давайте создадим контроллер пользователя с помощью методов регистрации, входа в систему и удаление. Создайте новый файл JS в SRC/ИспользованиеDB/Контроллеры/ и назвать это User.js Отказ Добавьте следующее в файл

alt.

Шаги кода:

  • Мы создали новый объект пользователя с Создать () , Войти () и Удалить () методы.
  • Создать () – Мы настроили состояние если (! req.body.email ! Req.body.password) {…} Чтобы подтвердить, что оба пароль и Email существуют в тело запроса. Если (! helper.isvalidEmail (req.body.email)) {..} Проверяет, если пользователи действительны по электронной почте, используя Helper's ISVALDEMAIL Метод мы создали на предыдущем шаге. Мы создали постоянную переменную hashpassword и назначил результат Helper.hashpassword (req.body.password) К нему - (как эта работа была объяснена на предыдущем шаге.). Мы устанавливаем запрос для вставки значений пользователя в таблицу пользователей. Вы заметите, что мы сохраняем сгенерированные hashpassword В таблицу, в отличие от текста простого пароля, предоставленного пользователем, для причины безопасности, мы не хотим сохранять пароль RAW пользователя к БД. Мы создали новую переменную под названием токен и назначил результат Helper.generateToken (строки [0] .id)
  • к этому. Наконец, если все работает хорошо, мы отправляем сгенерированный токен обратно пользователю, пользователь может использовать токен для каждого последующего запроса на сервер. Войти () - Мы используем это для подписания пользователя, у которого уже есть учетная запись. Мы ищем таблицу пользователя DB, чтобы проверить, будет ли пользователь с предоставленным электронным письмом, и если пользователь существует, мы проверяем, если предоставленный паролем пользователя сопоставляет пароль HASH, сохраненным в БД, позвонив на Сравнительное слово в нашем Помощник
  • Объект с помощью хешированного пароля, полученный из пароля БД и пользователя из корпуса запроса. Если два совпадали с паролем, то мы генерируем новый токен для пользователя, и токен можно использовать для каждого последующего запроса на сервер. Удалить ()

Шаг 5 – Создать Auth Marmware

Чтобы подтвердить каждый запрос на любой из наших маршрутов, нам нужно настроить промежуточное программное обеспечение. На этом этапе мы установим новое промежуточное программное обеспечение, которое проверяло бы токен пользователя. Создайте новую папку внутри SRC/ИспользованиеDB и назвать это промежуточное программное обеспечение Отказ Создайте новый файл JS внутри промежуточное программное обеспечение папка и назвать ее Auth.js Отказ Добавьте следующий код в Auth.js.

alt.

Здесь мы создаем новый объект auth с VerifyToken () метод. Что VerifyToken () Способ имеет в основном для проверки и декодирования токена запроса пользователей, используя тот же секретный ключ, который мы использовали при подписании токена. Мы использовали Req.Headers [«X-Access-Token»] Чтобы получить токен из заголовка запроса и отправить его на jwt.verify (..) Наряду с секретом, который мы использовали в подписании токена. Если токен действителен, мы получаем UserID из полезной нагрузки токена и запрашивайте БД, чтобы убедиться, что пользователь существует в БД. Если пользователь существует в БД, мы создали новое свойство объекта в req объект req.user и назначен {ID: декодируется .userid} К нему – мы будем использовать это, чтобы обработать другие запросы обработчика. Наконец, поскольку этот метод является промежуточным программным обеспечением, мы использовали Далее () При переходе к следующему запросу обработчик. Если какая-либо ошибка произошла здесь, мы возвращаем сообщение об ошибке обратно пользователю без необходимости переходить к следующему обработчику запроса.

Шаг 6 – Обновить контроллер отражений

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

Обновить SRC/ИспользованиеDB/Контроллеры/Отражение .JS со следующим

alt.

Здесь мы сделали следующее

  • Обновлено Создать () Метод Вставить Запрос к фактору в suder_id Отказ Мы устанавливаем suder_id Значение для req.user.id (Вспомнили, что мы приложили Пользователь на req объект на нашем промежуточном программе – предыдущий шаг).
  • getall () – Мы приложили новый Где Состояние, чтобы получить все отражения запроса, используя ustral_id. Это вернет все отражения, созданные текущим пользователем.
  • getOne () – То же, что мы сделали для getall () метод. Мы приложили новый Где Состояние для получения отражения только в том случае, если его ustrual_id такой же, как текущий userId.
  • Обновление () – Мы также сделали то же самое здесь. Добавил новый Где Состояние для восстановления и обновления отражения только в том случае, если Sublic_id отражения является таким же, как текущий userId
  • Удалить () – Удалите отражение, только если его ustral_id такой же, как текущий userId.

Шаг 7 – Обновить Server.js

Наконец, давайте обновим нашу логику Server.js для фактора нашего нового Auth Middleware. Мы также новы, чтобы создать маршрут нашего пользователя.

Обновите Server.js со следующим кодом

alt.

Здесь мы сделали следующее;

  • Импортирован Auth и User Swithdb от /SRC/ИспользованиеDB/Mardware/Auth и /SRC/ИспользованиеDB/Контроллер/Пользователи соответственно.
  • Мы создали новые конечные точки для создания пользователей – Post/API/V1/Пользователи , войдите пользователя – Post/API/V1/Пользователи/Вход И удалить пользователя – Удалить/API/V1/Пользователи/Меня Отказ
  • Мы приложили новый обработчик Auth.VeyifyToken ко всем нашим отражениям конечных точек и Удалить/API/V1/Пользователи/Меня конечная точка. Это должен убедиться, что только пользователь с действительным токеном может получить доступ к этим маршрутам. Каждый запрос на любой из конечных точек отражений пройдет через Auth.VeyifyToken промежуточное программное обеспечение перед обработкой фактического запроса. С этой новой настройкой пользователь без действительного токена получит ошибку.

Одна окончательная вещь, нам нужно создать новую переменную среды и назвать ее Секрет Отказ Вы помните, что мы используем Секрет в подписании и проверке токена пользователя. Добавить Secret = Justanotherrandomsecretkey к вашему проекту .env файл. Примечание – вы можете дать ему все, что вам нравится.

ЗАПУСТИТЬ

Давайте запустим наш сервер

  • Запустите следующую команду с терминала, чтобы создать таблицы БД
$ node db.js createAllTables
  • Запустите сервер
$ npm run dev-start

КОНТРОЛЬНАЯ РАБОТА

Создать пользователя – Post API/V1/пользователей

Выстрел на экране 2018-08-23 в 11.23.55 AM.PNG

Войти – Post API/V1/Пользователи/Логин ‘

Снятый экран 2018-08-23 в 11.26.07 AM.PNG

Создать отражение – Post/API/V1/Отражения Скопируйте токен, полученный от входа и установите его в заголовок запроса с помощью Key X-Access-токен

Снятый экран 2018-08-23 в 11.28.59 am.png

Нерешенные вопросы

Ниже приведены вопросы для этой работы, пожалуйста, не стесняйтесь работать по любому из вопросов и повысить запрос на потяжку на Репо Отказ

ИспользованиеDB.

  • Создайте конечную точку, чтобы получить все пользователи – Получить/API/V1/пользователи
  • Создайте конечную точку, чтобы получить текущие данные пользователя – Получить/API/V1/пользователи/я
  • Создайте конечную точку для редактирования текущих деталей пользователя – Путь/API/V1/Пользователи/Меня
  • Создайте конечную точку, чтобы получить все размышления о текущих пользователей – Получить/API/V1/Размышления/Меня

ИспользованиеJSObject В настоящее время этот код будет работать только тогда, когда Тип В противном случае он будет бросить ошибку. Чтобы он работал на ИспользованиеJSObject нам нужно настроить следующее;

  • Настройка пользовательского контроллера – требование для этого является следующее;
    • Настройте пользовательский контроллер по крайней мере Создать () , Войти () и Удалить () методы
    • Настройте Auth Mardware, чтобы проверить/подтвердить токен пользователя
  • Обновить контроллер рефлексии для использования INVERAL_ID
  • Обновите Server.js Для использования Auth Mardware при типе
  • Создайте все конечные точки для пользователей.

В моем, наконец, учебник для этой серии, я скомпилирую все объединенные PRS и ссылаетесь на тех, которые работали над ними.

Оформить заказ полный код здесь

Проверьте часть 1 и часть 2, если вы еще не читали

Как всегда, бросьте свои вопросы и комментарии.