Личный профиль: восходящая звезда в области Java; блоггер по облачным технологиям Alibaba, звездный блоггер, блоггер-эксперт, который в настоящее время находится на пути к изучению Java, записывая процесс обучения ~ 个人主页:Блог .29. обучающееся сообщество:Зайди и посмотри~
JSON Web жетон(JWT)
:
JSON Web жетон (JWT) это открытый стандарт (RFC 7519),Он определяет компактный и автономный способ,используется для обработки информации как JSON Объекты безопасно передаются между сторонами . Эту информацию можно проверить и ей можно доверять, поскольку она имеет цифровую подпись. JWT Можно использовать ключ (с помощью HMAC алгоритм) или использовать RSA или ECDSA Подпишите пару открытого/закрытого ключей.
Сценарии использования JWT
:
Структура веб-токена JSON
:
JWT состоит из трёх частей,Они естьЗаголовок, полезная нагрузка, подпись ,символы между ними.
расколоть。
поэтому,Знаем ли мы,JWTОбычно это так:ddddd.hhhhh.jjjjj
{
"alg": "HS256",
"typ": "JWT"
}
Затем,Вот этотJSONданные пройдутBase64Urlкодирование,Первая часть (заголовок), составляющая JWT.
Вторая часть JWT — это полезная нагрузка, которая содержит утверждения — это утверждения о пользовательских объектах и других данных.
Есть три типаClaims:registered claims
、 public claims
、 private claims
。
Например
:
{
"sub": "123456789",
"name": ".29.",
"admin": true
}
Следующий,Вот этотJSONданные пройдутBase64Urlкодирование,Вторая часть (Полезная нагрузка), составляющая JWT.
Обратите внимание, что для подписанных жетонов эта информация, хотя и защищена, может быть прочитана кем угодно. Не размещайте конфиденциальную информацию в JWT полезной нагрузки или элемента заголовка, если он не зашифрован.
Чтобы создать раздел для подписей,Должен получить пропускBase64Urlкодированиезаголовок после、пройтиBase64Urlкодированиеполезная нагрузка после、ключ、указано в шапкеалгоритм,и подпишите его.
Например, если вы хотите использовать HMAC SHA256
Алгоритм создания подписи будет следующий:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT
верноHeader и Payload выполненныйBase64Urlкодирование,и подписан ключом,Три три строки Base64-URL,по пунктам.
отдельный。eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkiLCJuYW1lIjoiLjI5LiIsImFkbWluIjp0cnVlfQ.1M3o41CutZL1fTjEftuxs6g5ug5M-j6GcP_K61nAIjM
Импортировать координаты Maven
:
<!-- jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<!-- jaxb-impl -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<!-- jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
Тестирование базового использования
:
/**
* @author .29.
* @create 2024-03-15 23:37
*/
@SpringBootTest
public class jwtTest {
//Ключ подписи
String signature = "admin";
/**
* Метод тестирования для генерации зашифрованного JWT
*/
@Test
public void jwt(){
JwtBuilder builder = Jwts.builder(); //Получаем JWT-генератор
//Создаем JWT с помощью генератора JWT
String jwtToken = builder
//Header
.setHeaderParam("typ", "JWT")//Тип
.setHeaderParam("alg", "HS256") // Используемый алгоритм
//Payload
.claim("name", ".29.")
.claim("role", "admin")
.setSubject("admin-test")
.setExpiration(new Date(System.currentTimeMillis() + 1000*60*60*24))//Срок действия: текущее время + 24 часа
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256, подпись)//алгоритм+используемый ключ подписи
//Вызов метода Compact(), чтобы соединить три части вместе и разделить их с помощью '.'
.compact();
System.out.println("Сгенерированный JWT:" + jwtToken);
}
/**
* Тестовый метод расшифровки JWT для получения информации
*/
@Test
public void parse(){
//Ключ, зашифрованный методом jwt
String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiLjI5LiIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE3MTA2MDUyMjYsImp0aSI6IjFmNTkwNmNjLWQ4MWMtNGQ0MS1hYmJiLWY2M2NkZTg5OTM0ZSJ9.sgkpuvWTyzwDbwmUeKjQt2IuuL2zG0NKrQofdItbBAU";
JwtParser parser = Jwts.parser();//Получаем инструмент расшифровки JWT
Jws<Claims> claimsJws = parser.setSigningKey(signature).parseClaimsJws(jwtToken); //Расшифруем JWT на основе ключа подписи
Claims claims = claimsJws.getBody();
//Получаем расшифрованный контент полезной нагрузки
System.out.println("Имя пользователя:" + claims.get("name") + "\n"
+ "правило:" + claims.get("role") + "\n"
+ "тема:" + claims.getSubject() + "\n"
+ "ID:" + claims.getId() + "\n"
+ «Срок годности (действителен до):» + claims.getExpiration()
);
}
}
вывод jwt():
👇 Описание JWT:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiLjI5LiIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOj E3MTA2MDUzNzUsImp0aSI6IjYxYzUyNmQ1LTJkMDQtNGE1YS1hZWRmLTQwMDE5ZTc1ZmFmOSJ9.hhaciWFVfLJkDpNLlIHokShtNI1M_CTHUqKSIIUrfIw /вывод синтаксического анализа():
👇 Имя пользователя: .29. Правила: админ Тема:админ-тест ID:1f5906cc-d81c-4d41-abbb-f63cde89934e Срок годности (действителен до): Вс. Mar 17 00:07:06 CST 2024
ИнструментыJwtUtil.java
:
/**
* @author .29.
* @create 2024-03-16 0:29
* @description Сгенерировать JwtToken, Получите зашифрованную информацию в JwtToken, Определите, является ли JwtToken законным
*
*/
@Configuration
public class JwtUtil {
//Создаем ключ и алгоритм шифрования по умолчанию и передаем их вызову конструктора пустых параметров
private static final String defaultBase64EncodingSecretKey = "eb^29*be";
private static final SignatureAlgorithm defaultSignatureAlgorithm = SignatureAlgorithm.HS256;
//Пустой конструктор параметров, внутренний вызов параметризованного конструктора для передачи ключа по умолчанию и алгоритма шифрования
public JwtUtil(){
this(defaultBase64EncodingSecretKey, defaultSignatureAlgorithm);
}
private final String base64EncodingSecretKey;//Ключ
private final SignatureAlgorithm SignatureAlgorithm; // Алгоритм шифрования
//Конструктор с параметрами, создаем объект и передаем параметры для присвоения значений переменным-членам base64EncodingSecretKey и SignatureAlgorithm
public JwtUtil(String base64EncodingSecretKey, SignatureAlgorithm signatureAlgorithm){
this.base64EncodingSecretKey = Base64.encodeBase64String(base64EncodingSecretKey.getBytes());;
this.signatureAlgorithm = signatureAlgorithm;
}
/**
* Метод создания jwtToken состоит из трех частей: заголовка, полезной нагрузки и подписи.
* - Header:
* Тип текущей строки, обычно «JWT».
* Используемый алгоритм шифрования может быть «HS256» или другим алгоритмом.
* - Payload:
* Обычно существует четыре общих стандартных поля:
* jat: время выдачи, то есть время генерации jwt
* jti: уникальный идентификатор JWT
* iss: эмитент, обычно имя пользователя или идентификатор пользователя
* опыт: время истечения срока действия
* - Подпись: подпись
* @param issuer
* @param ttlMillis
* @param claims
* @return
*/
public String encoding(String issuer, long ttlMillis, Map<String, Object> claims){
// эмитент iss, время выживания ttlMillis, утверждения относятся к некоторой неконфиденциальной информации, которую вы также хотите сохранить в jwt
if(claims == null){
claims = new HashMap<>();
}
long nowMillis = System.currentTimeMillis();
JwtBuilder builder = Jwts.builder()
//Уникальный идентификатор JWT
.setId(UUID.randomUUID().toString())
//Эмитент, то есть для кого предназначен JWT
.setSubject(issuer)
//Загружаем часть
.setClaims(claims)
//Время выдачи
.setIssuedAt(new Date(nowMillis))
//Сгенерируем алгоритм шифрования и ключ, используемый jwt
.signWith(signatureAlgorithm, base64EncodingSecretKey);
//Если время выживания больше 0, время истечения равно текущему времени + время выживания
if(ttlMillis > 0){
long exp = nowMillis + ttlMillis; //Срок годности
Date date = new Date(exp); //Инкапсулирован как объект Date
builder.setExpiration(date); //Устанавливаем срок действия jwt
}
return builder.compact(); //Этот метод соединяет три части символом '.' для генерации jwt,
}
/**
* Метод расшифровки jwtToken и получения содержимого полезной нагрузки jwt.
* Claims — это карта, содержащая все пары «ключ-значение» в части полезных данных jwt.
* @param jwtToken
* @return
*/
public Claims decoding(String jwtToken){
JwtParser parser = Jwts.parser();
Jws<Claims> claimsJws = parser.setSigningKey(base64EncodingSecretKey).parseClaimsJws(jwtToken);
return claimsJws.getBody();
}
// Определите, является ли jwtToken законным
public boolean isVerify(String jwtToken) {
// Это официальное правило проверки. Здесь написан только один «Метод проверки». Вы можете добавить его самостоятельно.
Algorithm algorithm = null;
switch (signatureAlgorithm) {
case HS256:
algorithm = Algorithm.HMAC256(Base64.decodeBase64(base64EncodingSecretKey));
break;
default:
throw new RuntimeException("Этот алгоритм не поддерживается");
}
JWTVerifier verifier = JWT.require(algorithm).build();
verifier.verify(jwtToken);
// Если проверка не удалась, будет выдано исключение.
// Критерии оценки законности: 1. Головка и нагрузочные части не подвергались манипуляциям. 2. не истек
return true;
}
}