如何生成token(JWT的Token)

如何生成token(JWT的Token)

主要代码

1 //JWT 默认过期时间,3600L,单位秒

2 Long expireSecond = 3600L;

3 //盐值

4 String newSalt = 666;

5 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登录认证(一)

相关文章