jwt 是什么 ?   json web token  的 简称,是一种无状态的 认证机制

原理:客户端 向服务器端请求一个 jwt 生成的 token ,这个token 带有 一些信息,下次 客户端请求 接口的时候带上这个 token,服务器端  检查这个 token,以此 判断用户的请求是否合法。所以 jwt是做认证的,不要理解成加密的了。

jwt生成的 token 组成:  头部.负载.签名

头部: 是 base64 编码的 包含有签名算法的 json 字符串

  比如  header 为 {"alg":"HS512"} 加密以后就是 eyJhbGciOiJIUzUxMiJ9

负载: 有承载的数据 和 时间的  json 字符串  被 base64 转码以后得到的 数据

  比如: playload 为  {"sub":"18508280881,100","exp":1532672451} 对应着 eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9

签名:签名是验证  jwt token 是否合法的  签名= 头指定的算法( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )

  secret   是 一个 只有服务器 知道的 秘钥;

上面的 完整token:eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9.sJaL2dpYAQdi3ZloDjIHzuIUetHEupMVD5dnnNjWdHFOrLZXgZi2C68FG1O5UGZ0_JMNW8rqYDECw9ligoc1RQ

secret 是:abc=

Java 代码例子如下

package com.sbl.pay.subaccount;

import java.util.Calendar;
import java.util.Date; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; /**
* jwt工具
* @author ZHANGYUKUN
*
*/
public class JWTUtil { public static void main(String[] args) {
String secretKey = "abc="; System.out.println( JWTUtil.createToken( "zyk" ,secretKey) );
System.out.println( JWTUtil.checkToken( secretKey , JWTUtil.createToken("zyk" ,secretKey) ) ); } /**
* 验证 token
* @param secretKey
* @param tokenValue
* @return 成功 返回 解密后的内容,否者抛出异常
*/
public static String checkToken(String secretKey,String tokenValue) {
Claims claims = Jwts.parser().setSigningKey( secretKey ).parseClaimsJws(tokenValue).getBody();
return claims.getSubject();
} /**
* 生成 token
* @param content 负载的内容
* @param secretKey 秘钥
* @return token
*/
public static String createToken(String content,String secretKey) {
JwtBuilder builder = Jwts.builder().setSubject( content );
String userToken = builder.signWith(SignatureAlgorithm.HS512, secretKey ).compact();
return userToken;
} /**
* 生成 token
* @param content 负载的内容
* @param secretey 秘钥
* @param expiresTime 过期时间(秒)
* @return token
*/
public static String createToken(String content,String secretKey,int expiresTime) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND , expiresTime ); JwtBuilder builder = Jwts.builder().setSubject( content ).setExpiration( calendar.getTime() );
String userToken = builder.signWith(SignatureAlgorithm.HS512, secretKey ).compact();
return userToken;
} }

  

结果

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI1OTA1MzZ9.ckV39Ev9_SQxwABeSfVfcuCndwEyOZUbkUXdPeZIjBVTo4UlSXYFamjmRqp8w7yDrJ_KDQrey4LshAMCy0MGlg
18508280881,100

  

总结 jwt的 用途是做认证,并且这种认证是无状态的和restful 天生一对, jwt 也有明显的缺点 如果 jwt 生成的 token被获取,那么 在token过期的这短时间内 可以一直被利用。 但是这个不是jwt 关心 的重点,可以通过 https 来保证数据传输的安全,可以通过 后端别的机制认证 token 是否过期(不仅仅依赖 token 里面 的 过期时间 )

采坑了:

如果验证在别人那里,被人给你的secretKey 是没有加密的。那么 你 用 base64转码以后再  生成token。 secretKey = Base64.getEncoder().encodeToString( secretKey.getBytes() ); 。否者这边对的,两边一对接就出错。

最新文章

  1. 利用Excel表格中的宏,轻松提取首字母
  2. HDU 1051 Wooden Sticks
  3. media
  4. SpringMVC请求处理流程
  5. Excel中的表单控件和active控件
  6. MVC3 IIS7部署记录
  7. 转:开源项目学习方法ABC
  8. JSP和JSTL
  9. ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
  10. OS X第三方类库管理工具cocoapods入门
  11. 机器学习KNN算法
  12. (转)IIS7无法读取配置文件解决办法
  13. javascript删除数组,索引出现问题解决办法。
  14. STL进阶--vector vs deque
  15. 13 款惊艳的 Node.js 框架——第1部分
  16. 使用ASP.NET读取word2003文档
  17. C语言 · 字符串编辑
  18. ElasticSearch概述及Linux下的单机ElasticSearch安装
  19. Maven 基础配置
  20. ySQL性能优化的21个最佳实践 和 mysql使用索引

热门文章

  1. UVA-1629 Cake slicing (DP、记忆化搜索)
  2. Erlang:Error in process ... with exit value
  3. 浅析postgresql数据库事务及行锁特征
  4. redis中的"HashMap"
  5. spring cloud学习(四) Fegin 的使用
  6. Spring Boot的SpringApplication类详解
  7. office每次打开都要重新配置
  8. bzoj1053&&51nod1060
  9. Android消息通信 第三方开源项目EventBus 的用法
  10. python学习:变量与字符串