jwt 兩種工具

網(wǎng)上jwt例子基本上使用這兩種工具(忘記參考的哪里了)

第一種

 <dependency>
         <groupId>com.auth0</groupId>
          <artifactId>java-jwt</artifactId>
          <version>3.4.0</version>
 </dependency>

代碼:

public class JavaJWTUtil {
    // 過期時(shí)間5分鐘
    private static final long EXPIRE_TIME = 5 * 60 * 1000;

    /**
     * 生成簽名,5min后過期
     *
     * @param username 用戶名
     * @param secret   用戶的密碼
     * @return 加密的token
     */
    public static String sign(String username, String secret) {
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        Algorithm algorithm = Algorithm.HMAC256(secret);
        // 附帶username信息
        return JWT.create()
                .withClaim("username", username)
                .withClaim("as", "a")
                .withExpiresAt(date)
                .sign(algorithm);
    }

    public static boolean verify(String token, String username, String secret) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("username", username)
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            System.out.println(token);
            System.out.println(jwt.getHeader());
            System.out.println(jwt.getPayload());
            System.out.println(jwt.getSignature());
            System.out.println(jwt.getToken());
            return true;
        } catch (Exception exception) {
            exception.printStackTrace();
            return false;
        }
    }
    public static void main(String[] args) {
        String zhangsan = JavaJWTUtil.sign("zhangsan", "123");
        JavaJWTUtil.verify(zhangsan, "zhangsan", "123");
    }
}

第二種

  <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

代碼


public class JJWTUtil {
    public static String createJWT(String id, String subject, long ttlMillis) throws Exception {
        //指定簽名的時(shí)候使用的簽名算法,也就是header那部分,jjwt已經(jīng)將這部分內(nèi)容封裝好了。
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //生成JWT的時(shí)間
        long nowMillis = System.currentTimeMillis();
        //創(chuàng)建payload的私有聲明(根據(jù)特定的業(yè)務(wù)需要添加,如果要拿這個(gè)做驗(yàn)證,一般是需要和jwt的接收方提前溝通好驗(yàn)證方式的)
        Date now = new Date(nowMillis);
        Map<String, Object> claims = new HashMap<>();
        claims.put("uid", "DSSFAWDWADAS...");
        claims.put("user_name", "admin");
        claims.put("nick_name", "DASDA121");
        //生成簽名的時(shí)候使用的秘鑰secret,這個(gè)方法本地封裝了的,一般可以從本地配置文件中讀取,切記這個(gè)秘鑰不能外露哦。
        // 它就是你服務(wù)端的私鑰,在任何場(chǎng)景都不應(yīng)該流露出去。一旦客戶端得知這個(gè)secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。
        SecretKey key = generalKey();
        //下面就是在為payload添加各種標(biāo)準(zhǔn)聲明和私有聲明了
        JwtBuilder builder = Jwts.builder() //這里其實(shí)就是new一個(gè)JwtBuilder,設(shè)置jwt的body
                .setClaims(claims)          //如果有私有聲明,一定要先設(shè)置這個(gè)自己創(chuàng)建的私有的聲明,這個(gè)是給builder的claim賦值,一旦寫在標(biāo)準(zhǔn)的聲明賦值之后,就是覆蓋了那些標(biāo)準(zhǔn)的聲明的
                .setId(id)                  //設(shè)置jti(JWT ID):是JWT的唯一標(biāo)識(shí),根據(jù)業(yè)務(wù)需要,這個(gè)可以設(shè)置為一個(gè)不重復(fù)的值,主要用來作為一次性token,從而回避重放攻擊。
                .setIssuedAt(now)           //iat: jwt的簽發(fā)時(shí)間
                .setSubject("hehehhe")        //sub(Subject):代表這個(gè)JWT的主體,即它的所有人,這個(gè)是一個(gè)json格式的字符串,可以存放什么userid,roldid之類的,作為什么用戶的唯一標(biāo)志。
                .signWith(signatureAlgorithm, key);//設(shè)置簽名使用的簽名算法和簽名使用的秘鑰
        if (ttlMillis >= 0) {
            long expMillis = nowMillis + ttlMillis;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);     //設(shè)置過期時(shí)間
        }
        return builder.compact();           //就開始?jí)嚎s為xxxxxxxxxxxxxx.xxxxxxxxxxxxxxx.xxxxxxxxxxxxx這樣的jwt
    }

    public static SecretKey generalKey() {
        String stringKey = "21341234243134";//本地配置文件中加密的密文7786df7fc3a34e26a61c034d5ec8245d
        byte[] encodedKey = Base64.decodeBase64(stringKey);//本地的密碼解碼[B@152f6e2
        // 根據(jù)給定的字節(jié)數(shù)組使用AES加密算法構(gòu)造一個(gè)密鑰,使用 encodedKey中的始于且包含 0 到前 leng 個(gè)字節(jié)這是當(dāng)然是所有
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    public static Claims parseJWT(String jwt) throws Exception {
        try {
            SecretKey key = generalKey();  //簽名秘鑰,和生成的簽名的秘鑰一模一樣
            Claims claims = Jwts.parser()  //得到DefaultJwtParser
                    .setSigningKey(key)         //設(shè)置簽名的秘鑰
                    .parseClaimsJws(jwt).getBody();//設(shè)置需要解析的jwt
            return claims;
        } catch (SignatureException | MalformedJwtException e) {
            throw e;
        } catch (ExpiredJwtException e) {
            // jwt 已經(jīng)過期,在設(shè)置jwt的時(shí)候如果設(shè)置了過期時(shí)間,這里會(huì)自動(dòng)判斷jwt是否已經(jīng)過期,如果過期則會(huì)拋出這個(gè)異常,我們可以抓住這個(gè)異常并作相關(guān)處理。
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        String jwt = JJWTUtil.createJWT("", "", new Date().getTime());
        System.out.println(jwt);
        System.out.println(JJWTUtil.parseJWT(jwt));
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容