1.常见的认证机制

basic auth : 每次请求都会携带用户的username,password,易被黑客拦截。

Cookie auth : 我们请求服务器,创建一个session对象,客户端创建cookie对象。客户端每次访问,携带cookie对象。

(在当今,前后端分离中,通过前端服务器代理或反向代理,进行请求转发,从将cookie储存在客户端。)

oauth2 auth : 可以第三方登录,但是比较麻烦下去授权服务器获取授权码,再拿到token,再去访问资源服务。

token auth : 一般用户注册登录之后,生成token对象分别存储在数据库,以及客户端的localStore 或者 Cookie中。

2.JWT

jwt 全称 JSON Web Token ,简单来讲是一个拥有json格式的Token。

简单的理解:一种token的实现方式。

2.1 jwt组成

  • Header:有令牌的类型和所使用的签名算法,如HMAC、SHA256、RSA;使用Base64编码组成;(Base64是一种编码,不是一种加密过程,可以被翻译成原来的样子)
{"alg" : "HS256","type" : "JWT"
}
  • Payload :有效负载,包含声明;声明是有关实体(通常是用户)和其他数据的声明,不放用户敏感的信息,如密码。同样使用Base64编码
{"sub" : "123","name" : "John Do","admin" : true
}
  • Signature :前面两部分都使用Base64进行编码,前端可以解开知道里面的信息。Signature需要使用编码后的header和payload
  • 加上我们提供的一个密钥,使用header中指定的签名算法(HS256)进行签名。签名的作用是保证JWT没有被篡改过
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);

2.2 jwt的优点和验证流程

2.2.1 优点

1.jwt对比与传统json和session不需要在服务端存储

2.负载中包含了用户所需要的信息,避免多次查询数据库

2.2.2 验证流程

  • 前端通过Web表单将自己的用户名和密码发送到后端的接口。该过程一般是HTTP的POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
  • 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)。
  • 后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage(浏览器本地缓存)或sessionStorage(session缓存)上,退出登录时前端删除保存的JWT即可。
  • 前端在每次请求时将JWT放入HTTP的Header中的Authorization位。(解决XSS和XSRF问题)HEADER
  • 后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确﹔检查Token是否过期;检查Token的接收方是否是自己(可选),验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

2.3 jwt快速入门

我们这里采用的jjwt实现。并且基于springboot项目实现的。

2.3.1 导入依赖

 <!--JWT 依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

2.3.2 生成jwt

这将信息加密成jwt。

 JwtBuilder jwtBuilder = Jwts.builder()// 声明的标识{"jti":"8888"} 唯一的.setId("8888")// 主体,用户{"sub":"Rose"}.setSubject("Rose")// 创建日期  {"iat":"" }.setIssuedAt(new Date())// 用的什么编码.signWith(SignatureAlgorithm.HS256,"12345");// 拿到tokenString token = jwtBuilder.compact();System.out.println(token);System.out.println("---------------------");String[] split = token.split("\\.");System.out.println(Base64Codec.BASE64.decodeToString(split[0]));System.out.println(Base64Codec.BASE64.decodeToString(split[1]));// 无法解密System.out.println(Base64Codec.BASE64.decodeToString(split[2]));

2.3.3 解析jwt

这个token需要自己替换成你生成的token。

 String token = "eyJhbGciOiJIUzI1NiJ9." +"eyJqdGkiOiI4ODg4Iiwic3ViIjoiUm9zZSIsImlhdCI6MTY4NzIyODc0MX0." +"TiMu_sWRQxmlUtY-xh9G4G26UXYwGxID0kj6XC-iblI";// 解析token获取负载中声明的对象Claims claims = Jwts.parser()// 这里的签名秘钥.setSigningKey("12345").parseClaimsJws(token).getBody();System.out.println("id:"+claims.getId());System.out.println("subject:"+claims.getSubject());System.out.println("issuedAt:"+claims.getIssuedAt());

2.3.4 jwt过期校验

衔接上述生成和解析token代码。

我们在jwt代码中新加入,

  long now = new Date().getTime(); // ---新增long exp = now + 60 * 1000; // 设置60s后过期  // ---新增JwtBuilder jwtBuilder = Jwts.builder()// 声明的标识{"jti":"8888"} 唯一的.setId("8888")// 主体,用户{"sub":"Rose"}.setSubject("Rose")// 发行日期  {"iat":"" }.setIssuedAt(new Date())// 用的什么编码, secret 这是解密的秘钥(!).signWith(SignatureAlgorithm.HS256,"12345")// 设置token过期时间.setExpiration(new Date(exp)); // --- 新增

我们在解析token中,新加用来验证token过期时间,和生成时间。

