Ускоренный курс защиты бессерверных API с помощью веб-токенов JSON

uskorennyj kurs zashhity besservernyh api s pomoshhyu veb tokenov json

Каков полный рот заголовка. Вы бы не согласились? В этом пошаговом руководстве вы узнаете о защите ваших бессерверных конечных точек с помощью веб-токенов JSON.

Это будет включать базовую настройку бессерверного REST API с несколькими конечными точками и, конечно, уполномоченный функция. Это уполномоченный будет действовать как промежуточное программное обеспечение для авторизации доступа к вашим ресурсам.

В процессе создания мы будем использовать фреймворк без сервера для моделирования среды разработки, как вы привыкли. Завершая руководство, мы также настроим инструмент мониторинга под названием Dashbird. Это позволит нам имитировать возможности отладки и обзор обычной программы Node.js естественным и легким для понимания способом. Он также имеет бесплатный уровень и не требует кредитной карты для настройки.

Если что-то, о чем я только что упомянул выше, ново для вас, не волнуйтесь. Ниже я все объясню. В противном случае вы можете обновить свои знания, просмотрев эти учебники:

TL; DR

Прежде чем прыгнуть в голову, вы можете сильно повредить моим чувствам и прочесть только этот TL; DR. Или продолжайте читать всю статью. ❤

Готовы? Давай прыгаем!

Создание API

Прежде всего нам нужно настроить фреймворк без сервера для нашей локальной среды разработки. Этот каркас есть где факто фреймворк для всего, что касается бессерверных архитектур. Перейдите на их сайт и следуйте инструкциям, чтобы настроить его, или обратитесь к статье, на которую я ссылался выше.

Процесс установки невероятно прост. Вы настраиваете роль управления AWS в своем аккаунте AWS и связываете его с установкой бессерверной платформы. Фактический процесс установки – это только запуск одной простой команды.

Запустите окно терминала и выполните следующую команду.

$ npm install -g serverless

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

$ sls create -t aws-nodejs -p api-with-auth

Вышеприведенная команда сгенерирует нужный вам шаблонный код.

Выделите только что созданный каталог под названием api-with-auth и откройте его с помощью редактора кода по выбору.

$ cd api-with-auth

После открытия вы увидите два основных файла. А handler.js и а serverless.yml файл. The handler.js содержит логику нашей программы в то время как serverless.yml определяет наши ресурсы.

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

$ npm init -y$ npm install --save bcryptjs bcryptjs-then jsonwebtoken mongoose

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

$ npm install --save-dev serverless-offline

Прекрасно!

Добавление базы данных

Для постоянного хранилища данных мы просто захватим размещенный экземпляр MongoDB в MongoDB Atlas. Вот ссылка на статью, где я подробно объяснил это.

В корне папки службы создаем файл a db.js файл, чтобы сохранить нашу логику подключения к базе данных. Вставьте этот фрагмент кода.

Это достаточно простая реализация подключения к базе данных, если подключения не существует. Но если оно существует, я буду использовать уже установленное соединение. Вы видите process.env.DB? Мы будем использовать обычай secrets.json файл, чтобы наши частные ключи не входили в GitHub, добавив его в файл .gitignore. Затем этот файл будет загружен в файл serverless.yml. Собственно, давайте сделаем это сейчас.

Добавьте свою строчку подключения MongoDB к db поле.

После создания этого файла давайте перейдем в serverless.yml. Откройте его и удалите весь шаблонный код, чтобы мы могли начать новое. Затем вставьте это.

Как видите, это только простая конфигурация настройки. The custom раздел указывает основной конфигурации захватывать значение из a secrets.json файл. Мы добавим этот файл к .gitignore потому что нажатие частных ключей к GitHub является смертным грехом, который карается смертью! Не слишком, но все же не нажимайте клавиши на GitHub. Серьезно, пожалуйста, не поступай.

Добавление функций

Осталось сделать немного настроек, прежде чем перейти к бизнес-логике! Нам нужно добавить определение функций в файл serverless.yml прямо под разделом поставщиков, который мы добавили выше.

Всего пять функций.

  • The VerifyToken.js будет содержать an .auth метод проверки подлинности JWT, передаваемый вместе с запросом на сервер. Это будет наше уполномоченный функция. Концепция того, как работает авторизатор, очень похожа на то, как работает промежуточное программное обеспечение в обычном старом базовом Express.js. Только шаг между получением сервера запроса и обработкой данных, которые будут отправлены клиенту.
  • The login и register функции будут выполнять основную аутентификацию пользователя. Мы добавим бизнес-логику для тех, кто в AuthHandler.js файл.
  • Однако, me функция будет соответствовать текущему аутентифицированному пользователю на основе предоставленного маркера JWT. Вот где мы будем использовать уполномоченный функция.
  • The getUsers функция – это просто общий публичный API для получения зарегистрированных пользователей из базы данных.
