目 录CONTENT

文章目录

jwt的基础应用

在水一方
2021-12-25 / 0 评论 / 0 点赞 / 688 阅读 / 2,874 字 / 正在检测是否收录...

之前在回顾和学习知识点的时候对于结构化思维没有去规范起来,接下来的学习要开始先写大纲再来按点进行学习,本文回顾学习jwt的相关知识

image.png

定义:

jwt(json web token):是一个开放标准(RFC 7519)

官网:https://jwt.io/introduction

securely transmitting information between parties as a JSON object, This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.

翻译的结果:

作为JSON对象在各方之间安全地传输信息,此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥

作用(能做什么)

  • 授权(最常见的用法):作为java web中的令牌验证,用户登录系统后每个请求都带着jwt,单点登录是当今广泛使用jwt的一项功能

  • 信息交换

jwt的结构

令牌的组成
1 标头(Header):包括令牌类型和签名算法
2 有效载荷(payload):存储需要保存的用户信息,建议不要放敏感信息(如密码)
3 签名(signature)
token String = Header.payload.signature

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

解析后:

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

payload:
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}


signature:
HMACSHA256(base64UrlEncode(标头)+“+base64UrlEncode(有效负载),您的-256位机密)机密base64编码

开发如何使用:

引入jar包

<dependency>
	<groupId>com。auth0</groupId>
	<artifactId>javajwt</artifactId>
	<version>3.10.3</version>
</dependency>

生成token:

 @Test
    public void test(){
        Map<String, Object> map = new HashMap<>();
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.SECOND,100);
        String token = JWT.create().withHeader(map).  // Header,可不写
                withClaim("userName", "test") // payload
                .withClaim("age", "30")
                .withExpiresAt(instance.getTime())  //令牌的过期时间
                .sign(Algorithm.HMAC256("KFCCCC"));   // 签名
        System.out.println(token);
    }

验签的测试:

 JWTVerifier verifier =JWT.require(Algorithm.HMAC256("KFCCCC")).build();
DecodedJWT decodedJWT =  verifier.verify(token); 
System.out.println(decodedJWT.getClaim("userName").asString());

//注意:取多个值的时候用.getClaims这个方法
System.out.println(decodedJWT.getClaims().get("userName").asString());      
System.out.println(decodedJWT.getClaims().get("age").asString()); //如果age存的是int类型这里就的用.asInt()

封装为工具类

public class JwtUtil {

    private static final String sign = "!qwtry";

    /**
     * 生成token
     * @param map
     * @return
     */
    public static String getToken(Map<String,String> map){
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.DATE,5); // 默认5天过期
        JWTCreator.Builder builder = JWT.create();
        // payload
        map.forEach((k,v) -> {
            builder.withClaim(k, v);
        });
        String token = builder.withExpiresAt(instance.getTime()).sign(Algorithm.HMAC256(sign));
        return token;

    }


    /**
     * 获取token
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(sign)).build().verify(token);
    }


    /**
     * 获取token信息
     */

    public static DecodedJWT getTokenInfo(String token){
        return JWT.require(Algorithm.HMAC256(sign)).build().verify(token);
    }

}

加密解密在线工具:https://www.toolnb.com/tools/base64.html

为什么用jwt(横向对比)

1 基于传统session的认证

jwt地址:https://www.bilibili.com/video/BV1i54y1m7cP?p=4

0

评论区