Итак, в случае, если пользователь с данным именем найден, вы выбрасываем исключение и возвращаем ошибку. В противном случае, если пользователь с таким именем еще не создан, нам необходимо сделать следующее. Во-первых, вместо того, чтобы хранить пароль в обычном виде, нам необходимо его захешировать. Без хеширования, пароли, хранящиеся в базе приложения, могут быть украдены, например, если база данных была скомпрометирована. Применяя хеширующий алгоритм к паролям, перед сохранением их в своей базе данных, мы делаем невозможным разгадывание оригинального пароля для атакующего базу данных. Для того, чтобы захешировать пароль, мы всопользуемся зависимостью bycript. Мы создадим новую константу const hashedPassword = bycrypt.hashSync(password) "," и укажем количество раундов, к примеру, равным 7. Теперь, нам необходимо сгенерировать accessToken и refreshToken. Для этого, в папке utils, давайте создадим два файла - generateAccessToken.js и generateRefreshToken.js. В файле generateAccessToken, мы укажем import jwt from "jsonwebtoken"; И затем, чуть ниже, укажем анонимную функцию, которую мы экспортируем по умолчанию. И прежде чем реализовать функции для генерирования токенов, нам необходимо сгенерировать секретные ключи и сохранить их на сервере. С их помощью мы будем формировать подпись для токена. Таким образом наш итоговый токен будет представлять собой закодированную и подписанную строку. И далее, при каждом новом запросе к защищенным конечным точкам нашего приложения, мы сможем проверить такую подпись при помощи секретного ключа, чтобы убедиться в том, что токен не был изменен. Итак, здесь в файле generateSecret, функция generateSecret генерирует секретный ключ. Она создает случайную последовательность длиной 64 байта, после чего данная последовательность преобразуется в строку шестнадцатеричного формата. Далее, при вызове этого файла, в консоли мы увидим объект с двумя свойствами: accessSecret и refreshSecret, каждое из которых будет содержать сгенерированный ключ. Давайте перейдем в терминал, и пока что остановим выполнение серверного приложения. Мы укажем команду node utils/generateSecret.js и затем нажмем enter. И теперь, в консоли, мы можем видеть два созданных секретных ключа - для акссес и рефреш токена соответственно. Давайте откроем файл .env, в котором мы и сохраним данные два значения. Мы укажем здесь ACCESS_TOKEN_SECRT= и перенесем данное значение из консоли. Далее, то же самое мы сделаем и для рефреш токена. Все что нам остается сделать - это реализовать функции для генерации токенов, используя данные два значения. В файле generateAccessToken, импортирует модули jsonwebtoken и dotenv. Модуль dotenv используем для загрузки переменных окружения из файла .env. (.config) Затем экспортируем функцию по умолчанию, которая примет объект userData в качестве аргумента. Внутри функции вызовем метод sign из модуля jsonwebtoken, который создаст JWT на основе переданного объекта userData. Вторым аргументом нам необходимо передать значение переменной окружения ACCESS_TOKEN_SECRET, которое используется для подписи токена. Третьим аргументом передается объект с настройками, в данном случае устанавливается время жизни токена, которое мы пока что укажем равным 60 секундам. Таким образом, данная функция будет создавать и возвращать JWT, подписанный с использованием секретного ключа из переменной окружения ACCESS_TOKEN_SECRET.