基于SpringBoot的 JSON Web Token(JWT)Token认证机制实现

Token Auth的优点

  1. JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
  2. 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输.
  3. 无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息.
  4. 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可.
  5. CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
  6. 不需要为登录页面做特殊处理: 如果你使用Protractor 做功能测试的时候,不再需要为登录页面做特殊处理.
  7. 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)
    更适用CDN: 可以通过内容分发网络请求你服务端的所有资料(如:javascript,HTML,图片等),而你的服务端只要提供API即可.
  8. 移动应用: 当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制更合适。

JWT 基本规格。

JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名组成。
其实际的载荷(载荷(Payload))

jwt格式:jwtHeader.jwtPayLoad.Signature
头部(header). 载荷(payload). 签证(signature)

将对象编码得到:Header 头信息

	# 头里面放加密算法 及签名信息
	{
    
    
    "type": "JWT",
    "alg": "BASE64"
	}

编码字符串:
eyJ0eXBlIjoiSldUIiwiYWxnIjoiQkFTRTY0In0=


Map<String,String> header = new HashMap<String, String>();
        header.put("type","JWT");
        header.put("alg","BASE64");
        String jsonString = JSON.toJSONString(header);
        System.out.println(jsonString);

        BASE64Encoder base64Encoder = new BASE64Encoder();
        String encode = base64Encoder.encode(jsonString.getBytes("UTF-8"));
        System.out.println(encode);

        BASE64Decoder base64Decoder =  new BASE64Decoder();
        byte[] bytes = base64Decoder.decodeBuffer(encode);
        System.out.println(new String(bytes,"UTF-8" ));

在这里插入图片描述


jwtPayLoad:

{
    
     
  "iss": "springboot", #该JWT 的签发者,可填/不填
  "iat": d, # 签发时间 可填/不填
  "exp": 5s, # token 过期时间。uninx 时间戳 可填/不填
  "aud": "www.baidu.com", # 接受 jwt方 可填/不填
  "sub": "www.baidu.com" # 面向的用户 可填/不填
}

加密解密:

Map<String,String> payLoadMap =  new HashMap<>();
        payLoadMap.put("iss","springboot");
        payLoadMap.put("iat","1234567");
        payLoadMap.put("exp","100s");
        payLoadMap.put("aud","ww.baidu.com");
        payLoadMap.put("sub","ww.baidu.com");
        String toString = JSON.toJSONString(payLoadMap);
        System.out.println(toString);
        HmacCore.HmacSHA256 hmacSHA256 = new HmacCore.HmacSHA256();

        String encode1 = base64Encoder.encode(toString.getBytes("UTF-8"));
        System.out.println(encode1);

        System.out.println(new String(base64Decoder.decodeBuffer(encode1),"UTF-8"));

利用JDK 自带的BASE64Encoder 和 BASE64Decoder,方便的完成基于 BASE64 的编码和解码

eyJhdWQiOiJ3dy5iYWlkdS5jb20iLCJzdWIiOiJ3dy5iYWlkdS5jb20iLCJpc3MiOiJzcHJpbmdi
b290IiwiZXhwIjoiMTAwcyIsImlhdCI6IjEyMzQ1NjcifQ==

这个是payLoad的部分内容, jwt格式:jwtHeader.jwtPayLoad.Signature

对获取的头信息用(.)拼接,再用HS256 加密

eyJ0eXBlIjoiSldUIiwiYWxnIjoiQkFTRTY0In0=.eyJhdWQiOiJ3dy5iYWlkdS5jb20iLCJzdWIiOiJ3dy5iYWlkdS5jb20iLCJpc3MiOiJzcHJpbmdib290IiwiZXhwIjoiMTAwcyIsImlhdCI6IjEyMzQ1NjcifQ==

加密:

在这里插入代码片

猜你喜欢

转载自blog.csdn.net/qq_16183731/article/details/100626189