Большинство технологических приложений, которые мы используем сегодня, включают двухэтапную аутентификацию для повышения безопасности и предотвращения несанкционированного доступа к личным данным. В этой статье я хочу показать вам, как реализовать двухэтапную аутентификацию в ваших веб-приложениях, используя ваш обычный метод аутентификации и OTP (одноразовые пароли).

Я буду использовать NodeJs и Express в небольшом приложении, которое мы создадим, но я не буду использовать базу данных; Кроме того, я не буду создавать интерфейс для этого, мы будем тестировать все из Postman (или вы можете использовать любой тестовый клиент API по вашему выбору), это позволит нам перейти прямо к делу и уменьшить избыточность.

Для OTP мы будем интегрироваться с Termii и Termii Token API, если быть точным. Это потому, что нам, очевидно, понадобится решение для обмена сообщениями для отправки и доставки SMS, а Termii просто идеален для своей простоты.

Предпосылки

Для того, чтобы успешно завершить это руководство, вам необходимо:

  • базовое понимание NodeJs и Javascript (ES6).
  • существующий проект Node.js. Скелет REST можно сгенерировать с помощью Экспресс-генератора.
  • Node.js установлен на вашем компьютере
  • Клиент Postman установлен на вашем компьютере.

Настройка — проект

  1. используйте express-generator для создания скелета приложения:
npx express-generator --no-view --git otp-app
$ cd otp-app
$ npm install
  1. Создайте папку Services и папку Controller в папке вашего проекта, это шаблон, с которым мне лично нравится работать, вы можете использовать любой другой, если хотите.
  2. создайте файл .env в каталоге вашего проекта и запустите на своем терминале следующее:
npm i dotenv

также откройте app.js и добавьте это как можно раньше:

  1. Мы установим NodeJS SDK для API Termii, это позволит нам сократить 10 строк кода до 1 при интеграции. Запустите следующее в своем терминале.
npm i termii-nodejs

С этим все готово, давайте перейдем к настройке и получению ключа API от Termii.

Настройка — Термии

  1. Посетите https://termii.com и зарегистрируйтесь. Как только это будет сделано, вы сможете найти свой ключ API на панели инструментов. Скопируйте и перенесите его в свой файл env. ваш env должен выглядеть так:

  1. Давайте теперь разберемся с идентификатором отправителя. Идентификатор отправителя — это имя или номер, который идентифицирует отправителя SMS-сообщения. Вы не можете отправлять SMS без регистрации, хорошая новость заключается в том, что вы можете зарегистрировать его в вашей панели и получить одобрение в течение 24 часов. Я зарегистрировал одного, уже названного Octopii. Однако, если вам нужно протестировать, прежде чем ваш идентификатор отправителя будет утвержден, используйте функцию Песочница, доступную из вашей панели инструментов.
  2. После того, как мы сделали все это, мы готовы внедрить двухэтапную аутентификацию в любом месте нашего приложения.

Отправка одноразовых паролей

Начнем с настройки маршрутов. Я буду использовать только файл routes/index.js. измените этот файл, чтобы он выглядел так:

Здесь я определил 3 маршрута, на самом деле нам нужно только 2 (конечная точка регистрации, которая отправляет OTP, и конечная точка проверки), конечная точка баланса просто хороша, юноша, поэтому мы всегда можем проверить, сколько кредита у нас осталось в наш кошелек.

Как вы, должно быть, догадались, теперь, когда мы импортировали /controllers/otpController.js, нам нужно создать его в папке Controllers.

Здесь мы хотим обработать только имя и номер телефона нового пользователя, в реальном приложении у вас, вероятно, будет гораздо больше полей, но это кратко, потому что они это единственные поля, которые нам нужны для того, чего мы пытаемся достичь. Затем мы вызываем метод sendOtp в otpService, мы создадим его прямо сейчас.

Создайте файл с названием otpService.js в папке services и поместите его в:

Здесь происходит несколько вещей: во-первых, мы вызываем и инициализируем SDK termii-nodejs, используя наши sender_id и api_key в нашем файле env. убедитесь, что вы предоставили правильные данные, иначе ваши запросы будут возвращены как «неавторизованные».

API-интерфейс Termii Token имеет ряд обязательных параметров для отправки OTP, таких как тип вывода, который может быть числовым или буквенно-цифровым, длина вывода, время вывода (в моем примере я установил его на 5 минут) и т. д.; полный их список вы можете увидеть здесь. Однако SDK может установить значения по умолчанию для нас, и нам нужно только установить заполнитель булавки и фактическое сообщение, а затем вызвать метод SDK sendToken.

Если мы запустим npm start и вызовем localhost:3000/send-otp с соответствующей полезной нагрузкой, мы должны получить что-то похожее на этот:

Это HTTP-статус 200 OK, который означает, что наш OTP только что был отправлен! обязательно запишите pinId в ответе, он нужен вам для проверки этого OTP, в идеале, вы должны сохранить его в базе данных и получить его, когда вам нужно, но я передам его в запросе Я делаю к конечной точке проверки.

Теперь вы должны получить SMS на свой телефон. Если вы этого не сделаете, есть вероятность, что функция «Не беспокоить» активирована на вашем номере телефона, и этот идентификатор отправителя доставляется только на номера без режима «Не беспокоить». OTP обычно следует отправлять только на идентификаторы отправителя с поддержкой DND, поскольку они очень важны, однако маршруты DND немного дороже. Чтобы активировать это на вашем идентификаторе отправителя, обратитесь к команде по работе с клиентами в Termii, они очень отзывчивы.

Проверка одноразовых паролей

При прочих равных мы почти у цели. Добавим в файл otpController.js следующее:

Давайте также снова изменим файл otpService.js и добавим:

Если мы вызовем http://localhost:3000/verify-otp, то у нас должна быть полностью реализована работающая двухэтапная аутентификация.

Вот и все, мы успешно реализовали двухэтапную аутентификацию в нашем веб-приложении.

Чтобы увидеть полный рабочий код, вы можете проверить репозиторий проекта на Github.

Куда пойти отсюда

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

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