Springboot 整合jwt

    这两天写了写登录的逻辑, 从刚开始用cookie, 到用jwt token, 到单点登录, 随着系统的不断升级, 所用技术也在随之改变升级.  其中也遇到了一些坑. jwt令牌 一直想着使用无状态, 后来发现并不能完全无状态, 无状态只是理想状态. 其中使用token 时, 有几个问题是比较重要的

    1.  token的安全性

    2.  token的长度

    3.  token失效问题

    4.  token 注销问题

  刚开始想着jwt 完全无状态, 搞着搞着还是用上redis了.  这样token 失效, token注销自然而然解决了.  token的安全性, 不将密码,手机号这些私密信息存放在token中即可

  JWT官网: https://jwt.io/
  JWT(Java版)的github地址:https://github.com/jwtk/jjwt

什么是JWT

Json Web Token(JWT):JSON网络令牌,是为了在网络应用环境间传递声明而制定的一种基于JSON的开放标准((RFC 7519)。JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式用于通信双方之间以 JSON 对象行使安全的传递信息。因为数字签名的存在,这些信息是可信的。

  广义上讲JWT是一个标准的名称;狭义上讲JWT指的就是用来传递的那个token字符串。
 

JWT的组成

  JWT含有三个部分:

  • 头部(header)
  • 载荷(payload)
  • 签证(signature)

  头部(header)
  头部一般有两部分信息:类型加密的算法(通常使用HMAC SHA256)
  头部一般使用base64加密:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
  解密后:

{
    "typ":"JWT", "alg":"HS256" } 

  载荷(payload)
  该部分一般存放一些有效的信息。JWT的标准定义包含五个字段:

  • iss:该JWT的签发者
  • sub:该JWT所面向的用户
  • aud:接收该JWT的一方
  • exp(expires):什么时候过期,这里是一个Unit的时间戳
  • iat(issued at):在什么时候签发的

  签证(signature)
  JWT最后一个部分。该部分是使用了HS256加密后的数据;包含三个部分:

  • header(base64后的)
  • payload(base64后的)
  • secret 私钥

  secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和JWT的验证,所以,它就是你服务端的秘钥,在任何场景都不应该流露出去。一旦客户端得知这个secret,那就意味着客户端可以自我签发JWT了。

JWT特点

  • 紧凑:意味着这个字符串很小,甚至可以放在URL参数,POST Parameter中以Http Header的方式传输。
  • 自包含:传输的字符串包含很多信息,别人拿到以后就不需要多次访问数据库获取信息,而且通过其中的信息就可以知道加密类型和方式(当然解密需要公钥和密钥)。

如何使用JWT?

  在身份鉴定的实现中,传统的方法是在服务端存储一个 session,给客户端返回一个 cookie,而使用JWT之后,当用户使用它的认证信息登录系统之后,会返回给用户一个JWT, 用户只需要本地保存该  token(通常使用localStorage,也可以使用cookie)即可。

  当用户希望访问一个受保护的路由或者资源的时候,通常应该在 Authorization 头部使用 Bearer 模式添加JWT,其内容格式:

Authorization: Bearer <token>

   因为用户的状态在服务端内容中是不存储的,所以这是一种无状态的认证机制。服务端的保护路由将会检查请求头 Authorization 中的JWT信息,如果合法,则允许用户的行为。由于JWT是 自包含的,因此,减少了需要查询数据库的需要。

JWT的这些特征使得我们可以完全依赖无状态的特性提供数据API服务。因为JWT并不使用Cookie的,所以你可以在任何域名提供你的API服务而不需要担心跨域资源共享问题(CORS)

  下面的序列图展示了该过程:

中文流程介绍:

  1. 用户使用账号和密码发出POST登录请求;
  2. 服务器使用私钥创建一个JWT;
  3. 服务器返回这个JWT给浏览器;
  4. 浏览器将该JWT串放在请求头中向服务器发送请求;
  5. 服务器验证该JWT;
  6. 返回响应的资源给浏览器。

说了这么多JWT到底如何应用到我们的项目中,下面我们就使用SpringBoot 结合 JWT完成用户的登录验证。

应用流程

  • 初次登录生成JWT流程图

     
  • 用户访问资源流程图

搭建SpringBoot + JWT工程

  pom 依赖    

       <dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.9.0</version>
	</dependency>         

  application.properties

##jwt配置
# 代表这个JWT的接收对象,存入audience
audience.clientId=
# 密钥, 经过Base64加密, 可自行替换
audience.base64Secret=
# JWT的签发主体,存入issuer
audience.name=
# 过期时间,时间戳
audience.expiresSecond=
源码下载地址:https://github.com/pyygithub/JWT-DEMO.git

猜你喜欢

转载自www.cnblogs.com/jingjiren/p/12709695.html