美文网首页
JWT(JSON Web令牌)

JWT(JSON Web令牌)

作者: Zn_go | 来源:发表于2019-08-02 16:22 被阅读0次

    jwt详情网址:
    https://jwt.io
    注:如果想深入了解可以进入该网站查看,以下内容将结合网上资源与个人理解整合

    一、什么是JWT

    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSAECDSA的公钥/私钥对进行签名

    二、JWT构成

    JWT有三部分构成,分别是头、有效载荷、签名:
    例如:xxxxxxxx.yyyyyyyyy.zzzzzzzzzzz

    头:包含令牌的类型与加密的签名算法
    常用算法有:


    摘自与jwt.io

    有效载荷:通俗一点讲就是token中需要携带的信息都将存于此部分,比如:用户id、权限标志等等信息。
    注:该部分信息任何人都可以读出来,所以添加的信息需要加密才会保证信息的安全性

    签名:用于验证消息在此过程中未被修改,在具有私钥的情况下,可以验证JWT的准确性

    该三部分在构建后会使用Base64Url进行编码,最后生成一个由两点分割成三段的字符串

    三、使用JWT工具

    构建一个Maven项目,在pom文件中导包

    <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.8.1</version>
    </dependency>
    
    

    生成token的代码

    /**
         *  zn 生成token
         * @return
         */
        public static String getToken(){
            // 使用HMAC256算法
            Algorithm algorithmHS = Algorithm.HMAC256(secret);
            // 存放信息的map
            Map<String, Object> headerClaims = new HashMap();
            // 将信息存入map
            headerClaims.put("answer", "654321");
            // 生成Token
            String token = JWT.create()
                    // 在头部添加信息
                    .withHeader(headerClaims)
                    // 在有效载荷中添加信息
                    .withClaim("answer","123456")
                    // 声明发行人
                    .withIssuer("zn")
                    // 添加发行主题
                    .withSubject("zntest")
                    // 签名接受者
                    .withAudience("yk")
                    // 添加生成时间
                    .withIssuedAt(new Date())
                    // 签名算法
                    .sign(algorithmHS);
    
            return token;
        }
    

    验证token

    /**
         * zn 验证token
         * @param Token
         * @return
         */
    
        public static boolean verifyToken(String token){
            // 使用HMAC256算法
            Algorithm algorithmHS = Algorithm.HMAC256(secret);
            // 生成可重用验证器实例
            JWTVerifier verifier = JWT.require(algorithmHS).withIssuer("zn").build();
            // 进行验证
            DecodedJWT jwt = verifier.verify(token);
            return true;
        }
    

    获取token的信息

     public static void decodeToken(String token){
            DecodedJWT jwt = JWT.decode(token);
            // 获取token使用的算法
            System.out.println(jwt.getAlgorithm());
            // 获取头部信息
            System.out.println(jwt.getHeaderClaim("answer").asString());
            // 获取有效载荷中的信息
            Map<String, Claim> claims = jwt.getClaims();
            System.out.println(claims.get("answer").asString());
            // 获取发行人姓名
            System.out.println(jwt.getIssuer());
            // 获取发行人主题
            System.out.println(jwt.getSubject());
            // 获取签名接受者
            System.out.println(jwt.getAudience());
            // 获取生成日期
            System.out.println(jwt.getIssuedAt());
        }
    

    相关文章

      网友评论

          本文标题:JWT(JSON Web令牌)

          本文链接:https://www.haomeiwen.com/subject/tnnkdctx.html