Java實現token的生成與驗證-登陸功能

1、token與cookie相比較的優點
一、支持跨域訪問,將token置於請求頭中,而cookie是不支持跨域訪問的;java

二、無狀態化,服務端無需存儲token,只須要驗證token信息是否正確便可,而session須要在服務端存儲,通常是經過cookie中的sessionID在服務端查找對應的session;算法

三、無需綁定到一個特殊的身份驗證方案(傳統的用戶名密碼登錄),只須要生成的token是符合咱們預期設定的便可;小程序

四、更適用於移動端(Android,iOS,小程序等等),像這種原平生臺不支持cookie,好比說微信小程序,每一次請求都是一次會話,固然咱們能夠每次去手動爲他添加cookie,詳情請查看博主另外一篇博客;微信小程序

五、避免CSRF跨站僞造攻擊,仍是由於不依賴cookie;跨域

2、基於JWT的token認證明現
JWT:JSON Web Token,其實token就是一段字符串,由三部分組成:Header,Payload,Signature微信

一、引入依賴cookie

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

  

二、設置密鑰和生存時間session

//設置過時時間
    private static final long EXPIRE_DATE=30*60*100000;
    //token祕鑰
    private static final String TOKEN_SECRET = "ZCEQIUBFKSJBFJH2020BQWE";

  

三、實現簽名方法工具

public static String token (String username,String password){

        String token = "";
        try {
            //過時時間
            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
            //祕鑰及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //設置頭部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //攜帶username,password信息,生成簽名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("username",username)
                    .withClaim("password",password).withExpiresAt(date)
                    .sign(algorithm);
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }

  

四、驗證token測試

public static boolean verify(String token){
        /**
         * @desc   驗證token,經過返回true
         * @create 2019/1/18/018 9:39
         * @params [token]須要校驗的串
         **/
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return  false;
        }
    }

  

五、測試

1)、直接用生成的token去驗證,成功

public static void main(String[] args) {
       String username ="zhangsan";
        String password = "123";
        String token = token(username,password);
        System.out.println(token);
        boolean b = verify(token);
        System.out.println(b);
    }

  

3、完整的Token工具類代碼

package xxx.utils; //你的包

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @desc   使用token驗證用戶是否登陸
 * @author zm
 **/
public class TokenUtils {
    //設置過時時間
    private static final long EXPIRE_DATE=30*60*100000;
    //token祕鑰
    private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";

    public static String token (String username,String password){

        String token = "";
        try {
            //過時時間
            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
            //祕鑰及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //設置頭部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //攜帶username,password信息,生成簽名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("username",username)
                    .withClaim("password",password).withExpiresAt(date)
                    .sign(algorithm);
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }

    public static boolean verify(String token){
        /**
         * @desc   驗證token,經過返回true
         * @params [token]須要校驗的串
         **/
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return  false;
        }
    }
    public static void main(String[] args) {
       String username ="zhangsan";
        String password = "123";
        String token = token(username,password);
        System.out.println(token);
        boolean b = verify("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd22yZCI6IjEyMyIsImV4cCI6MTU3ODE5NzQxMywidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.IyTZT0tISQQZhGhsNuaqHGV8LD7idjUYjn3MGbulmJg");
        System.out.println(b);
    }
}
相關文章
相關標籤/搜索