JWT(JSON Web令牌)

2019-08-02  本文已影响0人  Zn_go

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());
    }
上一篇下一篇

猜你喜欢

热点阅读