常规操作之JWT

简介

由于HTTP协议是无状态的,这意味着如果我们想判定一个接口是否被认证后访问,就需要借助cookie或者session会话机制进行判定,但是由于现在的系统架构大部分都不止一台服务器,此时又要借助数据库或者全局缓存 做存储,这种方案显然受限太多。
那么我们可不可以让认证令牌的发布者自己去识别这个令牌是不是我曾经发布的令牌呢(JWT核心思想),这是JWT最大的优点也是最大的缺点,优点是简单快捷、不需要依赖任何第三方操作就能实现身份认证,缺点就是对于任何拥有用户发布令牌的请求都会认证通过。

JWT Token结构

JWT的token一般由三个部分构成:
JWT Token格式
Header(头部):Json串格式对象,其中包含了Token类型(typ)和加密所用的算法类型(alg)
Pavload(负载):其中包含应用自定义的需要负载的内容例如用户相关信息(身份,权限等等)
Signature(签名):其中是对前面两个部分的进行加密验证,分发token时通过只存在服务端的私钥加上头部信息中的加密的算法来加密生成签名,可以保证Token不会被篡改。

在使用Jwt颁发的Token时因为不用保留Session和Cookie信息所以大大减小的服务端存储压力但是在每次请求验证时增加了解密验证的步骤所以会加大请求时间。

加密工具类

依赖包

 <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.5.0</version>
</dependency>
public class TokenUtil {
    //Token的过期时间
    private static final long EXPIRE_TIME = 30 * 60 * 1000;
    //Token的私钥
    private static final String TOKEN_SECRET = "jytoken_secret";
    
    
    /**
     * 生成签名,30分钟过期
     * @param **userInfo**  用户信息 用户姓名
    * @param **other** 用户其他信息 用户id
    * @return
     */
    public static String sign(String userInfo, String other) {
        try {
            // 设置过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            //私钥和加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            // 设置头部信息
            Map<String, Object> header = new HashMap<>(2);
            header.put("Type", "Jwt");
            header.put("alg", "HS256");
            // 返回token字符串
            return JWT.create()
                    .withHeader(header)
                    .withClaim("userInfo", userInfo)
                    .withClaim("other", other)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 生成签名,30分钟过期
     * @param **userInfo**  用户信息 用户姓名
    * @param **other** 用户其他信息 用户id
    * @return
     */
    public static String sign(String userInfo, String other,long expire) {
        try {
            // 设置过期时间
            Date date = new Date(System.currentTimeMillis() + expire);
            //私钥和加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            // 设置头部信息
            Map<String, Object> header = new HashMap<>(2);
            header.put("Type", "Jwt");
            header.put("alg", "HS256");
            // 返回token字符串
            return JWT.create()
                    .withHeader(header)
                    .withClaim("userInfo", userInfo)
                    .withClaim("other", other)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    
    /**
     * 检验token是否正确
     * @param **token**
    * @return
     */
    public static boolean verify(String token){
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            verifier.verify(token);//未验证通过会抛出异常
            return true;
        } catch (Exception e){
            return false;
        }
    }
    
    /**
     * 从token中获取info信息
     * @param **token**
    * @return
     */
    public static String getUserName(String token,String info){
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim(info).asString();
        } catch (JWTDecodeException e){
            e.printStackTrace();
        }
        return null;
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值