当前位置:网站首页>Jwt Learning and use
Jwt Learning and use
2022-06-12 04:32:00 【Programmeur Xiao Xu】
1. Qu'est - ce queJWT?
JSON Web Token (JWT)- Oui.⼀Normes ouvertes(RFC 7519),Il définit⼀Compact、⾃Inclus⽅Équation,⽤À
En tant queJSONObjet dans chaque⽅Transmission sécurisée de l'information entre.Cette information peut être vérifiée et fiable,Parce qu'il est signé numériquement.
1.1 Quand devrais - je⽤JWT?
Authorization (Autorisation) : C'est un⽤JWTLe plus souvent⻅Scénario.⼀Dan⽤⼾Connexion,Chaque demande ultérieure contiendra
JWT,Allow⽤⼾Accéder aux routes autorisées par ce jeton、Services et ressources.Une seule connexion est maintenant⼴L'Ambassadeur⽤DeJWTDe⼀C'est
Sexe,Parce que c'est très cher⼩,Et vous pouvez facilement faire⽤.Information Exchange (Échange d'informations) : Pour la sécurité⽅Transfert d'informations entre⽽⾔,JSON Web Tokens⽆
C'est possible.⼀Bien planté.⽅Équation.Parce queJWTPeut être signé,Par exemple,⽤Clé publique/Paire de clés privées,Vous pouvez être sûr d'envoyer⼈C'est eux
Celui dont il est question⼈.En plus,Parce que la signature est⽤Calcul de la tête et de la charge utile,Vous pouvez également vérifier que le contenu n'a pas été altéré.
1.2. Processus de certification

