【开发日记】Token的使用及Token的构成

1、Token

Token英文直译过来是“令牌”的意思,什么是令牌,在古代你要通过城门需要的也是令牌,而在计算机系统中要通过的是计算机的大门。

古代的大门由士兵守卫,而计算机系统的大门也有“士兵”,如果你没有一个有效的令牌就无法通过,只能从哪来回哪去。

2、POM依赖

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

3、生成Token

public static String getAdminToken(Admin admin) {
    long time = System.currentTimeMillis() + (1000 * 60 * 60 * 24);
    Date date = new Date();
    date.setTime(time);
    return  JWT.create()
            .withAudience(admin.getId()) // 将用户ID存入token中
            .withExpiresAt(date)    // 设置过期时间
            .sign(Algorithm.HMAC256(admin.getId()));// 设置私钥为用户ID
}

如上方法会返回一个一段字符串:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJhdWQiOiIxIiwiZXhwIjoxNjUyMDAzMjM4fQ
.cEkaKlNiA7OMJAv5hZI9hmRksujg08l00BwzpwwfhpE

如上Token中含有两个英文点,这两个英文点可将字符串分为三段。

第一段-头部(Header)

我们通过使用Base64解码第一段后得到如下内容:

{
	"typ":"JWT",
    "alg":"HS256"
}

上面描述了我们使用了HS256算法对Token进行了签名。

第二段-负载(Payload)

我们通过使用Base64解码第二段后得到如下内容:

{
	"aud":"1",
    "exp":1652003238
}

这里的内容不是必须的,是之前我们在生成Token时设置的一些内容。

aud(audience)可以理解为读者,如果客户端有多个类型,那么我们在分发Token时就可以约定一个类型,以便在验证时进行区分。

exp(expiration time)是过期时间,也是我们在生成Token时做的约定。

第二段负载中的内容可以自定义,但是这段内容并没有被加密,所以不要将密码等敏感信息放在这里。

第三段-签名(Signature)

我们通过使用Base64解码第三段后得到如下内容:

pI*Sb$=ddt3

是一段乱码,需要使用第一段中加密方式并配合私钥才可以解码其中的内容。

4、验证Token

String token = request.getHeader("token");
String adminID = request.getHeader("adminID");
if (token == null ) {
    returnJson(response, "请求未授权");
    return false;
}
// 解码
DecodedJWT decode = JWT.decode(token);
// 验证密钥是否正确
Algorithm algorithm = Algorithm.HMAC256(adminID);
algorithm.verify(decode);
// 有效期是否超时
Date expiresAt = decode.getExpiresAt();
if(expiresAt.getTime()<System.currentTimeMillis()){
    returnJson(response, "Token未授权或已超时");
    return false;
}
return true;

验证Token是否正确建议在拦截器或过滤器中进行,这里返回true表示Token有效,false为无效,无效的Token会被拦截,不会继续向下执行,控制层不会处理该请求。

5、升级Token安全性

我们可以在上面看出,在验证Token时会判断Token是否失效,但是Token过期时间在Payload中是非加密状态,也就是可以被修改,所以我们可以在服务端设置一个验证机制。

我们可以使用Redis作为存储Token时效的容器,在验证Token是否有效时可以对Redis进行访问验证;如果不想添加Redis的依赖,可以本地封装一个有时效的Map集合对Token进行保存。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值