JWT使用教程

JWT使用教程_第1张图片

JWT是json web token的简写,意为json格式的token。(官网)

使用场景

常用于web项目的token校验,用户校验,权限校验等,也可以用于信息的加密传输。
由于http的无状态的,所以我们通常会使用session cookie来保存用户的状态,随着微服务的兴起,session cookie无法在分布式环境下达到保存用户状态的目的,所以我们需要寻找另外的途径来保存用户的状态

一、保存于数据库
我们可以将用户的uuid信息保存于数据库中,当用户登录的时候,我们通过校验用户登录信息的正确性来生成一个uuid,然后将这个uuid保存于数据库中,然后客户端与服务端就通过这个uuid来判断用户
二、使用JWT
使用统一的一个token生成策略,对用户的信息加密生成可加密的token,然后分布式环境下每个节点都使用同一种解密方式进行解密,就可以得到用户的信息

jwt是json结构,分为3段(head、Payload、Signature)

head

head的作用主要是表明Signature使用的加密算法和token的类型
常用写法{ “alg”: “HS256”, “typ”: “JWT”}

Payload

用于存放我们需要校验的信息,譬如(username:admin,password:admin)

Signature

Signature是签名,使用head的加密算法对payload的内容进行加密,目的是防止token的信息被篡改

jwt简单的使用教程

以java为例
首先引入jar,版本可以改,按具体的使用环境来定


			io.jsonwebtoken
			jjwt
			0.9.0
		
	private final static String SCRENT = "abc123";

    private final static long TOKEN_EXPIRATION = 12*3600*1000L;

    private static String userName = "test";

    private static String password = "test123456";
    
	/**
     * 生成token
     * @param username 用户名
     * @param password 密码
     * @param secret 密钥
     * @return token
     */
    private static String generateToken(String username,String password, String secret){
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        Date date = new Date(System.currentTimeMillis()+TOKEN_EXPIRATION);
        JwtBuilder jwtBuilder = Jwts.builder()
                .setHeaderParam("typ","JWT").setHeaderParam("alg","HS256")
                .claim("username",username)
                .claim("password",password)
                .signWith(signatureAlgorithm,secretKey)
                .setExpiration(date);
        return jwtBuilder.compact();
    }
    
    private static SecretKey generalKey(){
        byte[] encodeKey = Base64.getDecoder().decode(SCRENT);
        SecretKey key = new SecretKeySpec(encodeKey,0,encodeKey.length,"AES");
        return key;
    }

    /**
     * 解密token 返回payload的信息主体对象claims
     * @param jwtToken token
     * @return Claims
     */
    private static Claims validateJWT(String jwtToken){
        Claims claims = Jwts.parser()
                .setSigningKey(generalKey())
                .parseClaimsJws(jwtToken).getBody();
        return claims;
    }

    /**
     * 从token中获取key的值
     * @param jwtToken token
     * @param key key
     * @return value
     */
    public static Object get(String jwtToken,String key){
        Claims claims = validateJWT(jwtToken);
        String value = claims.get(key,String.class);
        return value;
    }

下面是代码运行的效果
JWT使用教程_第2张图片

你可能感兴趣的:(jwt,jwt使用教程,jwt使用,分布式校验,json,java)