前言

在我们的后台开发中,为了保护我们的资源不被恶意访问,我们会使用各种权限认证方法来验证我们的权限请求者是否合法,由于http是无状态的,所以在诞生了很多方法,比如session,但是session是信任服务器模式,我们的服务端需要保存一份session,客户端的cookie也需要保存一份session,这就导致一些分布式的服务很难处理权限问题,那么token认证就这样诞生了,token认证在用户登录成功时候生成一个token,这个token生成的时候需要按照一定算法加密进行生成,然后token返回给客户端,客户端下次请求的时候带上这个token,这时候服务器再使用解密算法进行解密这个token,然后得到用户信息。所以加密算法是其中很重要的一环,如果泄密算法token就容易被伪造,所以我们还得在加密的时候加点料,加上一个私钥,这样就尽可能的减少token被破解的概率。下面的JWT就是这种实现方法。
JWT(JSON Web Token)是一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。具体什么是JWT大家可以上网自己搜一下,人家说的比我要好,如果英文比较好的可以直接上JWT的官网查看官方文档。

Maven引入JWT

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

编写Token实体类

这个实体类保存的是JWT里payload里的数据,按照自己业务实际情况编写,因为加密不一定可靠,所以这里不建议保存私密数据,比如密码

public class Token {
    private Integer id;
    private String openId;
    private String role;
    private Date lastLogin;
//get/set/toString方法就不写了,生成一下就好了
}

编写JWTUtil工具类

这里是写JWT的创建,获取token里的数据等方法,到时候在写拦截器的时候就可以调用这些工具类了。
下面直接放代码吧,一些重要的都写了注释

package com.focuxin.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.focuxin.model.Token;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TokenUtil {
    private static final long EXPIRE_TIME = 30*60*1000;//设置过期时间(这里单位是毫秒,所以30分钟换算成毫秒)
    private static final String TOKEN_SECRET = "jkn4tEdanfoERcfr";//私钥这里随便填
    public String getToken(Token token){
        //过期时间和加密算法设置
        Date date = new Date(System.currentTimeMillis()+EXPIRE_TIME);
        Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

        //头部信息
        Map<String,Object> header = new HashMap<>(2);
        header.put("typ","JWT");
        header.put("alg","HS256");
        return JWT.create()
                .withHeader(header)
                .withClaim("openId",token.getOpenId())
                .withClaim("role",token.getRole())
                .withClaim("lastLogin",token.getLastLogin())
                .withExpiresAt(date)
                .sign(algorithm);
    }
    public Token getTokenData(String token){
        DecodedJWT jwt = JWT.decode(token);
        Token tk = new Token();
        tk.setOpenId(jwt.getClaim("openId").asString());
        tk.setRole(jwt.getClaim("role").asString());
        tk.setLastLogin(jwt.getClaim("lastLogin").asDate());
        return tk;
    }
    public String creatToken(String openid,String role){
        //这里传入的是token对象,决定token的内容
        Token tk = new Token();
        Date date = new Date();
        tk.setOpenId(openid);
        tk.setRole(role);
        tk.setLastLogin(date);
        //交给上面实现类得到token
        return getToken(tk);
    }
    public String getTokenDataOpenId(String token){
        return JWT.decode(token).getClaim("openid").asString();
    }

}

测试工具类

编写一个测试类

package com.focuxin;

import com.focuxin.model.Token;
import com.focuxin.utils.TokenUtil;
import org.junit.Test;

public class TokenTest {
    @Test
    public void test(){
        TokenUtil tku = new TokenUtil();
        Token tk = new Token();
        String result = tku.creatToken("asfefefe","admin");
        System.out.println(result);
        tk=tku.getTokenData(result);
        System.out.println(tk.toString());
    }

}

运行结果
Snipaste_2020-02-23_22-49-52.png
参考文章来源:

一分钟简单了解 JSON Web Token
Maven下的JWT配置
JavaGuide

Last modification:May 27th, 2020 at 02:04 pm
如果觉得我的文章对你有用,请随意赞赏