Ранее мы узнали о хешировании паролей и о том, как это делается. В этом блоге мы узнаем о токенах авторизации JWT и о том, почему они используются.
Что такое JWT?
На любом веб-сайте есть два вида маршрутов: общедоступные маршруты и защищенные маршруты. Публичный маршрут — это маршрут, к которому может получить доступ любой, например, домашняя страница, регистрация или вход в систему. Эти маршруты не требуют какой-либо аутентификации. Защищенные маршруты — это маршруты, для которых требуется определенная аутентификация, например просмотр электронных писем в нашем почтовом ящике или изменение изображения профиля. Необходимо проверить личность клиента, прежде чем он сможет получить доступ к этим маршрутам. Это делается с помощью веб-токена JSON. Проще говоря, JWT похож на удостоверение личности, которое подтверждает, кто вы и какие разрешения у вас есть как у пользователя приложения.
Веб-токен JSON (JWT) — это метод безопасной передачи информации между сторонами. JWT — это простой и компактный формат, который можно отправлять через HTTP-заголовок или в качестве параметра запроса. Он часто используется для аутентификации и авторизации в веб-приложениях. JWT используется для механизмов аутентификации без сохранения состояния для пользователей и провайдеров, это означает, что сеанс поддерживается на стороне клиента, а не хранится на сервере.
JWT состоит из трех частей: заголовка,полезной нагрузки и подписи. Эти три части разделены точкой. Эта информация представлена в виде объектов JSON, закодированных в BASE64URL. Заголовок состоит из двух частей: тип токена, в нашем случае JWT, и используемый алгоритм подписи, например HMAC SHA256 или RSA. Вот пример:
{ "typ":"JWT", "alg":"HS256" }
Полезная нагрузка содержит данные о пользователе, такие как адрес электронной почты, имя пользователя и его роль, например admin/user. Наряду с этим есть сведения о том, когда был создан токен, и срок его действия в эпохе. Вот пример:
{ "email": "[email protected]", "username": "[email protected]", "iat": 1674385288, "exp": 1674388888 }
После этого у нас есть подпись, подтверждающая подлинность токена. Вот пример:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), "your-256-bit-secret")
Наши токены JWT обычно выглядят примерно так:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIzNDU2Nzg5LCJuYW1lIjoiSm9zZXBoIn0.OpOSSw7e485LOP5PrzScxHb7SR6sAOMRckfFwi4rp7o
Чтобы получить заголовок, полезную нагрузку и подпись в декодированном виде, нам нужно перейти на www.jwt.io и вставить наш токен в данный декодер.
JWT в Node JS
Теперь, когда мы знаем, что такое токены JWT, мы узнаем, как использовать их в наших приложениях Node JS. Во-первых, нам нужно инициализировать npm и установить jsonwebtoken, который является библиотекой npm:
npm init -y npm i jsonwebtoken
Обратите внимание, что вам нужно установить свойство type: module в файле package.json, чтобы иметь возможность использовать синтаксис импорта ES6. Синтаксис jwt выглядит следующим образом: jwt.sign(payload, privatekey, expiryInformation). Вот пример:
import jwt from "jsonwebtoken"; let payload = { name: "Zoheb", username: "zoheballadin", email: "[email protected]" } let key = "zoheballadin"; const token = jwt.sign(payload, key, {expiresIn: "1h"}) console.log(token) //output :eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiWm9oZWIiLCJ1c2VybmFtZSI6InpvaGViYWxsYWRpbiIsImVtYWlsIjoiem9oZWJAZ21haWwuY29tIiwiaWF0IjoxNjc0Mzg3MzUyLCJleHAiOjE2NzQzOTA5NTJ9.RHHnQXq1zFQFutBRTDXFwhWUJp8NNg8x3-CWHtjrPmU
Приведенный выше код принимает полезную нагрузку и преобразует ее в токен jwt. Этот процесс обычно выполняется, когда пользователь входит в систему, а затем токен сохраняется в локальном хранилище на клиентском компьютере. Каждый раз, когда клиент получает доступ к защищенному маршруту, такому как удаление учетной записи, клиент отправляет jwt в заголовках http-запроса. Для проверки токена мы используем метод jwt.verify. Синтаксис: jwt.verify(токен, полезная нагрузка). Эта функция берет закодированный jwt, декодирует его и дает нам полезную нагрузку в форме JSON. Вот пример:
import jwt from "jsonwebtoken"; let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiWm9oZWIiLCJ1c2VybmFtZSI6InpvaGViYWxsYWRpbiIsImVtYWlsIjoiem9oZWJAZ21haWwuY29tIiwiaWF0IjoxNjc0Mzg3MzUyLCJleHAiOjE2NzQzOTA5NTJ9.RHHnQXq1zFQFutBRTDXFwhWUJp8NNg8x3-CWHtjrPmU"; let key = "zoheballadin" let payload = jwt.verify(token, key) console.log(payload)
Вывод:
{ name: 'Zoheb', username: 'zoheballadin', email: '[email protected]', iat: 1674387352, exp: 1674390952 }
Используя эту информацию, серверная часть может проверить личность пользователя. Чтобы узнать больше о библиотеке jsonwebtoken, ознакомьтесь с документацией по npm по адресу https://www.npmjs.com/package/jsonwebtoken.
Спасибо за чтение!