Перевод статьи подготовлен в преддверии старта курса «Разработчик Node.js».




Самый популярный метод входа в приложение – это предоставление логина и пароля, но пользователи могут найти в этом определенные недостатки. Несмотря на то, что существует множество менеджеров паролей, их использование требует времени. Не сильно много, но все же. Некоторые приложения продвигают сложную и тем самым разочаровывающую политику паролей, поэтому придумать новый пароль бывает совсем непросто. Беспарольная система может стать хорошей альтернативой обычной аутентификации по логину и паролю. Она используется в Slack и FramerX, и выглядит это, как отправка магической ссылки пользователю для включения такой аутентификации в приложении. Беспарольная система работает следующим образом:

  1. Пользователь посещает приложение, где есть форма для ввода адреса электронной почты;
  2. Пользователь вводит адрес электронной почты и нажимает кнопку подтверждения;
  3. Магическая ссылка для входа в систему отправляется на электронную почту пользователя;
  4. Пользователь нажимает на ссылку и его перенаправляют в приложение, где он уже вошел в систему.

После этого магическая ссылка более недействительна.

Ниже мы рассмотрим некоторые основные моменты реализации беспарольной авторизации на Node.js.

Создадим express — приложение

Для начала нам нужно создать простое express-приложение и добавить несколько конечных точек. Код ниже отвечает за настройку express-сервера с помощниками для парсинга входящих запросов, логином и добавлением cors. Нам нужно будет создать две директории, к которым мы позже добавим обработчики. Это будут /login и /account. Первый обработчик будет отвечать за отправку магических ссылок пользователям, а второй – за их аутентификацию.


server.ts

Настройка nodemailer


Мы будем использовать nodemailer для отправки электронных писем, но для начала его нужно настроить. Нам понадобится несколько составляющих: адрес электронной почты, пароль от электронной почты, хост SMTP-сервера и порт SMTP-сервера. Также нам понадобится шаблон письма, которое мы будем отправлять пользователям с магической ссылкой. Шаблон может быть просто строкой или HTML-страницей.



Генерация токенов


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


token.ts

Отправка электронного письма


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



Аутентификация пользователя


При входе пользователя в системы, нам нужно авторизовать его запросы к нашему серверу. Для этого нужно сделать следующее:

  1. Проверить, есть ли заголовок авторизации в запросе;
  2. Проверить, что заголовок авторизации – это bearer token;
  3. Попробовать декодировать этот токен;
  4. Проверить, что в токене есть все нужные поля. В нашем случае: email и expiration.
  5. Сравнить дату и время из expiration с текущими, чтобы проверить, что токен не истек.
  6. Наконец, проверить, что пользователь с электронной почтой, извлечённой из токена, существует.



Заключение


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

С другой стороны, даже если войти в систему может быть проще, чем с обычным логином/паролем, то вернуться в нее может быть сложнее. Каждый раз, когда пользователь будет входить в систему, ему нужно будет дождаться письма на электронную почту, проверить почтовый ящик и нажать на ссылку. Этот процесс также может оказаться неприятным, поэтому если в сессии короткие периоды timeout-а или ожидается, что пользователи будут часто входить в систему, то беспарольная авторизация может оказаться не лучшим выбором.



Узнать подробнее о курсе.