1.Vérification de l'arrière - plan⽤⼾Après le succès du nom et du mot de passe,Oui.⽤⼾DeidEt d'autres informationsJWT Payload (Charge), Séparez - le de la tête
Entrez.⾏Base64Signature après épissage du Code,Formation⼀- Oui.JWT(Token).ForméJWTC'est⼀ Les mêmes 11. zzz. xxxCaractères de
Chaîne.token head.payload.signature
2.L'arrière - planJWTLa chaîne est retournée à l'avant comme résultat de retour d'une connexion réussie. Le Front End peut enregistrer les résultats retournés dans
localStorageOusessionStorageAllez., Supprimer l'enregistrement avant à la sortie de la connexionJWTC'est tout..
3. À chaque demande, le Front EndJWTPose ça.⼊HTTP HeaderDansAuthorizationBits. (RésolutionXSSEtXSRFQuestions)
4. Vérification de l'arrière - plan pour la présence,S'il y a vérificationJWTEfficacité.
◦ Vérifier si la signature est correcte;
◦ VérifiezTokenExpire - t - il?;
◦ VérifiezTokenRéception⽅Oui Non⾃⼰(Facultatif)
5. La vérification passe par l'arrière - plan pour ⽤JWTInclus dans⽤⼾ L'information entre dans ⾏ Autres opérations logiques ,Renvoie le résultat correspondant.
1.3 JWTOù est l'avantage??
- Simplicité(Compact): Peut passerURL,POSTParamètre ou dansHTTP headerEnvoyer,Volume des données⼩,Transmission rapide
- ⾃Contient(Self-contained): La charge contient tout ⽤⼾Informations requises,Plusieurs requêtes dans la base de données ont été évitées
Parce queToken- Oui. ParJSON La forme cryptée est conservée dans le client ⼾Fin,Alors...JWT C'est inter - lingue ⾔De,En principeweb Toutes les formes
⽀Tiens.. - Il n'est pas nécessaire d'enregistrer les informations de session sur le serveur,Particulièrement adapté⽤ Sur les microservices distribués .
1.4 JWT Contient des informations spécifiques - header
L'en - tête se compose généralement de deux parties: Type de jeton(C'est - à - dire:JWT) Et ce qu'il a fait ⽤Algorithme de signature pour,Par exempleHMAC、SHA256OuRSA. C'est
Ça va faire⽤Base64 Composition du codageJWT Structure⼀Section.
Attention!:Base64- Oui.⼀ Codage des espèces,C'est - à - dire, Il peut être traduit à l'original ⼦Viens..Ce n'est pas⼀ Processus de cryptage .
{
"alg":"HS256",
"typ":"JWT"
}
- Payload
Le numéro du jeton ⼆ Une partie de la charge utile ,Contient une déclaration.La déclaration est l'entité concernée(En général.⽤⼾)Et autres données.Encore une fois
De,Ça va faire⽤Base64 Composition du codageJWTStructure⼆Section
{
"sub" : "HS256"
"name" : "yjiewei"
"admin" : "true"
}
- Signature
headerEtpayloadC'est le résultat.Base64Codé,Au milieu⽤.Séparation, La troisième partie est avant ⾯ Les deux parties se combinent pour signer
Nom, La clé est absolue ⾃⼰Garde ça., La valeur de signature fait de même Base64 Le Code est relié à JWTAprès⾯.( Signé et codé )
HMACSHA256 (base64Ur1Encode(header) + "." + base64Ur1Encode(payload) , secret);
2.IntégrationpomEffectuer des essais systématiques
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Citation⼊mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!--Citation⼊jwt-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>
<!--Citation⼊mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--Citation⼊druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2 TestsJWTProcessus de chiffrement
public class Jwt {
/** * AccèsJWTToken */
@Test
public void getToken() {
Map<String, Object> map = new HashMap<>();
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND, 2000)
/** * header Peut ne pas écrire par défaut * payload En général⽤Pour stocker⽤⼾Information * signature C'est les deux premières valeurs de signature combinées */
String token = JWT.create().withHeader(map) //header
.withClaim("userId", 21)//payload
.withClaim("username", "yjiewei")//payload
.withExpiresAt(instance.getTime())//Indique la date d'expiration du jeton
.sign(Algorithm.HMAC256("!RHO4$%*^fi$R")); //Signature,La clé⾃⼰N'oublie pas
System.out.println(token);
}
/** * Validation des jetons:Analyser les données en fonction des jetons et des signatures * Souvent⻅Anomalie: * SignatureVerificationException Signature non ⼀ Anomalies * TokenExpiredException Exception à l'expiration du jeton * AlgorithmMismatchException L'algorithme ne correspond pas à l'exception * InvalidClaimException ÉchecpayloadAnomalie */
@Test
public void tokenVerify() {
// tokenTransmission de la valeur⼊Vérification
String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjkyMDg0NjgsInVzZXJJZCI6MjEsIn
VzZXJuYW1lIjoieWppZXdlaSJ9.e4auZWkykZ2Hu8Q20toaks-4e62gerPlDEPHvhunCnQ";
/** * ⽤⼾Id:21 * ⽤⼾Nom:yjiewei * Date d'expiration:Tue Aug 17 21:54:28 CST 2021 */
JWTVerifier jwtVerifier =
JWT.require(Algorithm.HMAC256("!RHO4$%*^fi$R")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token); // Vérifier et obtenir le décodage
token
System.out.println("⽤⼾Id:" + decodedJWT.getClaim("userId").asInt());
System.out.println("⽤⼾Nom:" +
decodedJWT.getClaim("username").asString());
System.
- Encapsulation⼯Avec classe
Java C'est encapsuler l'abstraction encapsuler l'abstraction …Donc ça⾥ Aussi encapsulé ⼀- Oui.⼯Avec classe.
public class JWTUtil {
/** * La clé ⾃⼰Garde ça. */
private static String SECRET = "privatekey#^&^%!save";
/** * Passe⼊payloadAccès à l'informationtoken * @param map payload * @return token */
public static String getToken(Map<String, String> map) {
JWTCreator.Builder builder = JWT.create();
//payload
map.forEach(builder::withClaim);
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 3); //Par défaut3Jours expirés
builder.withExpiresAt(instance.getTime());//Indique la date d'expiration du jeton
return builder.sign(Algorithm.HMAC256(SECRET));
}
/** * Validationtoken */
public static DecodedJWT verify(String token) {
//S'il y a des exceptions à la validation,Des exceptions sont lancées ici
return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
}
/** * AccèstokenDanspayload */
public static Map<String, Claim> getPayloadFromToken(String token) {
return
JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token).getClaims();
}
}
- JWT IntégrationSpringBoot
Nous allons vérifier l'implémentation d'un seul signe pour chaque demande , Intercepter les paires de demandes par intercepteur JWTVérification.
4.1 Connectez - vous et obteneztoken
4.2 Ajoutertoken

