分布式项目登录——JWT技术

1.JWT介绍

1.1什么是JWT

      JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

1.2JWT的组成

       一个JWT其实就是一个字符串,由三部分组成:头部(header)、载荷(payload)、签名(signature),以“.”拼接

1.2.1 header

      头部用于描述关于该JWT的最基本的信息,header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。

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

  头部指明了签名算法是hs256,用base64对这个json进行编码后就得到了JWT的第一部分

1.2.2 payload

  载荷是存放有效信息的地方,包含了声明(要求),声明有三种类型:

 (1)标准中注册的声明:(建议但是不强制使用)

    iss: jwt签发者
    sub: jwt所面向的用户
    aud: 接收jwt的一方
    exp: jwt的过期时间,这个过期时间必须要大于签发时间
    nbf: 定义在什么时间之前,该jwt都是不可用的.
    iat: jwt的签发时间
    jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

(2)公共声明

    公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

(3)私有声明

    私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

例如:{"sub":"1234567890","name":"John Doe","admin":true}

1.2.3signature

签名是一个字符串,是由" header(Base64编码后)+‘.’+payload(Base64编码后) " 拼接的字符串通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

2.java的JJWT实现JWT

   JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(ApacheLicense,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。

2.1JJWT的快速入门

2.1.1导入依赖

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>

2.1.2生成token

public class CreateJwt {
  public static void main(String[] args) {
    JwtBuilder builder =
        Jwts.builder() // 生成jwt,下面是载荷的内容
            .setId("111") // 当前登录用户的id
            .setSubject("皮卡丘") // 用户名
            .setIssuedAt(new Date()) // 签发时间
            .signWith(SignatureAlgorithm.HS256, "pikapika"); // 加密方式是hs256,盐是pikapika
    // 输出token
    System.out.println(builder.compact());
  }
}

执行完成后输出的结果如下:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTEiLCJzdWIiOiLnmq7ljaHkuJgiLCJpYXQiOjE1NDY0ODU4ODd9.v64lCobI

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值