分散式應用的登入檢驗解決方案 JWT講解( json web token)

hushuai1559發表於2020-12-13

什麼是JWT

JWT 是一個開放標準,它定義了一種用於簡潔,自包含的用於通訊雙方之間以 JSON 物件的形式安全傳遞資訊的方法。 可以使用 HMAC 演算法或者是 RSA 的公鑰金鑰對進行簽名
簡單來說: 就是通過一定規範來生成token,然後可以通過解密演算法逆向解密token,這樣就可以獲取使用者資訊

優點

生產的token可以包含基本資訊,比如id、使用者暱稱、頭像等資訊,避免再次查庫
儲存在客戶端,不佔用服務端的記憶體資源

缺點

token是經過base64編碼,所以可以解碼,因此token加密前的物件不應該包含敏感資訊,如使用者許可權,密碼等
如果沒有服務端儲存,則不能做登入失效處理,除非服務端改祕鑰

JWT格式組成

頭部、負載、簽名

header+payload+signature

頭部:主要是描述簽名演算法
負載:主要描述是加密物件的資訊,如使用者的id等,也可以加些規範裡面的東西,如iss簽發者,exp 過期時間,sub 面向的使用者
簽名:主要是把前面兩部分進行加密,防止別人拿到token進行base解密後篡改token

相關依賴

    <!-- JWT相關 -->
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.7.0</version>
    </dependency>

封裝生產token方法

 /**
     * 根據使用者資訊,生成令牌
     * @param user
     * @return
     */
         /**
     * 過期時間一週
     */
    static final long EXPIRE = 60000 * 60 *24 * 7;

    /**
     * 加密金鑰
     */
    private static final String SECRET;

    /**
     * 令牌字首
     */
    private static final String TOKEN_PREFIX ;

    /**
     * subject
     */
    private static final String SUBJECT;
    
    public static String geneJsonWebToken(User user){

        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("head_img",user.getHeadImg())
                .claim("id",user.getId())
                .claim("name",user.getName())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                .signWith(SignatureAlgorithm.HS256,SECRET).compact();

        token = TOKEN_PREFIX + token;


        return token;
    }

封裝校驗token方法

 public static Claims checkJWT(String token){

        try{

            final  Claims claims = Jwts.parser().setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody();

            return claims;

        }catch (Exception e){
            return null;
        }

    }

注意點

根據使用者資訊生成令牌
* 1.生成的token,是可以通過base64進行解密出明文資訊
* 2.base64進行解密出明文資訊,修改再編碼,則會解密失敗
* 3.無法作廢已頒佈的token,除非改金鑰

相關文章