По-рано научихме за хеширането на пароли и как се прави. В този блог ще научим за токените за оторизация на JWT и защо се използват.

Какво е JWT?

Във всеки уебсайт има два вида маршрути: обществени маршрути и защитени маршрути. Публичен маршрут е този, който може да бъде достъпен от всеки, като началната страница, регистрацията или влизането. Тези маршрути не изискват никакъв вид удостоверяване. Защитените маршрути са тези маршрути, които изискват определено удостоверяване, като например преглед на имейлите във входящата ни кутия или промяна на снимката на профила. Изисква се да се потвърди самоличността на клиента, преди да има достъп до тези маршрути. Това се прави с помощта на JSON Web Token. С прости думи, JWT е като лична карта, която доказва кой сте и какви разрешения имате като потребител на приложението.

JSON Web Token (JWT) е метод за сигурно предаване на информация между страните. JWT е прост и компактен формат, който може да бъде изпратен чрез HTTP хедър или като параметър на заявка. Често се използва за удостоверяване и оторизация в уеб приложения. JWT се използва за механизми за удостоверяване без състояние за потребители и доставчици, което означава, че поддържането на сесия е от страна на клиента, вместо да се съхраняват сесии на сървъра.

JWT се състои от три части: заглавка,полезен товариподпис. Тези три части са разделени с точка. Тази информация присъства като JSON обекти, които са кодирани в BASE64URL. Заглавието се състои от две части: типа на токена, в нашия случай JWT, и използвания алгоритъм за подписване, като HMAC SHA256 или RSA. Това е пример:

{
    "typ":"JWT",
    "alg":"HS256"
 }

Полезният товар съдържа данни за потребителя като имейл, потребителско име и неговата роля като администратор/потребител. Заедно с това има подробности за това кога е създаден токенът и датата на изтичане в епоха. Ето един пример:

{
  "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(token, payload). Тази функция взема кодирания 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 .

Благодаря ви, че прочетохте!