1*OkT0fGBzGM7Ig6ZkAkdwSw

от serverless.yml Вы можете рассмотреть приблизительную структуру проекта. Чтобы было понятнее, посмотрите выше.

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

Добавление бизнес-логики для пользователей

Вернувшись в редактор кода, удалите файл handler.js файл и создайте новую папку, назвав ее user. Здесь вы добавите а User.js файл для модели, и a UserHandler.js для подлинной логики.

Достаточно просто, если вы уже писали программу Node. Нам нужен Mongoose, создаем схему, добавляем ее в Mongoose как модель, наконец экспортируем ее для использования в другой части программы.

После того, как модель готова, пора добавить базовую логику.

Это немного сложно понять, когда вы видите его в первый раз. Но начнем сверху.

Требуя db.js У нас есть доступ к подключению к базе данных на MongoDB Atlas. Посредством нашей специальной логики проверки соединения мы убедились, что не создаем новое соединение после установки.

The getUsers вспомогательная функция будет получать только всех пользователей, в то время как module.exports.getUsers Лямбда-функция подключится к базе данных, запустит вспомогательную функцию и вернет ответ клиенту. Этого более чем достаточно для UserHandler.js. Настоящее удовольствие начинается с AuthProvider.js.

Добавление аутентификации

В корне вашего сервиса создайте новую папку под названием auth. Добавьте новый файл под названием AuthHandler.js. Этот обработчик содержит основную логику аутентификации для нашего API. Не тратя больше времени, вставьте этот фрагмент в файл. Эта логика позволит регистрировать пользователя, хранить его в базе данных и возвращать токен JWT клиенту для сохранения в будущих запросах.

Сначала нам нужны зависимости и добавляем module.exports.register функция. Это достаточно просто. Мы снова подключаемся к базе данных, регистрируем пользователя и посылаем назад объект сеанса, который будет содержать маркер JWT. Присмотритесь поближе к местным register() функцию, потому что мы ее еще не объявили. Останьтесь со мной еще несколько секунд, мы дойдем до этого через мгновение.

После правильной настройки основной структуры давайте начнем с добавления помощников. В то же самое AuthHandler.js файл продолжайте и вставьте это тоже.

Мы создали три вспомогательные функции для подписания токена JWT, проверки введенных пользовательских данных и создания пользователя, если они еще не существуют в нашей базе данных. Прекрасно!

С register() функция завершена, нам все еще нужно добавить login(). Добавьте module.exports.login прямо под комментарием функций.

У нас снова есть локальная функция, на этот раз названная login(). Также под комментарием помощников.

Прекрасно! Мы также добавили помощников. С этим мы добавили аутентификация к нашему API. Так просто. Теперь у нас есть модель аутентификации на основе токенов с возможностью добавления авторизации. Это будет наш следующий шаг. Держись!

Добавление авторизации

С добавлением а VerifyToken.js Мы можем разместить всю логику авторизации как отдельное промежуточное программное обеспечение. Очень удобно, если мы хотим сохранить разграничение проблем. Создайте новый файл под названием VerifyToken.js в auth папку.

У нас есть одна функция, экспортируемая из файла, называется module.exporst.auth с обычными тремя параметрами. Эта функция будет выполнять функцию a промежуточное программное обеспечение. Если вы знакомы с Node.js, вы знаете, что такое промежуточное программное обеспечение, иначе просмотрите это для более подробного объяснения.

The authorizationToken, наш JWT, будет передан в промежуточное программное обеспечение через событие. Мы просто назначаем его локальной константе для облегчения доступа.

Вся логика здесь состоит лишь в том, чтобы проверить, действительно ли токен, и отправить обратно сгенерированную политику, вызвав generatePolicy функция. Эта функция нужна AWS, и вы можете получить ее из различных документов на AWS и на странице примеров Serverless Framework GitHub.

Это важно, потому что мы проходим мимо decoded.id вместе в callback. То есть следующая лямбда-функция, которая стоит позади нашей VerifyToken.auth уполномоченный функция будет иметь доступ к decoded.id в своем event параметр. Прекрасно, правда!?

После того, как мы завершим проверку токена, все, что останется, если добавить маршрут, чтобы сидеть сзади уполномоченный функция. Для простоты добавим a /me маршрут для захвата текущего зарегистрированного пользователя на основе JWT, переданного вдоль GET запрос.

Вернитесь к AuthHandler.js файл и вставьте это.

Прекрасно! Последней лямбда-функцией, которую мы добавим в этом учебнике, будет module.exports.me. Это просто увлечет userId перешел с уполномоченный и позвоните me вспомогательная функция при передаче в userId. The me функция захватит пользователя из базы данных и вернет его вспять. Все module.exports.me Lambda просто получает текущего аутентифицированного пользователя. Но конечная точка защищена, то есть только действительный маркер может получить к ней доступ.

