JWT跨域認證解決方案

互聯網服務離不開用戶認證,下面我們來講解一下Json web Token的使用方法

簡單介紹一下:

  1. 用戶向服務器發送用戶名和密碼。
  2. 服務器驗證通過後,在當前對話(session)裏面保存相關數據,比如用戶角色、登錄時間等等。
  3. 服務器向用戶返回一個 session_id,寫入用戶的 Cookie。
  4. 用戶隨後的每一次請求,都會通過 Cookie,將 session_id 傳回服務器。
  5. 服務器收到 session_id,找到前期保存的數據,由此得知用戶的身份。

JWT 的原理:

JWT 的原理是,服務器認證以後,生成一個 JSON 對象,發回給用戶,就像下面這樣。


{
  "姓名": "張三",
  "角色": "管理員",
  "到期時間": "2018年7月1日0點0分"
}

以後,用戶與服務端通信的時候,都要發回這個 JSON 對象。服務器完全只靠這個對象認定用戶身份。

爲了防止用戶篡改數據,服務器在生成這個對象的時候,會加上簽名。

服務器就不保存任何 session 數據了,也就是說,服務器變成無狀態了,從而比較容易實現擴展。

關實現簽名:

加入JWT的mave相關依賴後,我們在來寫算法

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

下面代碼中就是JWT的工具類,裏面寫了一個生成方法及校驗方法,簡單易懂 

package net.xdclass.xdvideo.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import net.xdclass.xdvideo.domain.User;

import java.util.Date;

/**
 * jwt工具類
 */
public class JwtUtils {


    public static final String SUBJECT = "xdclass";

    public static final long EXPIRE = 1000*60*60*24*7;  //過期時間,毫秒,一週

    //祕鑰
    public static final  String APPSECRET = "xd666";

    /**
     * 生成jwt
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user){

        if(user == null || user.getId() == null || user.getName() == null
                || user.getHeadImg()==null){
            return null;
        }
        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("id",user.getId())
                .claim("name",user.getName())
                .claim("img",user.getHeadImg())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRE))
                .signWith(SignatureAlgorithm.HS256,APPSECRET).compact();

        return token;
    }


    /**
     * 校驗token
     * @param token
     * @return
     */
    public static Claims checkJWT(String token ){

        try{
            final Claims claims =  Jwts.parser().setSigningKey(APPSECRET).
                    parseClaimsJws(token).getBody();
            return  claims;

        }catch (Exception e){ }
        return null;

    }



}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章