Автор оригинала: 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Отказ - Мы внесли новые изменения в
CreateReflectionTableSQL 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'sISVALDEMAILМетод мы создали на предыдущем шаге. Мы создали постоянную переменную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, если вы еще не читали
Как всегда, бросьте свои вопросы и комментарии.