Пока продолжается отличная работа, давайте развернем ее, чтобы мы могли провести некоторое тестирование.

Развертывание

Надеемся, вы настроили свой аккаунт AWS для работы с бессерверной платформой. Если у вас есть, нужно выполнить только одну команду и вы готовы.

$ sls deploy

Вуаль! Дождитесь его развертывания и начните использовать бессерверный API с аутентификацией и авторизацией JWT.

После развертывания функций вы получите набор конечных точек, отправленных вам в терминале. Они нам пригодятся в следующей главе.

1*Hexa4mq9xD91AfZCelMbVw

Тестирование

Последним шагом в любом процессе разработки в идеале должно быть убедиться, что все работает так, как должно. Это не исключение. Одним из двух инструментов, которые я использую для тестирования моих конечных точек, является Insomnia. Итак, я уйду и открою его. Но вы можете использовать Postman или любой другой инструмент, который вам нравится.

Примечание: Если вы хотите начать с тестирования всего локально, будьте моим гостем Вы всегда можете использовать бессерверный режим офлайн.

В своем терминале запустите простую команду:

$ sls offline start --skipCacheInvalidation

Но я люблю заниматься хардкором! Давайте протестуем непосредственно на развернутых конечных точках.

Начните медленно, сначала нажмите /register конечная точка с a POST запрос. Обязательно отправьте полезную нагрузку как JSON. Ударить Отправить и вы получите жетон обратно! Хорошо именно то, что мы хотели.

1*zbCWN9qyIt0_8kWXwjszGQ

Скопируйте маркер и нажмите /me конечная точка с a GET запрос. Не забудьте добавить маркер в заголовки вместе с Authorization ключ.

1*n5QxngulaY-QFfGNUtgm8g

Вы получите текущего пользователя, отправленного вам обратно. И вот оно. Прекрасный.

Чтобы убедиться, что другие конечные точки также работают, нажмите кнопку /login конечная точка с теми же учетными данными, что и у /register конечную точку, которую вы недавно попали.

1*vcc8I4KgAPw-O015G7_ySw

Это работает? Конечно, так. Вот она, полностью функциональная система аутентификации и авторизации, реализована в среде без сервера JWT и Уполномоченные. Осталось только добавить способ контролировать все.

Мониторинг

Обычно я контролирую свои лямбды с помощью Dashbird. Пока что у меня это работало отлично. Я хочу показать вам, что это для вас, посмотрите журналы консоли от вызовов лямбда функции. Они покажут, когда лямбда использует новое или существующее подключение к базе данных. Вот как выглядит главная приборная панель, где я вижу все лямбды и их статистику.

1*pMkJIIgerPBAeq9sf8T0Tg

Скажем, нажав одну из лямбда-функций зарегистрировать, вы увидите журналы для этой конкретной функции. Внизу отображается список вызовов функции. Вы даже можете увидеть какие были аварии и холодные запуски.

1*-yTb5eKa_Uj-X7nfPieLMw

Если нажать кнопку вызова холодного запуска, вы перейдете на страницу вызова и вы увидите хороший журнал с указанием => using new database connectион.

1*unMBkIOwUIOv0EZvVYWr-Q

Теперь вернитесь немного назад и выберите один из вызовов, не являющихся холодным началом. Проверка журналов для этого вызова покажет вам => using existing database connectион.

1*p5WdW_FEKohXcAtKEVfXcA

Хорошо! У вас есть правильное представление о своей системе!

Подведению

Удивительно, что можно сделать с несколькими инструментами. Создание REST API с аутентификацией и авторизацией стало простым с помощью Serverless, JWT, MongoDB и Dashbird. Большая часть подхода к этому учебнику была вдохновлена ​​некоторыми из моих предыдущих пособий. Не стесняйтесь проверить ниже.

Аднан Рахич — Средний
Прочтите текст Аднана Рахича на Medium. Соучредитель @bookvar_co. Учитель @ACADEMY387. Автор @PacktPub. Руководитель лагеря…medium.com

Подход к использованию уполномоченные лица имитация функций промежуточного программного обеспечения невероятно мощна для защиты ваших бессерверных API. Это техника, которую я использую каждый день. Надеюсь, вы найдете это пригодится и в ваших будущих начинаниях!

Если вы хотите посмотреть весь код, который мы написали выше, вот хранилище. Или если вы хотите глубже погрузиться в чудесный мир бессерверных, посмотрите на все инструменты, о которых я упоминал выше, или посмотрите курс, который я написал.

Надеюсь, вам, ребята, понравилось читать это так же, как и мне. Как вы думаете, может ли этот учебник помочь кому-то? Не стесняйтесь делиться. Если вам понравилось, разбейте хлопать ниже, чтобы другие люди увидели это здесь на Medium.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *