概述(什么是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,每次检验看有没有,若有,直接验证失败。
退出
定时器
小明菜市场
领取专属 10元无门槛券
私享最新 技术干货