JWT (JSON Web Token) - это объект, который обеспечивает безопасную передачу данных в шифрованном виде.
Токен разбит на 3 части:
HEADER - хранит в себе тип и алгоритм шифрования.
PAYLOAD - сами передаваемые данные на сервер.
SIGNATURE - подпись, по которой идёт проверка. Так же она хранит секрет, по которому будет происходить дешифровка данных на сервере.
089 Создание токена
Устанавливаем АПИ модуль по работе с токенами
Метод sign реализует само тело PAYLOAD
Конкретно добавление свойства iat позволяет нам избежать утечки токенов и каждый раз они будут создаваться новыми. Так же даже если наш токен утечёт, то злоумышленник сможет им пользоваться только определённый промежуток времени, который мы зададим самостоятельно. Так как у злоумышленника не будет refresh-token, то он не сможет его обновить, а мы на сервере сможем и по нему будем уже давать доступ пользователю.
Добавляем секрет в наше окружение
.env
И далее реализуем получение jwt. Через ConfigService получаем из окружение секрет. В signJWT() реализуем генерацию токена через метод входа sign()
user.controlle.ts
И такой ответ мы получаем от сервера
На сайте JWT можно посмотреть раскодированный токен, если вставить его и секрет
090 Middleware для проверки jwt
Сразу нужно отметить, что все действия по работе с JWT можно оптимизировать, используя библиотеку к Express - Passport
Нам далее пригодиться переписать реквест таким образом, чтобы он имел в себе так же и значение пользователя.
Интерфейсы имеют свойство объединяться в TS, поэтому декларируем пространство имён и дополняем в нём интерфейс запроса, чтобы в нём было свойство пользователя - таким образом мы обогащаем наш запрос
types > custom.d.ts
Тут уже реализуем интерфейс аутентификации пользователя
примечение: тут payload будет первое время возвращать ошибку на свойство email ровно до того момента, пока не сделаем spec в тестах, так как там будет указана почта
common > auth.middleware.ts
Далее нам нужно реализовать использование аутентификации через основной метод использования посредников
app.ts
Добавим в контроллер пользователя метод info, который будет возвращать данные о пользователе
users.controller.interface.ts
И теперь тут инициализируем middleware и создём метод получения информации о пользователе
users.controller.ts
Так же в нодмон нужно добавить флаг --files, который позволит подтянуть кастомные типы
nodemon.json
И теперь можно увидеть, что сервер возвращает данные о пользователе, передав в хедер запроса токен пользователя
091 Упражнение - Guard авторизации
Далее нам нужно реализовать guard, который будет ограничивать вход пользователей в приложение, если они не будут соответствовать определённым требованиям
common > auth.guard.ts
Далее для get запроса добавим гуарда
users.controller.ts
И мы получаем такой результат при запросе, так как мы не обходим гуарда
Уже тут нужно будет реализовать метод получения данных, отправляя запрос в репозиторий (нельзя нарушать слоёную архитектуру и отправлять запрос напрямую в базу)
user.service.interface.ts
user.service.ts
И теперь мы можем увидеть то, что мы прочитали непосредственно из базы - почту и id пользователя