• JWT生成token


    1.JWT简介

    JSON Web Token 简称JWT。
    一个JWT实际上就是一个字符串,它由三部分组成,头部载荷签名
    JWT生成的token是这样的

    2.Json Web Token(JWT)生成的Token好处:

    • 安全性比较高,加上密匙加密而且支持多种算法。
    • 携带的信息是自定义的,而且可以做到验证token是否过期。
    • 验证信息可以由前端保存,后端不需要为保存token消耗内存

    生成的token,是3段,用.连接。

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJxd2VydHkiLCJpZCI6IjAwNyIsImV4cCI6MTU1OTAzODE0MywiaWF0IjoxNTU5MDM1NzQzLCJhZ2UiOiIyMiIsInVzZXJuYW1lIjoi5rGk5aeGIn0.r4-H9Qmz4IP2OWk-waPjgXkc7j_rsMlyuQaUrtTrNHk

    3.Java代码

    package com.utils.jwt;
    
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.algorithms.Algorithm;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Test1 {
    
        public static final String API_SECRET = "123456";
        public static final String API_KEY = "qwerty";
    
        public static void main(String[] args) throws UnsupportedEncodingException {
            String token = createToken(null);
            System.out.println("下面是token");
            System.out.println(token);
    
        }
    
        /**
         * @description 创建token
         * @author Colo.Zhu
         * @time 2018/4/8  14:37
         */
        public static String createToken(Object object) throws UnsupportedEncodingException {
    
            /**
             * 头部信息
             * 用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
             * 下面的headMap用于存放头部信息
             * */
            Map<String, Object> headMap = new HashMap();  //头部信息
            headMap.put("alg", "HS256");
            headMap.put("typ", "JWT");
    
            Algorithm algorithm = Algorithm.HMAC256(API_SECRET);    //用公共密钥加密
    
            long currentTimeMillis = System.currentTimeMillis();
            Date issuedAtDate = new Date(currentTimeMillis);        //设置签发时间
            Date expiresAtDate = new Date(currentTimeMillis + 40 * 60 * 1000);  //设置过期时间,大于签发时间
    
            /**
             * 载荷
             * 其实就是自定义的数据,一般存储用户Id,过期时间等信息。
             * 也就是JWT的核心所在,因为这些数据就是使后端知道此token是哪个用户已经登录的凭证。
             * 而且这些数据是存在token里面的,由前端携带,所以后端几乎不需要保存任何数据。
             *
             */
    
            /**
             *
             * 签名 (sign)
             * 签名其实就是:
             * 1.头部和载荷各自base64加密后用.连接起来,然后就形成了xxx.xx的前两段token。
             * 2.最后一段token的形成是,前两段加入一个密匙用HS256算法或者其他算法加密形成。
             * 所以token3段的形成就是在签名处形成的。
             */
    
            //生成Token:
            // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJxd2VydHkiLCJpZCI6IjAwNyIsImV4cCI6MTU1OTAzODE0MywiaWF0IjoxNTU5MDM1NzQzLCJhZ2UiOiIyMiIsInVzZXJuYW1lIjoi5rGk5aeGIn0.r4-H9Qmz4IP2OWk-waPjgXkc7j_rsMlyuQaUrtTrNHk
           
            String token = JWT.create().withHeader(headMap)
                    .withIssuer(API_KEY)
                    .withClaim("name", "tom")
                    .withClaim("age", "22")
                    .withClaim("id", "007")
                    .withClaim("username", "汤姆")
                    .withIssuedAt(issuedAtDate)
                    .withExpiresAt(expiresAtDate)
                    .sign(algorithm);  //签名
    
            return token;
        }
    }

    4..pom.xml

      本例主要引入com.auth0.jwt

    <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
            <dependency>
                <groupId>com.auth0</groupId>
                <artifactId>java-jwt</artifactId>
                <version>3.8.0</version>
            </dependency>

    5.签名

     * 签名其实就是:
      * 1.头部载荷各自base64加密后用.连接起来,然后就形成了xxx.xx的前两段token。
      * 2.最后一段token的形成是,前两段加入一个密匙HS256算法或者其他算法加密形成。
      * 所以token3段的形成就是在签名处形成的。

     参考出处:https://www.jianshu.com/p/75208a68c3b9

  • 相关阅读:
    java类的继承
    Java数组运算
    Eclipse问题提示
    oracle的insert的时候&符号如何插入(转义)
    修改数据库用户名--CMD环境执行有效
    java环境变量设置
    当前时间时间戳以及10分钟后的时间戳
    复选框事件
    分享到
    多物体运动
  • 原文地址:https://www.cnblogs.com/coloz/p/10915202.html
Copyright © 2020-2023  润新知