Token验证
最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。
传统的Token验证
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
JWT+HA256验证
实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:
- header
- payload
- signature
中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
Header
header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256。
1
2
3
4
5
|
{ "typ" : "JWT" ,
"alg" : "HS256"
}<br><br> |
上面的内容要用 Base64 的形式编码一下,所以就变成这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
1
2
3
4
5
6
7
8
9
10
11
|
{ "iss": "ninghao.net",
"exp": "1438955445",
"name": "wanghao",
"admin": true
} |
使用 Base64 编码以后就变成了这个样子:
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
Signature
JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
header
payload
secret
1
2
|
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret' );
|
处理完成以后看起来像这样:
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。
相关推荐
本方案主要涉及Spring Boot、Apache Shiro、JSON Web Token (JWT)、Redis以及Mybatis等技术,它们共同构建了一个高效且灵活的身份验证和令牌刷新机制。下面我们将深入探讨这个方案的各个组件及其作用。 首先,...
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含分类、sku、运费模板、素材库、小程序直播、拼团、砍价、商户管理、 秒杀、...
一个简单的后端框架,实现步骤可以根据文章 ...2.springboot+JWT+redis实现token身份令牌验证(附代码)(超详细) https://blog.csdn.net/pengpm/article/details/124077041?spm=1001.2014.3001.5501
结合JWT(JSON Web Token)和Shiro,我们可以构建一个高效的身份验证和授权系统,同时利用Redis缓存来提高性能和用户体验。下面将详细介绍如何在Spring Boot中整合JWT、Shiro和Redis实现Token自动刷新。 JWT是一种...
本系统“SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统”就是针对这一需求而设计的,它结合了多种技术,提供了高效、安全且灵活的解决方案。 首先,SpringBoot是这个系统的核心,它...
1、基于springboot+shiro+jwt+vue+redis的后台管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...
基于当前流行技术组合的前后端分离商城系统:SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含商城、sku、运费模板、素材库、小程序直播、拼团、砍价、商户管理、 秒杀、优惠券...
本教程将详细解释如何整合Spring Boot与JWT(JSON Web Token)以及Redis来实现双Token校验,确保用户会话的安全性和效率。 首先,JWT是一种轻量级的身份验证机制,它允许服务器通过生成一个包含必要信息的令牌(如...
3. JWT:JWT是一种轻量级的身份验证机制,用于在不同域之间传递信息。在Spring Security中,JWT被用来替代传统的session存储用户认证信息。每次用户成功登录后,服务器会生成一个包含用户信息的JWT,然后发送给...
基于SpringBoot+JWT+Vue的权限管理系统源码,基于SpringBoot+JWT+Vue的权限管理系统基于SpringBoot+JWT+Vue的权限管理系统基于SpringBoot+JWT+Vue的权限管理系统基于SpringBoot+JWT+Vue的权限管理系统基于SpringBoot...
内容只为接口开发,配合前端和移动app调用使用,不包含html页面,基于springboot+oauth2.0+jwttoken鉴权(内有怎么使用redistoken和数据库token注释)+restful风格+阿里短信+阿里消息推送+车牌识别等。该项目为工作...
SpringBoot +Vue3 +Jwt+Editor+WebSocket+Echarts小型超市进销管理系统 SpringBoot +Vue3 +Jwt+Editor+WebSocket+Echarts小型超市进销管理系统 SpringBoot +Vue3 +Jwt+Editor+WebSocket+Echarts小型超市进销管理...
基于springboot+shiro+jwt+vue+redis的后台管理系统 基于springboot+shiro+jwt+vue+redis的后台管理系统 基于springboot+shiro+jwt+vue+redis的后台管理系统 基于springboot+shiro+jwt+vue+redis的后台管理系统 基于...
系统功能如下: ┌─销售管理 │ ├─销售报价 │ ├─销售订单 │ └─销售统计 ├─采购管理 │ ├─采购申请 │ ├─采购询价 │ ├─采购报价 │ ├─采购比价 │ ├─采购订单 │ ├─采购预付申请 ...
Springboot+Shiro+jwt+Redis+Mybatis 内部Token刷新方案故事管理员本项目为前机架分离的Web应用程序程序,采用的技术框架如下springboot v2.1.2.RELEASE希罗智威汤逊redismybatis-plus v3.1.2包含代码生成器文档...
本项目结合了Apache Shiro、JSON Web Token (JWT)、SpringBoot、MySQL数据库以及Redis缓存技术(通过Jedis客户端)来实现这一机制。下面我们将详细探讨这些组件在实现无状态鉴权中的作用。 **Apache Shiro** Apache...
JSON Web Token(JWT)是一种开放的标准(RFC 7519),定义了一种紧凑的、自包含的方式来安全地在各方之间传输信息作为JSON对象。这种信息可以被验证和信任,因为它是数字签名的。JWT在身份验证和授权场景中广泛应用...
在本项目中,我们主要关注的是SpringBoot 2.7版本与多个技术的深度整合,包括Spring Security、JWT(JSON Web Token)、Redis缓存以及MySQL数据库,并利用MyBatis作为持久层框架。以下是对这些技术及其整合应用的...
JWT(JSON Web Tokens)与RSA是一种常见的用于身份验证和授权的技术组合。JWT是轻量级的身份验证机制,而RSA是一种非对称加密算法,用于确保数据...这些代码可以帮助开发者理解如何在项目中集成JWT+RSA的身份验证系统。