Ранее мы узнали о хешировании паролей и о том, как это делается. В этом блоге мы узнаем о токенах авторизации 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.

Спасибо за чтение!