Автор оригинала: 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/пользователей
Войти – Post API/V1/Пользователи/Логин ‘
Создать отражение – Post/API/V1/Отражения Скопируйте токен, полученный от входа и установите его в заголовок запроса с помощью Key X-Access-токен
Нерешенные вопросы
Ниже приведены вопросы для этой работы, пожалуйста, не стесняйтесь работать по любому из вопросов и повысить запрос на потяжку на Репо Отказ
ИспользованиеDB.
- Создайте конечную точку, чтобы получить все пользователи –
Получить/API/V1/пользователи
- Создайте конечную точку, чтобы получить текущие данные пользователя –
Получить/API/V1/пользователи/я
- Создайте конечную точку для редактирования текущих деталей пользователя –
Путь/API/V1/Пользователи/Меня
- Создайте конечную точку, чтобы получить все размышления о текущих пользователей –
Получить/API/V1/Размышления/Меня
ИспользованиеJSObject В настоящее время этот код будет работать только тогда, когда Тип
В противном случае он будет бросить ошибку. Чтобы он работал на ИспользованиеJSObject
нам нужно настроить следующее;
- Настройка пользовательского контроллера – требование для этого является следующее;
- Настройте пользовательский контроллер по крайней мере
Создать ()
,Войти ()
иУдалить ()
методы - Настройте Auth Mardware, чтобы проверить/подтвердить токен пользователя
- Настройте пользовательский контроллер по крайней мере
- Обновить контроллер рефлексии для использования INVERAL_ID
- Обновите Server.js Для использования Auth Mardware при типе
- Создайте все конечные точки для пользователей.
В моем, наконец, учебник для этой серии, я скомпилирую все объединенные PRS и ссылаетесь на тех, которые работали над ними.
Оформить заказ полный код здесь
Проверьте часть 1 и часть 2, если вы еще не читали
Как всегда, бросьте свои вопросы и комментарии.