还不会Spring Boot集成JWT,你可能错过了大厂的Office了

概述(什么是JWT)

JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该标准定义了一种简单的,自包含的,用于通信双方以JSON对象的形式安全的传递信息。

请求流程

流程如下

用户使用账号和面发出 post 请求;

服务器使用私钥创建一个 jwt;

服务器返回这个 jwt 给浏览器;

浏览器将该 jwt 串在请求头中像服务器发送请求;

服务器验证该 jwt;

返回响应的资源给浏览器。

JWT 的主要应用场景

身份认证在这种场景下,一旦用户完成了登录,每个请求中都会包含jwt,都可以用来验证用户身份对路由,服务和资源的访问权限的验证。其中,由于增加了签名,可以确定信息没有经过伪造的。

好处

简单:直接放入header中发送。

自包含:包含了用户所需要的所有的信息。

任何web支持。

不需要保存任何会话信息。

结构

包含了三个部分

Header 头部  标题包含了令牌的元数据,并且包含签名和 / 或加密算法的类型

Payload 负载 类似于飞机上承载的物品

Signature 签名 / 签证

头部

JWT 的头部承载两部分信息:token 类型和采用的加密算法。

声明类型:这里是 jwt声明加密的算法:通常直接使用 HMAC SHA256

加密算法是单向函数散列算法,常见的有 MD5、SHA、HAMC。

Payload

载荷就是存放有效信息的地方。有效信息包含三个部分

标准中注册的声明

公共的声明

私有的声明

标准中注册的声明

iss: jwt 签发者sub: 面向的用户 (jwt 所面向的用户)aud: 接收 jwt 的一方exp: 过期时间戳 (jwt 的过期时间,这个过期时间必须要大于签发时间)nbf: 定义在什么时间之前,该 jwt 都是不可用的.iat: jwt 的签发时间jti: jwt 的唯一身份标识,主要用来作为一次性 token, 从而回避重放攻击。

公共的声明

公共声明可以添加任何信息,由于可以被解密,所以不建议添加敏感信息。一般添加用户的相关信息或其他业务需要的必要信息。

私有声明

私有声明是提供者和消费者共同定义的声明,一般不建议存放敏感信息。

Signature

jwt 的第三部分是一个签证信息,这个签证信息由三部分组成:header (base64 后的)payload (base64 后的)secret这个部分需要 base64 加密后的 header 和 base64 加密后的 payload 使用. 连接组成的字符串,然后通过 header 中声明的加密方式进行加盐 secret 组合加密,然后就构成了 jwt 的第三部分。密钥 secret 是保存在服务端的,服务端会根据这个密钥进行生成 token 和进行验证,所以需要保护好。

集成

maven

定义注解

需要登录并且具有角色才能才能进行操作的注解 LoginRequired

简单自定义一个实体类 User, 使用 lombok 简化实体类的编写

需要写 token 的生成方法

验证jwt

这里配置拦截器验证jwt流程

从 http 请求头中取出 token,

判断是否映射到方法

检查是否有 passtoken 注释,有则跳过认证

检查有没有需要用户登录的注解,有则需要取出并验证

认证通过则可以访问,不通过会报相关错误信息

配置拦截器

在配置类上添加了注解 @Configuration,标明了该类是一个配置类并且会将该类作为一个 SpringBean 添加到 IOC 容器内

在数据访问接口中加入登录操作注解

注销登录

保存每次生成的token,用定时器扫描过期token,每次检验看有没有,若有,直接验证失败。

退出

定时器

小明菜市场

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200905A01D2I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券