| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> JWT 详解 -> 正文阅读 |
|
[Java知识库]JWT 详解 |
1、JWT是什么? JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 2、JWT和传统Session的优劣 2.1、什么时候使用JWT? Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。 Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。 2.2、JWT和Session的比较 1、无状态: 2、避免CSRF 攻击: 3、适合移动端应用 4、单点登录友好 3、JWT的结构 JWT的结构由三部分组成,分别是标头、有效负载、签名算法,中间使用 点 进行隔开。
4、JWT的工作流程 在身份验证中,当用户成功登录系统时,授权服务器将会把 JSON Web Token(JWT)返回给客户端,用户需要将此凭证信息存储在本地(cookie或浏览器缓存)。当用户发起新的请求时,需要在请求头中附带此凭证信息,当服务器接收到用户请求时,会先检查请求头中有无凭证,是否过期,是否有效。如果凭证有效,将放行请求;若凭证非法或者过期,服务器将回跳到认证中心,重新对用户身份进行验证,直至用户身份验证成功。 步骤如下:
5、获取Token和对token进行验证 在进行使用JWT的时候,我们首先还是引入依赖。
之后我们先进行生成token的测试。如下代码所示:我们首先使用JWT对象的create方法进行创建对象,之后我们分别将Header标头、payload有效负载、signature签名算法进行指定,而这里的密钥也由自己指定。
运行Test进行测试,我们可以看到token的结构,也就是
既然生成了token,那么同样的我们也可以对这个token进行解析出来,如下代码所示:进行解析token值的时候我们需要给定对应的加密算法和密钥以及token值,进行解密后获取的token值分别getHeader、getClaim就可以获取到标头和有效负载了。
注意:在这里的有效负载的值对于相对应的数据类型应使用对应的asString或者asInt等等。比如上面的id就是int类,而进行asString就得不到值,也就是null。 在前面的测试JWT的生成以及验证我们写了两个对应的test测试,而在项目当中我们进行使用这两个方法也是必不可少的,所以我们可以对上面两个方法进行封装一下,用来直接处理JWT的生成和验证。 第一个就是生成JWT的方法,首先我们生成JWT先获取对于参数,这里使用map进行传参,这里的参数我们要写入payload有效负载当中,返回回去,之后我们添加一个时间,用来作为token过期时间,而后我们创建一个JWT对象,将对应的有效负载、过期时间、加密算法进行写进去给到token。这里入参用的map,而进行写入直接forEach进行循环写入,这是Java8的语法,可以了解一下。
第二个方法就是验证token的方法。这个就比较简单了,直接将token值传进来,通过密钥进行判断,最后直接返回。
方法封装之后,我们使用一个Utils类进行保存和统一管理,新建一个JwtUtil类,后面当我们需要使用到token的生成和验证的时候,我们就可以直接进行调用这里面的静态方法即可。 7、登录验证案例 最后离不开的还是案例,这里用一个登录进行验证。首先还是整合mybatis,这里的整合mybatis也就不做详细的说明了,SpringBoot详情可以参考:SpringBoot 详解 并且我们添加一个用来获取所有信息的接口:其中mapper查询语句如下:
之后添加一个请求,用来模拟登录,这里入参给到name和password。之后查询数据库,返回值用userDB进行保存,将id和name写进有效负载当中,然后调用前面封装的方法,也就是jwtUtil.getToken方法,返回一个token值,最后将数据写进map当中进行返回。
接口有了,之后我们就直接发送请求看一下效果,首先是账号密码都正确的,可以看到是会有token值进行返回的。
而这里我们同样的发送一条post请求进去查看结果,首先是有效的token,我们可以获取到这个token当中的信息。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/18 18:19:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |