JwtToken介绍与使用 超详细保姆级教程 内附详细示例代码

一、什么是JWT认证

Json web token (JWT),根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

二、JWT认证的特点

优点:

1.体积小,因而传输速度快

2.传输方式多样,可以通过URL/POST参数/HTTP头部等方式传输

3.严格的结构化。它自身(在 payload 中)就包含了所有与用户相关的验证消息,如用户可访问路由、访问有效期等信息,服务器无需再去连接数据库验证信息的有效性,并且 payload 支持为你的应用而定制化。

4.支持跨域验证,可以应用于单点登录

缺点:

1.安全性
由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。

2.性能
jwt太长。由于是无状态使用JWT,所有的数据都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长,cookie的限制大小一般是4k,cookie很可能放不下,所以jwt一般放在local storage里面。并且用户在系统中的每一次http请求都会把jwt携带在Header里面,http请求的Header可能比Body还要大。而sessionId只是很短的一个字符串,因此使用jwt的http请求比使用session的开销大得多。

3.一次性
无状态是jwt的特点,但也导致了这个问题,jwt是一次性的。想修改里面的内容,就必须签发一个新的jwt。

三、JWT的组成

JWT由三部分组成:header(头部)、payload(载荷)、signature(签名)
JWT的格式为:header.payload.signature

加密后的样例展示:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6ImMyMGFkNGQ3NmZlOTc3NTlhYTI3YTBjOTliZmY2NzEwIiwiaWQiOjksImV4cCI6MTYzODM3Mjk5NSwiaWF0IjoxNjM3NzY4MTk1LCJ1c2VybmFtZSI6IjEyIn0.tslCAlrbk2m4YTiHhxW5exFe0JbwWaDSWG0xI8F4Vmg

接下来详细介绍三者的组成:
1.header(头部)
JWT头部一般包含两部分信息:
1)typ(类别)
2)alg(加密算法,常用的是HMAC256、SHA256)
示例:

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

之后将头部的内容进行base64加密(这种加密是能够对称解密的),加密之后就构成了第一部分:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。

2.payload(载荷)
JWT的载荷部分是存放有效信息的地方,对于安全性比较高的程序,一般建议不要存放敏感信息,一般包含三部分信息:
1)需要添加进去的有效信息
2)token的签发时间和过期时间
3)私有的声明
示例:

{
		"username": username,
		"password": password,
		"id": id,
		"iat": iatDate, // 签发时间
		"exp": expiresDate // 过期时间
		...
}

同样将上述json对象进行base64加密后可以得到第二部分token字符串:eyJwYXNzd29yZCI6ImMyMGFkNGQ3NmZlOTc3NTlhYTI3YTBjOTliZmY2NzEwIiwiaWQiOjksImV4cCI6MTYzODM3Mjk5NSwiaWF0IjoxNjM3NzY4MTk1LCJ1c2VybmFtZSI6IjEyIn0

3.signature(签名)
这一部分一般设置一个公用密钥进行加密,只能在服务端解密。

四、JWT代码展示

JwtToken工具类

package com.kkkoke.networkrepair.util.token;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.kkkoke.networkrepair.util.MD5Util;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtToken {
    /*
    * 公用密钥-保存在服务端,客户端是不知道密钥的,以防被攻击
    * */
    public static String SECRET = "kkkoke2021";

    // String username, String password
    public static String creatToken(String username, String password, Long id) throws Exception {
        // 签发时间
        Date iatDate = new Date();

        // 过期时间
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.DAY_OF_WEEK, 7);
        Date expiresDate = nowTime.getTime();

        Map<String, Object> map = new HashMap<>();
        map.put("alg", "HMAC256");
        map.put("typ", "JWT");
        String token = JWT.create()
                .withHeader(map) // header
                .withClaim("username", username) // payload
                .withClaim("password", password)
                .withClaim("id", id)
                .withExpiresAt(expiresDate) // 设置过期时间。过期时间要大于签发时间
                .withIssuedAt(iatDate) // 设置签发时间
                .sign(Algorithm.HMAC256(SECRET)); // 加密

        return token;
    }

    /*
    * 解密Token
    * */
    public static Map<String, Claim> verifyToken(String token) throws Exception {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        DecodedJWT jwt = null;
        try {
            jwt = verifier.verify(token);
        } catch (Exception e) {
            throw new RuntimeException("登录凭证已过去,请重新登录");
        }

        return jwt.getClaims();
    }
}

解析示例

Map<String, Claim> jwt = JwtToken.verifyToken(token);
String username = jwt.get("username").asString()// 提取解析出的username
String password = jwt.get("password").asString()// 提取解析出的password
// 提取其他解析出来的内容也是一样的,希望对大家有帮助
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是2021mysql-8..26安装详细教程保姆): 1. 下载MySQL安装包 首先,你需要从MySQL官网下载MySQL安装包。在下载页面中,选择适合你操作系统的版本,然后下载安装包。 2. 安装MySQL 下载完成后,双击安装包,按照提示进行安装。在安装过程中,你需要设置MySQL的root用户密码,这个密码非常重要,一定要记住。 3. 配置MySQL 安装完成后,你需要对MySQL进行配置。在安装目录下,找到my.ini文件,用文本编辑器打开。在文件中找到[mysqld],然后添加以下内容: [mysqld] basedir=安装目录 datadir=安装目录\data port=3306 character-set-server=utf8mb4 default_authentication_plugin=mysql_native_password 其中,安装目录是你安装MySQL的路径。这些配置项可以根据你的实际需求进行修改。 4. 启动MySQL 配置完成后,你需要启动MySQL。在命令行中输入以下命令: net start mysql 如果启动成功,你会看到类似于“MySQL服务已经启动”的提示。 5. 登录MySQL 启动成功后,你需要登录MySQL。在命令行中输入以下命令: mysql -u root -p 然后输入你设置的root用户密码,即可登录MySQL。 6. 创建数据库 登录成功后,你可以创建数据库。在命令行中输入以下命令: create database 数据库名; 其中,数据库名是你要创建的数据库的名称。 7. 创建用户 创建数据库后,你需要创建用户。在命令行中输入以下命令: create user '用户名'@'%' identified by '密码'; 其中,用户名是你要创建的用户的名称,密码是你要设置的用户密码。 8. 授权 创建用户后,你需要授权。在命令行中输入以下命令: grant all privileges on 数据库名.* to '用户名'@'%'; 其中,数据库名是你要授权的数据库的名称,用户名是你要授权的用户的名称。 9. 刷新权限 授权完成后,你需要刷新权限。在命令行中输入以下命令: flush privileges; 10. 完成 至此,你已经成功安装并配置了MySQL。你可以使用你创建的用户登录MySQL,并对你创建的数据库进行操作。 ### 回答2: MySQL是一款免费且开源的关系型数据库管理系统,它非常流行且广泛应用于各种网站和应用程序之中。而随着MySQL 8.0.26版本的发布,该版本的功能和安全性得到了极大的提升,成为了许多开发者和企业用户的首选,在这篇文章里,我们将会给你提供一个保姆的MySQL 8.0.26安装指南,帮助你顺利的安装和使用这个版本的MySQL。 前置条件: 在开始安装之前,你需要检查一下你的系统是否满足以下最低要求: 硬件要求: - 1GB RAM或更高 - 至少2GB的磁盘空间 - Dual Core 2.0 GHz CPU或更高 软件要求: - Ubuntu 20.04 - CentOS 8 - Debian 10 - 或者其他兼容的分发版 Step 1. 下载MySQL 8.0.26 首先,我们需要从Oracle官方网站中下载MySQL 8.0.26。你可以通过以下链接下载所需的安装包。 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26-linux-glibc2.17-x86_64.tar.xz 请注意,奔放路径可能会有所不同,因此请根据你的需要进行相应的调整。 Step 2. 解压MySQL 8.0.26 在下载完MySQL之后,我们需要进入到下载目录中,然后解压下载的tar.xz文件。你可以通过以下命令完成解压: tar xf mysql-8.0.26-linux-glibc2.17-x86_64.tar.xz 该命令将会把MySQL的文件解压到当前的工作目录中。 Step 3. 安装MySQL 8.0.26 在解压后,我们需要将MySQL的文件移动到一个适当的目录中,以便进行安装。此外,我们还需要创建MySQL的数据存储目录。 cp -R mysql-8.0.26-linux-glibc2.17-x86_64 /usr/local/mysql mkdir /usr/local/mysql/data 通过上述命令,我们将MySQL的文件复制到/usr/local/mysql目录下,并创建了一个名为data的目录,用于存储MySQL的数据文件。 Step 4. 设置MySQL环境变量 为了能更方便地使用MySQL,请将其可执行文件路径添加到环境变量中。我们可以通过以下命令完成操作: export PATH=$PATH:/usr/local/mysql/bin 可以将该命令添加到/etc/profile文件中,在启动时自动设置环境变量。 Step 5. 配置MySQL 在进行安装之前,我们需要配置MySQL以确保其正常运行。首先,我们需要创建MySQL的配置文件my.cnf。 cp support-files/mysql.server /etc/init.d/mysql chmod +x /etc/init.d/mysql cp support-files/my-default.cnf /etc/my.cnf 然后,我们需要编辑my.cnf文件以添加MySQL的配置。 vim /etc/my.cnf 在文件中添加以下内容: [mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock user=mysql symbolic-links=0 log-error=/var/log/mysql/error.log pid-file=/var/run/mysql/mysql.pid 完成后保存并关闭文件。 Step 6. 启动MySQL 现在我们可以启动MySQL了。 /etc/init.d/mysql start 提示:“Starting MySQL... SUCCESS! ”表示MySQL已经启动成功。 Step 7. 设置MySQL root账户密码 有了MySQL 8.0.26,我们需要设置root账户的密码以确保安全性。 mysql -u root -p MYSQL> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; 请将‘your_password’替换为你所设置的密码。 Step 8. 远程连接MySQL 如果你想要在远程计算机上连接MySQL,你需要将MySQL的配置文件my.cnf中的绑定地址由默认的localhost更改为0.0.0.0。 vim /etc/my.cnf 在文件末尾添加以下行: bind-address=0.0.0.0 完成后保存并关闭文件。 重启MySQL,以应用修改。 /etc/init.d/mysql restart 现在你应该能够使用远程计算机连接到已经安装的MySQL。如果想要限制远程访问,你可以通过mysql的GRANT命令实现。 这样就成功安装和配置了MySQL 8.0.26。MySQL8.0.26现在为你提供了强大的功能和保障,帮助你更加高效的管理和开发你的应用程序。 ### 回答3: MySQL是一种被广泛使用的开源数据库管理系统,它是适用于大型企业应用的一款数据库软件。MySQL安装有多种方式,可以通过二进制安装程序、系统包管理器、源码编译等方式进行安装。在这篇文章中,我们将详细介绍MySQL 8.0.26二进制安装程序的安装步骤,为初学者提供一个详细的安装教程。 一、下载MySQL安装程序与其它依赖项 在安装MySQL之前,我们需要先准备好安装所需的环境和依赖项。在官网下载MySQL安装程序和其它依赖项。在下载时需要注意MySQL版本号及对应的程序、系统版本与位数等。 二、安装MySQL依赖项 MySQL需要一些依赖项才能正常运行,需要在安装MySQL之前安装这些依赖项。这些依赖项包括libaio、numactl、libncurses5、libtinfo5等。可以通过包管理器在Linux系统中安装。 $ sudo apt-get install libaio1 libnuma1 解决依赖项后,我们就可以安装MySQL了。 三、解压MySQL安装文件 我们需要将下载的MySQL安装文件解压到目标安装目录下: $ sudo tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.gz -C /opt/ 其中,mysql-8.0.26-linux-glibc2.12-x86_64.tar.gz是我们下载的MySQL安装文件,/opt/是想要将MySQL安装到的目标目录。 四、设置MySQL目录权限 我们需要设置MySQL安装目录的权限,让MySQL可以访问和修改相关文件。 $ sudo chown -R mysql:mysql /opt/mysql-8.0.26-linux-glibc2.12-x86_64 其中,mysql:mysql表示设置目录的所有者为mysql,组为mysql。 五、初始化MySQL数据库 我们需要初始化MySQL数据库,确保数据库的安装正常运行。 $ sudo /opt/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql-8.0.26-linux-glibc2.12-x86_64 --datadir=/opt/mysql-8.0.26-linux-glibc2.12-x86_64/data 其中,--initialize-insecure表示使用不安全的方式初始化数据库,--user=mysql表示以mysql用户身份运行,--basedir和--datadir 分别表示MySQL程序的安装目录和数据存储目录。 初始化MySQL数据库后,需要更改MySQL的root用户密码: $ sudo /opt/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqladmin -u root password 'new-password' 其中,new-password表示更改后的root用户密码。 六、启动MySQL服务并设置自启动 我们需要启动MySQL服务并设置自启动。 $ sudo /opt/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld_safe --user=mysql & 启动MySQL服务后,我们需要设置MySQL自启动。我们可以编辑/etc/rc.local文件,在文件末尾添加一条命令(注意文件中末尾必须有exit 0): nohup /opt/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld_safe --user=mysql >/dev/null 2>&1 & 七、配置MySQL MySQL的默认配置并不是最优的,需要进行一些配置优化以提高数据库的性能。 在MySQL中有一个配置文件my.cnf,我们可以在其中修改MySQL的配置: $ sudo vi /etc/my.cnf 在文件末尾,添加如下配置: [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci 在这个配置中,我们将MySQL的默认字符集设置为utf8mb4,以支持更多的字符集和表情。同时还设置了MySQL的字符集、校对等参数。 八、连接MySQL 现在我们已经安装了MySQL,可以使用MySQL客户端来连接和管理MySQL。在连接MySQL之前,需要确保MySQL服务已启动。 $ sudo service mysql start 然后,我们可以使用以下命令连接MySQL: $ mysql -u root -p 在输入命令后,MySQL会提醒您输入密码。只需输入您已经设置的密码即可。 恭喜您,您已经成功地安装了MySQL 8.0.26。现在,您可以使用MySQL进行各种数据管理和分析任务,尽情发挥MySQL的强大功能和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值