关于javascript:开发日记Token的使用和Token的构成

52次阅读

共计 1858 个字符,预计需要花费 5 分钟才能阅读完成。

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 进行保留。

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0