JsonWEBtokens生成

由于现在前端框架越来越流行,前后端分离渐渐也成了大多数公司的选择,那么此时对于用户的身份认证就显得尤为重要,下面来介绍JWT(JsonWEBtokens)生成token,解密加密的过程,服务端生成token之后,客户端每次请求的时候讲token带入在header或者post参数中,服务端做校验

maven依赖

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


TokenUtils

public class TokenUtils {
    
    public static String getJWTString(String tel,Date expires,Key key){
        if (tel == null) {
        throw new NullPointerException("null username is illegal");
        }

        if (expires == null) {
        throw new NullPointerException("null expires is illegal");
        }
        if (key == null) {
        throw new NullPointerException("null key is illegal");
        }
        //用签名算法HS256和私钥key生成token
        SignatureAlgorithm signatureAlgorithm =SignatureAlgorithm.HS256;
        String jwtString = Jwts.builder()
        .setIssuer("Jersey-Security-Basic")//设置发行人
        .setSubject(tel)//设置抽象主题
        .setAudience("user")//设置角色
        .setExpiration(expires)//过期时间
        .setIssuedAt(new Date())//设置现在时间
        .setId("1")//版本1
        .signWith(signatureAlgorithm,key)
        .compact();
        return jwtString;
        }
     public static boolean isValid(String token, Key key) {
            try {
                Jwts.parser().setSigningKey(key).parseClaimsJws(token.trim());
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
      public static String getName(String jwsToken, Key key) {
            if (isValid(jwsToken, key)) {
                Jws<Claims> claimsJws = Jwts.parser().setSigningKey(key).parseClaimsJws(jwsToken);
                return claimsJws.getBody().getSubject();
            }
            return null;
        }
    public static void main(String[] args) {
          Key key=KeyUtil.getKey();
          Calendar c=Calendar.getInstance();
          c.add(c.DATE, 10);
          String token=getJWTString("李未央", c.getTime(), key);
          System.out.println("验签结果"+isValid(token, key));
          System.out.println("用户名"+getName(token, key));
    }

KeyUtils

public class KeyUtil {
    
    public static Key getKey() {
        File file=new File("E:\\key.txt");
        try {
        if(file.exists()){
            Key key =MacProvider.generateKey(SignatureAlgorithm.HS512);
            ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(file));
            oo.writeObject(key);
            oo.close();
            return key;
        }
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        ois.close();
        Key key= (Key) ois.readObject();
            return key;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally{
        }

    }
//    @Test
//    public  void test() throws Exception {
//        getKey();
//    }
}


运行TokenUtils可以看到结果,当客户端收到token时可以将一些参数放在本地,当token过期之后,可以通过一些参数(如subject)去服务器重新获取token,

 


 

猜你喜欢

转载自blog.csdn.net/qw463800202/article/details/53506757