如何生成token(JWT的Token)

主要代码

1         //JWT 默认过期时间,3600L,单位秒
2         Long expireSecond = 3600L;
3         //盐值 
4         String newSalt = 6665         String token = JwtUtil.generateToken(user.getUsername(), newSalt,     
6         Duration.ofSeconds(expireSecond));        

JwtUtil.generateToken方法

 1  /**
 2      * 生成JWT Token
 3      *
 4      * @param username       用户名
 5      * @param salt           盐值
 6      * @param expireDuration 过期时间和单位
 7      * @return token
 8      */
 9     public static String generateToken(String username, String salt, Duration expireDuration) {
10         try {
11             if (StringUtils.isBlank(username)) {
12                 log.error("username不能为空");
13                 return null;
14             }
15             log.debug("username:{}", username);
16 
17             // 如果盐值为空,则使用默认值:666666
18             if (StringUtils.isBlank(salt)) {
19                 salt = "666666;
20             }
21 
22             // 过期时间,单位:秒
23             Long expireSecond;
24             // 默认过期时间为1小时 3600L 单位秒
25             if (expireDuration == null) {
26                 expireSecond = "3600L";
27             } else {
28                 expireSecond = expireDuration.getSeconds();
29             }
30             Date expireDate = DateUtils.addSeconds(new Date(), expireSecond.intValue());
31 
32             // 生成token
33             Algorithm algorithm = Algorithm.HMAC256(salt);
34             String token = JWT.create()
35                     .withClaim(CommonConstant.JWT_USERNAME, username)
36                     // jwt唯一id
37                     .withJWTId(UUIDUtil.getUuid())
38                     // 签发人
39                     .withIssuer("")
40                     // 主题
41                     .withSubject("")
42                     // 签发的目标
43                     .withAudience("")
44                     // 签名时间
45                     .withIssuedAt(new Date())
46                     // token过期时间
47                     .withExpiresAt(expireDate)
48                     // 签名
49                     .sign(algorithm);
50             return token;
51         } catch (Exception e) {
52             log.error("generateToken exception", e);
53         }
54         return null;
55     }

一些概念

JSON Web Token(JWT),是目前最流行的跨域认证解决方案。

JWT的原理

服务器认证以后,生成一个JSON格式的对象返回给客户端。之后客户端与服务端通信的时候,都要发回这个JSON对象。服务器完全根据这个对象认证用户身份。

JWT的组成

JWT 由三部分组成,它们之间圆点(.)连接。这个三部分分别是:

Header

Payload

Signature

一个典型的JWT看起来是这个样子的: xxxxx.yyyyy.zzzzz

 

Header

header典型的由两部分组成:token的类型比如JWT、算法名称比如HMAC SHA256。

Payload

载荷,它包含声明(要求)。声明是关于实体和其他数据的声明。声明有三种类型:registered、public和private。

  • Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
  • Public claims : 可以随意定义。
  • Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。
{ "iss": "Online JWT Builder", 

  "iat": 1416797419, 

  "exp": 1448333419, 

  "aud": "www.example.com", 

  "sub": "jrocket@example.com", 

  "GivenName": "Johnny", 

  "Surname": "Rocket", 

  "Email": "jrocket@example.com", 

  "Role": [ "Manager", "Project Administrator" ] 

}

iss: 该JWT的签发者,是否使用是可选的

sub: 该JWT所面向的用户,是否使用是可选的

aud: 接收该JWT的一方,是否使用是可选的

exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的

iat(issued at): 在什么时候签发的(UNIX时间),是否使用是可选的

其他还有:nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟,是否使用是可选的

 

将上面的JSON对象进行[base64编码]可以得到下面的字符串。这个字符串我们将它称作JWT的Payload(载荷)。

eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9

注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

Signature

将上面Header、Payload编码后的字符串都用.依次连接起来后用一个密钥,就形成了签名。

具体如下图所示:

 

 

 

可学习的相关博客(学习更深的知识)

1.Java Token的原理和生成使用机制

2.使用JWT实现Token认证

3.基于JWT的Token登录认证(一)

 

posted on 2020-07-24 15:44  CHENSISI  阅读(8521)  评论(0编辑  收藏  举报