JWT权限验证教程详解 代码实例

JWT介绍

JWT(JSON Web Token)是目前比较流行权限验证方案。其实它更像是一种规范。

平时基于session的验证方式

  • 用户登录
  • 服务器在当前会话(session)里面储存登录的信息比如用户名和id
  • 服务器向用户返回一个session_id,写入用户的cookie(下一次用用户再次请求的时候的验证)
  • 用户再次请求的时候带上cookie(session_id) ,服务器session_id查询之前储存的数据,得知用户身份.


但是session验证又2个问题

1.内存使用:session是使用的服务器的内存,如果人很多就需要很多内存

2.分布式:每个服务器都有session的话,服务器是分布式的,那么session的储存也需要一个分布式方案

为了解决这个问题,我们直接不保存session了就是一种解决方案(比如JWT)



JWT数据结构

image-20201201145616243

写成一行

header.payload.signature


1.头部Header

header用来描述JWT的信息(使用base64解码得到信息)例如

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

alg:algorithm 就是算法,表示签名的算法,HS256是一种对称加密(签名部分会讲对称加密)

typ: type类型,表示这个token令牌是jwt类型.



2.payload负载

payload用来存放实际传输的数据

例如下面是官方的7个保留的字段

(使用base64解码得到信息)

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

当然你也可以自定义

{
   username: "半亩方塘",
   userRole: "admin"
}


3.(重要)signature签名

这个是防止数据篡改的关键,我们使用一个秘钥(secret)

前面的 header 和 payload 使用base64解码几乎都是明文的,只有signature才是签名加密的关键.



signature签名如何获得

前2部分header和payload分别base64加密,再通过秘钥secret,进行HS256这种对称式加密的出来,



对称式加密的secrete就像一个钥匙,加密和解密都需要它,没有它就没有办法加密和解密,

所以服务端的secrete十分重要,如果有了secrete用户就可以自己仿制签名




JWT代码实例

这里是maven项目

<!--        jwt依赖-->
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>3.4.1</version>
</dependency>
public class TokenUtil {
    private static String secrete = "1234567890";

    /**
     * 传入用户角色进行验证
     * @param userRole 用户角色比如admin
     * @return 返回一个加密JWT token .
     */
    public static String getToken(String userRole){
        String token = JWT.create()//链式编程创建JWTCreator
            .withClaim("userRole", userRole)//存放 payload 数据
            .sign(Algorithm.HMAC256(secrete)); //使用secrete对称加密生成 signature
        return  token;
    }

    /**
     * 解析token获得里面的payload数据
     */
    public static Map<String,String> parseToken(String token){
        HashMap<String, String> map = new HashMap<>();
        //通过secret 和相同的对称加密算法反加密
        DecodedJWT jwt = JWT.require(Algorithm.HMAC256(secrete))
                .build().verify(token);
        //获得你储存的payload信息
        String userRole = jwt.getClaim("userRole").asString();
        map.put("userRole",userRole);
        return map;
    }

}

test

String token = getToken("admin");
System.out.println("token="+token);
Map<String, String> map = parseToken(token);
String userRole = map.get("userRole");
System.out.println("解析token获得数据userRole="+userRole);

result

token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyUm9sZSI6ImFkbWluIn0.dWOUbJfnKAgTKw8OpBg1ooy-yqKrOjMU5aibs9CKv0o
解析token获得数据userRole=admin

拓展:这个私钥secrete是固定的,为了加强安全,你甚至可以使用动态的secrete私钥,例如

动态私钥 = 静态私钥 + 用户的ip,

这样即使别人得到了用户的token,也会因为ip不一致而访问失败.

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JarvanStack

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

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

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

打赏作者

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

抵扣说明:

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

余额充值