4.3 Mettre le Code redondant dans l'intercepteur pour utilisation
// Intercepteur
@Slf4j
public class JWTInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
//Obtenir un jeton dans l'en - tête de la requête
String token = request.getHeader("token");
log.info("En courstokenPour:{}", token);
Map<String, Object> map = new HashMap<>();
try {
JWTUtil.verify(token);
return true;
} catch (SignatureVerificationException e) {
e.printStackTrace();
map.put("msg", " Signature non ⼀À");
} catch (TokenExpiredException e) {
e.printStackTrace();
map.put("msg", "Jeton expiré");
} catch (AlgorithmMismatchException e) {
e.printStackTrace();
map.put("msg", "L'algorithme ne correspond pas");
} catch (InvalidClaimException e) {
e.printStackTrace();
map.put("msg", "Échecpayload");
} catch (Exception e) {
e.printStackTrace();
map.put("msg", "token⽆Efficacité");
}
map.put("status", false);
//Répondre à la réception: Oui.mapPasser àjson
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().println(json);
return false;
}
}
// Spécifiez le chemin d'interception
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor())
.addPathPatterns("/user/test")
.excludePathPatterns("/user/login");
}
}
// Intercepter la demande et vérifier dans l'en - tête de la demande token
@PostMapping("/user/test")
public Map<String, Object> test(HttpServletRequest request) {
String token = request.getHeader("token");
DecodedJWT verify = JWTUtil.verify(token);
String id = verify.getClaim("id").asString(); // Avant moi⾯ La chaîne a été convertie lors de l'enregistrement
String name = verify.getClaim("name").asString();
log.info("⽤⼾id:{}", id);
log.info("⽤⼾Nom: {}", name);
//TODO:Logique d'entreprise
Map<String, Object> map = new HashMap<>();
map.put("status", true);
map.put("msg", "Demande acceptée");
return map;
}
边栏推荐
- 【FPGA+FFT】基于FPGA的FFT频率计设计与实现
- 千字巨著《编程后传》
- Successfully solved: warning: there was an error checking the latest version of pip
- [fpga+gps receiver] detailed design introduction of dual frequency GPS receiver based on FPGA
- PHP and JS remove all spaces
- 树莓派4B使用Intel Movidius NCS 2来进行推断加速
- Esp32c3 remote serial port
- [C language] encapsulation interface (addition, subtraction, multiplication and division)
- 【C语言】封装接口(加减乘除)
- leetcode 205. Isomorphic Strings
猜你喜欢

QT compiling security video monitoring system 43- picture playback

Emperor Wu of Wei knew that he could not correct it, so he stopped offering his words
![[C language] analysis of variable essence](/img/b4/13a5800f2c960ec590c9f7480b09d0.png)
[C language] analysis of variable essence

Tasks in C #

Illustrating the use of Apache skywalking UI

Function realization and application of trait

Find missing sequence numbers - SQL query to find missing sequence numbers

2022 fusion welding and thermal cutting recurrent training question bank and simulation examination

Detailed explanation of software testing process

MFC General dialog color dialog
随机推荐
C# Task. Waitall method
[fpga+gps receiver] detailed design introduction of dual frequency GPS receiver based on FPGA
分布式锁介绍
What is the difference between FOB, CIF and CFR?
【C语言】封装接口(加减乘除)
Smart panel WiFi linkage technology, esp32 wireless chip module, Internet of things WiFi communication application
疫情数据分析平台工作报告【4】跨域相关
Thousand word masterpiece "programming biography"
L1-065 "nonsense code" (5 points)
mysqld: Can‘t create directory ‘D: oftinstall\mysql57 (Errcode: 2 - No such file or directory)
The memory four area model of C language program
leetcode 263. Ugly number
Let me tell you the benefits of code refactoring
Introduction to distributed locks
Construction case of Expressway Precast Beam Yard (with scheme text)
How to use union all in LINQ- How to use union all in LINQ?
Work report of epidemic data analysis platform [42] codenet
疫情数据分析平台工作报告【2】接口API
後續版本是否會支持代碼塊搜索高亮顯示
Legendary biological car-t has been approved by FDA, becoming the first domestic cell therapy product to successfully go to sea