
Большинство технологических приложений, которые мы используем сегодня, включают двухэтапную аутентификацию для повышения безопасности и предотвращения несанкционированного доступа к личным данным. В этой статье я хочу показать вам, как реализовать двухэтапную аутентификацию в ваших веб-приложениях, используя ваш обычный метод аутентификации и OTP (одноразовые пароли).
Я буду использовать NodeJs и Express в небольшом приложении, которое мы создадим, но я не буду использовать базу данных; Кроме того, я не буду создавать интерфейс для этого, мы будем тестировать все из Postman (или вы можете использовать любой тестовый клиент API по вашему выбору), это позволит нам перейти прямо к делу и уменьшить избыточность.
Для OTP мы будем интегрироваться с Termii и Termii Token API, если быть точным. Это потому, что нам, очевидно, понадобится решение для обмена сообщениями для отправки и доставки SMS, а Termii просто идеален для своей простоты.
Предпосылки
Для того, чтобы успешно завершить это руководство, вам необходимо:
- базовое понимание NodeJs и Javascript (ES6).
- существующий проект Node.js. Скелет REST можно сгенерировать с помощью Экспресс-генератора.
- Node.js установлен на вашем компьютере
- Клиент Postman установлен на вашем компьютере.
Настройка — проект
- используйте express-generator для создания скелета приложения:
npx express-generator --no-view --git otp-app$ cd otp-app $ npm install
- Создайте папку Services и папку Controller в папке вашего проекта, это шаблон, с которым мне лично нравится работать, вы можете использовать любой другой, если хотите.
- создайте файл .env в каталоге вашего проекта и запустите на своем терминале следующее:
npm i dotenv
также откройте app.js и добавьте это как можно раньше:
- Мы установим NodeJS SDK для API Termii, это позволит нам сократить 10 строк кода до 1 при интеграции. Запустите следующее в своем терминале.
npm i termii-nodejs
С этим все готово, давайте перейдем к настройке и получению ключа API от Termii.
Настройка — Термии
- Посетите https://termii.com и зарегистрируйтесь. Как только это будет сделано, вы сможете найти свой ключ API на панели инструментов. Скопируйте и перенесите его в свой файл env. ваш env должен выглядеть так:


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