JWT означает веб-токен json, это открытый стандарт, используемый для передачи информации между сторонами в виде объекта JSON. Он компактен, безопасен для URL-адресов и широко используется в веб-приложениях для аутентификации и обмена информацией.
JWT имеют цифровую подпись с использованием ключей и секретов. Мы проверяем JWT с помощью этих ключей и подписи для аутентификации пользователя. Большинство веб-систем используют JWT для авторизации пользователей для доступа к определенным ресурсам.
JWT состоит из трех основных компонентов: заголовка, полезных данных и подписи. Когда мы создаем токен, мы передаем заголовок и полезную нагрузку, а затем токен генерирует подпись.
Headre — заголовок JWT содержит метаданные о токене. Он включает три значения: alg, typ и kid. Alg указывает алгоритм, используемый для подписи токена, type указывает тип токена, а kid — необязательный параметр, используемый для идентификации ключа. Включать ли ребенка, зависит от вашего варианта использования.
{ "alg": "RS256", // allow [HS256,RS256,ES256] "typ": "JWT", // Specific Type Of token "kid": "12345" // Used to indicate which key was used to sign the JWT. This is particularly useful when multiple keys are in use }
Полезная нагрузка. В разделе «Полезная нагрузка» мы указываем некоторые пользовательские данные, в основном добавляем в полезную нагрузку специфичные для пользователя данные, такие как идентификатор пользователя и роль.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Подпись. Подпись генерируется путем кодирования заголовка и полезных данных с помощью секретного ключа (для HS256) или их подписи с помощью закрытого ключа (для RSA), а затем хеширования результата. Эта подпись используется для проверки токена.
Как мы уже говорили, JWT состоит из трех компонентов: заголовка, полезных данных и подписи. Мы предоставляем заголовок и полезную нагрузку, и на их основе генерируется подпись. Объединив все эти компоненты, мы создаем токен.
// Header Encoding Base64Url Encode({ "alg": "RS256", "typ": "JWT" }) → eyJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9 // Payload Encoding Base64Url Encode({ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }) → eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9 // Concatenate Encoded header and payload ConcatenatedHash = Base64Url Encode(Header) "." Base64Url Encode(Payload) //Create Signature Hash = SHA-256(ConcatenatedHash) Signature = RSA Sign(Hash with Private Key) or HS256 Sign(Hash with secrate) // Create Token Token = Base64UrlEncode(Header) "." Base64UrlEncode(Payload) "." Signature
Итак, процесс создания JWT выглядит следующим образом: мы кодируем полезную нагрузку и заголовки, затем генерируем на их основе подпись.
Ранее мы обсуждали, как создать JWT. Теперь давайте обсудим, как проверить JWT. Процесс проверки по сути является обратным созданию токена. Сначала мы расшифровываем токен с помощью секретного или открытого ключа. Затем мы объединяем заголовок и полезную нагрузку для создания подписи. Если сгенерированный хэш соответствует подписи, токен действителен; в противном случае оно недействительно.
// Token we recive in this formate Token = Base64UrlEncode(Header) "." Base64UrlEncode(Payload) "." Signature // Decrypt Signature TokenHash = RSA Decrypt(Hash with Public Key) or HS256 Sign(Hash with secrate) // Generate Hash From Encoded Header and Payload Hash = SHA-256(Base64UrlEncode(Header) "." Base64UrlEncode(Payload)) // Compare Hash if(TokenHash == Hash) "Valid" else "Not Valid"
JWT предоставляет все вышеперечисленные преимущества, что делает его популярным выбором для большинства механизмов аутентификации для авторизации пользователей. Кроме того, JWT можно использовать с различными методами аутентификации, такими как DPoP и другими.
Чтобы использовать JWT в коде, мы используем пакет npm jsonwebtoken. Существует два метода работы с JWT: простой метод с использованием секретного ключа и метод пары ключей (с использованием открытого и закрытого ключей).
import jwt from 'jsonwebtoken'; // Define the type for the payload interface Payload { userId: number; username: string; } // Secret key for signing the JWT const secretKey: string = 'your-very-secure-secret'; // Payload to be included in the JWT const payload: Payload = { userId: 123, username: 'exampleUser' }; // Sign the JWT const token: string = jwt.sign(payload, secretKey, { expiresIn: '1h' }); console.log('Generated Token:', token);
import jwt from 'jsonwebtoken'; // Secret key for signing the JWT const secretKey: string = 'your-very-secure-secret'; // Verify the JWT try { const decoded = jwt.verify(token, secretKey) as Payload; console.log('Decoded Payload:', decoded); } catch (err) { console.error('Token verification failed:', (err as Error).message); }
import * as jwt from 'jsonwebtoken'; import { readFileSync } from 'fs'; // Load your RSA private key const privateKey = readFileSync('private_key.pem', 'utf8'); // Define your payload const payload = { sub: '1234567890', name: 'John Doe', iat: Math.floor(Date.now() / 1000) // Issued at }; // Define JWT sign options const signOptions: jwt.SignOptions = { algorithm: 'RS256', expiresIn: '1h' // Token expiration time }; // Generate the JWT const token = jwt.sign(payload, privateKey, signOptions); console.log('Generated JWT:', token);
import * as jwt from 'jsonwebtoken'; import { readFileSync } from 'fs'; // Load your RSA public key const publicKey = readFileSync('public_key.pem', 'utf8'); // Define JWT verify options const verifyOptions: jwt.VerifyOptions = { algorithms: ['RS256'] // Specify the algorithm used }; try { // Verify the JWT const decoded = jwt.verify(token, publicKey, verifyOptions) as jwt.JwtPayload; console.log('Decoded Payload:', decoded); } catch (error) { console.error('Error verifying token:', error); }
Подводя итог, можно сказать, что веб-токены JSON (JWT) безопасно передают информацию между сторонами, используя компактный формат. Подписание и проверка RSA предполагают использование закрытого ключа для подписи и открытого ключа для проверки. Примеры TypeScript иллюстрируют создание JWT с закрытым ключом RSA и его проверку с помощью открытого ключа RSA, обеспечивая безопасную аутентификацию на основе токенов и целостность данных.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3