使用JWT双令牌机制进行接口请求鉴权

在前后端分离的开发过程中,前端发起请求,调用后端接口,后端在接收请求时,首先需要对收到的请求鉴权,在这种情况先我们可以采用JWT机制来鉴权。

JWT有两种机制,单令牌机制和双令牌机制。

单令牌机制服务端只生成一个 token,一般过期时间比较长,因此安全性稍差。

双令牌机制服务端生成两个token,一个access_token用来鉴权,过期时间一般较短(5分钟,15分钟等),另一个 refresh_token,只用来获取新的 access_token,过期时间较长(可设置为24小时或者更长)

单令牌机制一般步骤:

1.前端发起登录请求

2.服务端验证用户名密码,验证通过则下发token返回给前端。

3.前端收到返回的token进行保存。

4.前端后续请求头将携带 token 供服务端验证。

5.服务端收到请求首先验证 token,验证通过则正常提供服务,不通过则返回相应提示信息。

6.token 过期后重新登录。

双令牌机制与单令牌机制不同的是服务端生成两个token,一个access_token用来鉴权,一个 refresh_token 用来刷新 access_token

双令牌机制一般步骤:

1.前端发起登录请求

2.服务端验证用户名密码,验证通过则下发access_token和refresh_token 返回给前端。

3.前端收到返回的两个 token进行保存。

4.前端后续请求头将携带 access_token供服务端验证。

5.服务端收到请求首先验证 token,验证通过则正常提供服务,不通过则返回相应提示信息。

6.access_token过期后,前端请求头 将 access_token替换为  refresh_token,调用刷新 access_token的接口。获取到新的  access_token并保存,重新发起请求。

1.pom.xml添加 java-jwt


  com.auth0
  java-jwt
  3.10.1

2.编写JwtUtil.java

import java.util.Calendar;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
public class JwtUtil {
	private final static String SIGNATURE = "sdf46fsdf"; //密钥
	private final static String ACCESS_TYPE = "access";
	private final static String REFRESH_TYPE = "refresh";
	private final static String SCOPE = "cms";
	private static int accessExpire = 15*60; //15分钟
    private static int refreshExpire = 60*60*24; //24小时
	/**
     * 生成  访问 token
     * @return 返回token
     */
    public static String getAccessToken( String identity){
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("type", ACCESS_TYPE);
        builder.withClaim("identity", identity);
        builder.withClaim("scope", SCOPE);
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, accessExpire);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
    }
    /**
     * 生成 刷新 token
     * @return 返回token
     */
    public static String getRefreshToken(String identity){
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("type", REFRESH_TYPE);
        builder.withClaim("identity", identity);
        builder.withClaim("scope", SCOPE);
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, refreshExpire);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
    }
    /**
     * 验证token
     * @param token
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
    /**
     * 获取token中payload
     * @param token
     * @return
     */
    public static DecodedJWT getToken(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
}

3.过滤器校验token

i

你可能感兴趣的:(使用JWT双令牌机制进行接口请求鉴权)