Jwt配置

依賴

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

JwtService

package com.order.common.service;

import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class JwtService {

    @Value("${jwt.jwtKey}")
    private String jwtKey;

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

    public SecretKey generalKey() {
        String stringKey = jwtKey;//本地配置文件中加密的密文
        byte[] encodedKey = Base64.decodeBase64(stringKey);//本地的密碼解碼[B@152f6e2
        System.out.println(encodedKey);//[B@152f6e2
        System.out.println(Base64.encodeBase64URLSafeString(encodedKey));//7786df7fc3a34e26a61c034d5ec8245d
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");// 根據(jù)給定的字節(jié)數(shù)組使用AES加密算法構造一個密鑰,使用 encodedKey中的始于且包含 0 到前 leng 個字節(jié)這是當然是所有乌询。(后面的文章中馬上回推出講解Java加密和解密的一些算法)
        return key;
    }

    public Claims parseJWT(String jwt) throws Exception {
        SecretKey key = generalKey();  //簽名秘鑰榜贴,和生成的簽名的秘鑰一模一樣
        Claims claims = Jwts.parser()  //得到DefaultJwtParser
                .setSigningKey(key)         //設置簽名的秘鑰
                .parseClaimsJws(jwt).getBody();//設置需要解析的jwt
        return claims;
    }

    public static void main(String[] args) {
        try {
            JwtService jt = new JwtService();
            String ab = jt.createJWT("jwt", "{\"id\":\"first\",name:xiaohong,password:123}", 120000);
            System.out.println(ab);

            Claims c = jt.parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3QiLCJpYXQiOjE1NTY2MTY1OTksInN1YiI6IntcImlkXCI6XCJmaXJzdFwiLG5hbWU6eGlhb2hvbmcscGFzc3dvcmQ6MTIzfSIsImV4cCI6MTU1NjYxNjY1OX0.mQvMGhQPQYgnUZs3faDDoekKQbr9hs35mHBM0br9pTI");//注意:如果jwt已經(jīng)過期了,這里會拋出jwt過期異常妹田。
            System.out.println(c.getId());//jwt
            System.out.println(c.getIssuedAt());//Mon Feb 05 20:50:49 CST 2018
            System.out.println(c.getSubject());//{id:100,name:xiaohong}
            System.out.println(c.getIssuer());//null
            System.out.println(c.get("uid", String.class));//DSSFAWDWADAS...
        } catch (ExpiredJwtException e) {
            System.out.println("過期");
        } catch (SignatureException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唬党,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鬼佣,更是在濱河造成了極大的恐慌驶拱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶衷,死亡現(xiàn)場離奇詭異蓝纲,居然都是意外死亡,警方通過查閱死者的電腦和手機晌纫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門税迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锹漱,你說我怎么就攤上這事箭养。” “怎么了哥牍?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵毕泌,是天一觀的道長。 經(jīng)常有香客問我砂心,道長懈词,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任辩诞,我火速辦了婚禮坎弯,結果婚禮上,老公的妹妹穿的比我還像新娘译暂。我一直安慰自己抠忘,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布外永。 她就那樣靜靜地躺著崎脉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伯顶。 梳的紋絲不亂的頭發(fā)上囚灼,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天骆膝,我揣著相機與錄音,去河邊找鬼灶体。 笑死阅签,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蝎抽。 我是一名探鬼主播政钟,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼樟结!你這毒婦竟也來了养交?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓢宦,失蹤者是張志新(化名)和其女友劉穎碎连,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驮履,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡破花,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疲吸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座每。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摘悴,靈堂內(nèi)的尸體忽然破棺而出峭梳,到底是詐尸還是另有隱情,我是刑警寧澤蹂喻,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布葱椭,位于F島的核電站,受9級特大地震影響口四,放射性物質(zhì)發(fā)生泄漏孵运。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一蔓彩、第九天 我趴在偏房一處隱蔽的房頂上張望治笨。 院中可真熱鬧,春花似錦赤嚼、人聲如沸旷赖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽等孵。三九已至,卻和暖如春蹂空,著一層夾襖步出監(jiān)牢的瞬間俯萌,已是汗流浹背果录。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咐熙,地道東北人雕憔。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像糖声,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子分瘦,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容