如何生成token(JWT的Token)

摘要:
此字符串称为JWT Payload。EyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXHhbXBsZS5jb20iLCJzdWIiJqcm9ja2V0QGV4YW1wbGUY29tWiZnJvbV91c2VyyjoiQiIsInRhcmdldF91c2VyjoiQSJ9注意:除非对敏感信息进行了加密,否则不要将其放置在JWT的有效载荷或标头中。详见下图:可以学习的相关博客1.JavaToken的原理、生成和使用机制2.使用JWT的令牌认证3.基于JWT(I)的令牌登录认证

主要代码

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编码后的字符串都用.依次连接起来后用一个密钥,就形成了签名。

具体如下图所示:

如何生成token(JWT的Token)第1张

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

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

2.使用JWT实现Token认证

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

免责声明:文章转载自《如何生成token(JWT的Token)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇file_get_contents函数简单实用以及在PHP文件中调用其他网页,API我的全栈之路-Go语言基础之Go语言概述与开发环境搭建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

查看k8s中etcd数据

1.查看ETCD集群中运行的ETCD pod [root@master1 ~]# kubectl get pod -n kube-system | grep etcd etcd-master1 1/1 Running 0 61m etcd-master2...

快速打造 react 后台管理系统

前言 相信很多小伙伴都有可能碰到开发后台管理系统这样的需求,那么我们该如何快速的完成这个需求呢 本文将以 react 为切入点,记录打造一个基础管理系统模板的过程,以此加深对 react 技术栈以及项目实战的理解,希望对大家开发一个这样的项目有所帮助 如果文章中有出现纰漏、错误之处,还请看到的小伙伴多多指教,先行谢过 项目简介 react-admin 是由...

Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程

https://cloud.tencent.com/developer/article/1408530 ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展 tp5的项目根目录下执行composer命令安装think-swoole: composer require top...

Apple推送通知服务教程

Apple推送通知服务教程 生成APP ID和SSL证书 登录iOS Provisioning Portal页面 首先,我们将要新建一个App ID. 每一个推送APP都需要一个唯一的对应的App ID,推送的消息将被送达到这个ID对应的APP应用中(这里不能使用通配ID)。 在iOS Provisioning Portal页面左侧选择App IDs,然...

OAuth2.0协议专区-Springcloud集成springsecurity oauth2实现服务统一认证,应该时最简单的教程了~

1.配置认证服务器(1) 首先配置springsecurity,其实他底层是很多filter组成,顺序是请求先到他这里进行校验,然后在到oauth /** * @author: gaoyang * @Description: 身份认证拦截 */ @Order(1) @Configuration //注解权限拦截 @EnableGloba...

drf——接口幂等性,Restful接口的幂等性

一、什么是幂等性 幂等性是系统服务对外一种承诺,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。 post请求不是接口幂等性put操作是接口幂等性 二、什么情况下需要幂等 以SQL为例: SELECT col1 FROM tab1 WHER col2=2,无论执行多少次都不会改变...