JWT令牌技术(详解)

这篇具有很好参考价值的文章主要介绍了JWT令牌技术(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. JWT令牌技术

1. 简介:

  • 全称:JSON Web Token 官网:https://jwt.io/
  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

2. 组成:

  • 第一部分: Header(头),记录令牌类型、签名算法等。例如: {"alg":"HS256", "type":"JwT"}
  • 第二部分: Payload(有效载荷),携带一些自定义信息、默认信息等。例如: {"id":"1","username":"Tom"}
  • 第三部分: Signature(签名),防止Token被篡改、确保安全性。将headerpayload,并加入指定秘钥,通过指定签名算法计算而来。

生成JWT令牌时要对JSON格式的数据进行Base64编码:一种基于64个可打印字符(A-Z a-Z 0-9 + /)来表示二进制数据的编码方式。

//原始的JWT令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
//1.HEADER:ALGORITHM & TOKEN TYPE  (头)
{
  "alg": "HS256",
  "typ": "JWT"
}
//2.PAYLOAD:DATA  (有效载荷)
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
//3.VERIFY SIGNATURE  (数字签名)--通过前面的数据,执行签名算法
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),

) 

3. 应用场景

  • 场景:登录认证。
    • 登录成功后,生成令牌
    • 后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理

4. JWT-生成

  • 首先需要引入pom.xml依赖:
<!-- JWT令牌-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
  • 创建一个测试类
/**
 * 生成JWT令牌
 */
@Test
public void testGenJwt() {
    //利用Map集合来整合需要存储的数据
    Map<String, Object> claims = new HashMap<>();
    claims.put("id", 1);
    claims.put("name", "tom");
    //链式编程
    String jwt = Jwts.builder()
            .signWith(SignatureAlgorithm.HS256, "mannor")//签名算法  解析密钥
            .setClaims(claims)//自定义内容(载荷)
            .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
            .compact();
    System.out.println(jwt);
	//控制台输出:eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzQ4OTkxOH0.FmNSF7KDVZ9SaGoVJb6jNDq_oqlgSeUcFBskGNgy0UE
	
}
  • 把输出的JWT令牌发放到官网的Encoded下可以看见原始数据

5. JWT-解析

/**
 * 解析JwT
 */
@Test
public void testParseJwt() {
    Claims claims = Jwts.parser()
            .setSigningKey("mannor") //解析密钥
            .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzQ5MTIwN30.Tjzr4CKzwJcGtYwiRCo7d71z6WNugMMefu09hUp5H3o")
            .getBody();
    System.out.println(claims);
}
  • JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
  • 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。

2.JWT的登录校验实现(登录-生成令牌)

1. 步骤:

  • 引入JWT令牌操作工具类。
  • 登录完成后,调用工具类生成JWT令牌,并返回。

2. 编写一个Util工具类:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "mannor"; //登录令牌
    private static Long expire = 43200000L;  //十二个小时后过期

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

3. 重新编写Controller层代码:

import com.mannor.Service.EmpService;
import com.mannor.pojo.Emp;
import com.mannor.pojo.Result;
import com.mannor.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class LoginController {

    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp) {
        log.info("登录的查询参数:{},{}", emp.getUsername(), emp.getPassword());
        Emp e = empService.loginSelect(emp);

        //登陆成功生成令牌,下发令牌
        if (e != null) {
            Map<String, Object> claim = new HashMap<>(); //存如我们需要的信息,ID,name、username
            claim.put("id", e.getId());
            claim.put("name", e.getName());
            claim.put("username", e.getUsername());
            String jwt = JwtUtils.generateJwt(claim);//jwt中包含了员工当前的登录信息
            return Result.success(jwt);
        }
        //登录失败,返回错误信息
        return Result.error("用户名或密码错误,请检查重新输入");
    }
}

剩下的就需要拦截器来处理文章来源地址https://www.toymoban.com/news/detail-500611.html

到了这里,关于JWT令牌技术(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JWT(Json Web Token)简介

    一般的Token认证流程是这样的:         1. 用户输入用户名和密码,发送给服务器。          2. 服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。          3. 后续每次请求中,浏览器

    2023年04月08日
    浏览(36)
  • web学习--登录认证--会话技术--cookie--session--令牌--java-jwt使用--jjwt使用

    前置学习: http springmvc 会话:用户打开浏览器,访问web服务器资源,会话建立,直到有一方断开连接会话结束,一次会话可以多次请求和连接 会话跟踪:一种维护浏览器状态的方式,服务器需要识别多次请求是否来自同一浏览器,以便同一次会话多次请求间共享数据。 cooki

    2024年02月15日
    浏览(64)
  • 【Spring Security】认证&密码加密&Token令牌&CSRF的使用详解

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Security》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一

    2024年02月04日
    浏览(45)
  • jwt,accesstoken、refresh token详解

    JWT(json web token) 概念 JWT定义了一种紧凑的,自包含的形式,被用作在网络中安全的传输信息 格式 例如:xxxx.yyyyyyy.zzz 根据.分割,可以得到三部分,header,payload,signature。每部分可以使用Base64解码,就是一个JSON对象。 payload中会包含当前jwt的颁发者信息,JWT有效期,用户的凭证

    2024年02月16日
    浏览(56)
  • JWT(JSON Web Token )详解及实例

    目录 一、什么是 JWT ? 二、什么时候使用 JWT ? 三、JWT 格式 1、Header 2、Payload 3、Signature 4、 JWT实现: 官网 JSON Web Tokens - jwt.io RFC 7519文档 RFC 7519: JSON Web Token (JWT) JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全

    2024年02月06日
    浏览(45)
  • 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?

    通过第二章2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包,我们实现了基于SpringBoot项目的 API接口开发 ,并实现 API结果统一封装、支持跨域请求 等等功能,接下来开始第三章,主要做用户身份认证,主要实现一套 统一鉴权的用户身份认证的机制 。 我已经提

    2024年01月22日
    浏览(54)
  • 会话跟踪——JWT令牌

    会话指的是浏览器与服务器之间的一次连接,我们称之为一次会话。 在用户打开浏览器第一个访问服务器的时候,这个会话就建立了,只要有任何一方断开连接,此时会话就结束了。再一次会话中是可以包含多次请求和相应。 那什么是会话跟踪呢? 会话跟踪是一种维护浏览

    2023年04月09日
    浏览(36)
  • 【SpringBoot】JWT令牌

            📝个人主页: 五敷有你         🔥系列专栏: SpringBoot ⛺️稳重求进,晒太阳 JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于各方面之间安全的将信息作为JSON对象传输,在数据传输过程中 1.授权 这是使用JWT的最常见的方案,一旦用户登录,每个

    2024年02月20日
    浏览(39)
  • Websocket传递JWT令牌

    在访问带有[Authorize]的方法的时候,需要前端通过自定义报文头的形式将JWT令牌传递给后端进行验证,否则是不能访问带有[Authorize]的方法。 [Authorize]是用于限制对web应用程序中某些操作或控制器的访问。当[授权]属性应用于操作或控制器时,它表示用户必须经过身份验证和授

    2024年02月08日
    浏览(44)
  • springboot登录认证JWT令牌

    在判断该人员 访问的路径是否合法 ,是否存在未登录就访问其他路径,这时候我们就需要,进行登录认证。其中有两种方法,一种是加上 过滤器 ,一种是进行 JWT令牌 。 令牌就是一段字符串,其要求承载业务数据减少后续请求查询数据库的次数和方篡改,保证信息的合法性

    2024年01月25日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包