PS:simpleDateFormat.format() 方法,内部没有校验null的逻辑,因此必须先生成jwt时,设置过期时间,否则为null,报异常。

  System.out.println("----------------------");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("jwt生成日期:"+simpleDateFormat.format(claims.getIssuedAt()));System.out.println("jwt过期日期:"+simpleDateFormat.format(claims.getExpiration()));System.out.println("当前日期:"+simpleDateFormat.format(new Date()));

2.3.4 自定义声明

我们可以在jwt中自定义claims,(这些信息会存入负载中)

衔接,上文。

        JwtBuilder jwtBuilder = Jwts.builder()// 声明的标识{"jti":"8888"} 唯一的.setId("8888")// 主体,用户{"sub":"Rose"}.setSubject("Rose")// 发行日期  {"iat":"" }.setIssuedAt(new Date())// 用的什么编码去签名,12345 明文秘钥(secret).signWith(SignatureAlgorithm.HS256,"12345")// 设置token过期时间.claim("role","admin");  // --- 新增// 直接传入map对象//.addClaims(new HashMap<>())

同样,我们也可以在解析token中获得到他。

        System.out.println(claims.get("role"));

JWT --- 入门学习相关推荐

  1. Vertx入门学习(含代码)

    Vertx入门学习 一.Vertx是什么? 二.Vertx基本概念 三.Vertx能干什么? 四.Vertx的技术体系 五.快速体验:搭建一个简单的Vertx项目并输出Hello World 六.单元 ...

  2. python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  3. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

  4. 3dmax Vray建筑可视化入门学习教程

    面向初学者的3Ds Max Vray最佳Archviz可视化课程 从安装到最终图像的一切都将从头开始教授,不需要任何经验 大小解压后:3.25G 时长4h 6m 1280X720 MP4 语言:英语+ ...

  5. Blender 3.0基础入门学习教程 Introduction to Blender 3.0

    成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...

  6. Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya

    准备好开始为游戏制作自己的角色动画了吗? 你会学到什么 了解Maya的界面 优化并准备好你的模型,为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼,以便在任何游戏引擎中制作动画 了解IK和F ...

  7. 三维地形制作软件 World Machine 基础入门学习教程

    <World Machine课程>涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形. 你会学到什么 为渲染或游戏开发创建高分辨率.高细节的地形. 基于Worl ...

  8. Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)

    要求 下载并安装Blender.免费下载和免费用于任何目的. 描述 加入我的动画课程. 在本课程中,我将从头开始讲述在Blender中创建动画场景的过程. 从第一步到最终渲染.在这个课程中,我们将使用 ...

  9. UE5真实环境设计入门学习教程

    大小解压后:4.69G 时长4h 30m 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 虚幻引擎5–面向初学者的真实环境设计 Unreal Engine 5 – Rea ...

最新文章

  1. diagram怎么记忆_UML20以上14图的解释、分类记忆方法及类之间6种关系
  2. Java架构师必备框架技能核心笔记,附相关架构及资料
  3. layou split 属性
  4. 教师资格证综合素质思维导图
  5. 阿里云因 bug 禁用内部 IP 导致链路不通,造成大规模故障
  6. 如何导出久其报表所有数据_久其报表软件基本操作流程..docx
  7. 618什么数码产品值得入手、好评超高的数码产品排行榜
  8. 视频教程-项目经理俱乐部-项目实战.职场求生.敏捷.企业管理-敏捷开发
  9. word设置页眉页码 首页没有页眉(终于搞懂了)
  10. 用 Python 实现词云可视化
  11. 大湾区国际创客峰会暨MFSZ2021重磅回归!
  12. 基于FME的地形图图面压盖检查工具的设计与制作
  13. 人工智能 —— 语义网络推理
  14. 计算机电缆能代替控制电缆吗,如何区分:计算机电缆与控制电缆!
  15. 野火指南者移植hal+rtthread+lvgl
  16. Tekton 与 Argo CD 结合实现 GitOps
  17. 无锡中软国际有限公司笔试题(Java)
  18. docker学习笔记(k8s云原生学习前瞻)
  19. Python对3D STEP/STP 文件解析
  20. 概率论与数理统计 第一周作业

热门文章

  1. QT实现简单的2d游戏地图编辑器
  2. 为啥我用navicat连接服务器数据库测试成功,但是打开失败
  3. 将 CARLA egg 文件安装到 Python 坏境
  4. matlab遗传算法工具箱源代码学习
  5. TOOM解析舆情监测系统的未来发展趋势与技术创新点
  6. goahead如何使用cgi服务_GoAhead Web Server的特性及技术
  7. 香港舞蹈家荣毅捷“回乡”办学记:民族的就是世界的
  8. delay函数(计算机器周期来判断延迟时间)
  9. 【Vue】Vue基础总结 思维导图
  10. AttributeSet自定义控件