JTW官网:https://jwt.io/introduction/ 目录 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,作为 JSON 对象在各方之间安全的传递信息。这个信息可以通过数字签名进行验证并信任。JWTs 可以使用密钥(结合 HMAC 算法)或者 使用 RSA 、 ECDSA 加密的公钥私钥对进行签名。 JWT 包含三部分,之间以点(.)连接(头部.负载.签名) demo:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODk3NzI5OTgsInVzZXJuYW1lIjoiYWFhIn0.X_wNgENIpih0SAk2pirwmusp0i0dgEXrfmDVhh__L74 Header Header部分 是一个 JSON 对象,典型的header包含两部分: 用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第一部分 Payload Payload 部分也是 JSON 对象,用来存放数据。JWT 有7个官方字段: 除了官方设定的字段,自己也可以自定义字段, JWT 默认不加密,任何人都可以读取,所以不要把敏感信息存放在这个部分。 用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第二部分 Signature 使用 Header 指定的算法对 Header、Payload、密钥三部分进行签名,生成的字符串作为 JWT 的第三部分。 签名可以用来验证数据是否被篡改。 写一个代码示例,和shiro分离开,自己写一个登录验证。 使用swagger工具进行接口测试。 JWT依赖: swagger配置:将token验证放在header里 通过过滤器来过滤token是否正确。只过滤验证的接口,不过滤登录接口。 将token中的账号解析出来,与数据库比较,再将密码作为密钥进行解密验证。token验证不通过则拦截,我只做了简单处理,具体逻辑没有写。 controller层里两个接口:一个登录、一个验证。注意一定要给token一个有效时间,否则签发的token将一直存在。 登录测试:获得token 验证测试:正确情况 验证测试:错误情况 controller中有这么一行代码: 以它为起点来分析token是怎么生成的。 查看sign方法:进入到JWTCreator类 sign方法首先将签名的方法和jwt类型放入到了headerClaims中,然后我们看一下headerClaims这个参数。 内部静态类中有这两个map集合。headerClaims 用来存头部信息,payloadClaims 用来存负载信息。 JWTCreator类中withClaim是用于添加负载信息的。 JWT官方规定好的方法名和添加自定义的方法名不同。如到期时间: 还是这个方法sign(Algorithm algorithm),返回值构造了一个JWTCreator 该构造方法主要是将map集合转化成了字符串 构造完成后调用了一个无参的sign方法 该方法将头部和负载信息进行base64加密后以.隔开拼接成字符串,然后再将该字符串进行签名,将签名结果以同样的方式进行拼接,最后返回一个完整的token。
一、JWT基本介绍
1、什么是JWT
2、什么时候使用 JWT
3、JWT的结构
alg
:使用的签名算法,比如 HMAC SHA256 或 RSAtyp
:token的类型,比如 JWT
{ "alg": "HS256", "typ": "JWT" }
{ "sub": "1234567890", "name": "John Doe", "admin": true }
4、JWT 的特点
二、代码示例
<!--引入JWT依赖,由于是基于Java,所以需要的是java-jwt--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency>
@Configuration @EnableSwagger2 public class swaggerConfig { @Bean public Docket createRestApi() { ParameterBuilder tokenPar = new ParameterBuilder(); List<Parameter> pars = new ArrayList<Parameter>(); tokenPar.name("Authorization").description("Authorization") .modelRef(new ModelRef("string")).parameterType("header").required(false).build(); pars.add(tokenPar.build()); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("mptest.mybatistest")) .paths(PathSelectors.any()) .build().globalOperationParameters(pars) ; } @SuppressWarnings("deprecation") private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("个人测试") .description("个人测试用api") .termsOfServiceUrl("termsOfServiceUrl") .contact("测试") .version("1.0") .build(); } }
@WebFilter(filterName = "JWTFilter",urlPatterns = "/login/verity") public class JWTFilter implements Filter { @Autowired private UserDao userDao; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest request1=(HttpServletRequest) request; try{ String token = request1.getHeader("Authorization"); DecodedJWT jwt = JWT.decode(token); String username=jwt.getClaim("username").asString(); User user = userDao.selectOne(new QueryWrapper<User>().eq("username",username).last("limit 1")); JWTVerifier verifier= JWT.require(Algorithm.HMAC256(user.getPassword())).build(); jwt = verifier.verify(token); chain.doFilter(request, response); }catch (Exception e){ //之后修改的内容 HttpServletResponse httpServletResponse = (HttpServletResponse) response; String json="{"code":401,"message":"token验证失败"}"; httpServletResponse.setHeader("Content-type", "application/json;charset=UTF-8"); httpServletResponse.getWriter().write(json); return; } } @Override public void destroy() { } }
@RestController @RequestMapping("login") public class LoginController { //过期时间 private static long time=1000*60; //密钥 private static String secret="1234"; @Autowired private UserDao userDao; @PostMapping("/login") public String login(User user){ //指定签名算法,header部分 Algorithm algorithm=Algorithm.HMAC256(user.getPassword().getBytes(StandardCharsets.UTF_8)); //生成有效时间 Date expire=new Date(System.currentTimeMillis()+time); String token = JWT.create().withClaim("username",user.getUsername()).withExpiresAt(expire).sign(algorithm); System.out.println("token:"+token); return token; } @GetMapping("/verity") public String verity(){ String s = "验证成功"; return s; } }
三、源码分析
String token = JWT.create().withClaim("username",user.getUsername()).withExpiresAt(expire).sign(algorithm);
public String sign(Algorithm algorithm) throws IllegalArgumentException, JWTCreationException { if (algorithm == null) { throw new IllegalArgumentException("The Algorithm cannot be null."); } else { this.headerClaims.put("alg", algorithm.getName()); this.headerClaims.put("typ", "JWT"); String signingKeyId = algorithm.getSigningKeyId(); if (signingKeyId != null) { this.withKeyId(signingKeyId); } return (new JWTCreator(algorithm, this.headerClaims, this.payloadClaims)).sign(); } }
private final Map<String, Object> payloadClaims = new HashMap(); private Map<String, Object> headerClaims = new HashMap();
public JWTCreator.Builder withClaim(String name, String value) throws IllegalArgumentException { this.assertNonNull(name); this.addClaim(name, value); return this; }
public JWTCreator.Builder withExpiresAt(Date expiresAt) { this.addClaim("exp", expiresAt); return this; }
private JWTCreator(Algorithm algorithm, Map<String, Object> headerClaims, Map<String, Object> payloadClaims) throws JWTCreationException { this.algorithm = algorithm; try { ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(ClaimsHolder.class, new PayloadSerializer()); mapper.registerModule(module); mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); this.headerJson = mapper.writeValueAsString(headerClaims); this.payloadJson = mapper.writeValueAsString(new ClaimsHolder(payloadClaims)); } catch (JsonProcessingException var6) { throw new JWTCreationException("Some of the Claims couldn't be converted to a valid JSON format.", var6); } }
private String sign() throws SignatureGenerationException { String header = Base64.encodeBase64URLSafeString(this.headerJson.getBytes(StandardCharsets.UTF_8)); String payload = Base64.encodeBase64URLSafeString(this.payloadJson.getBytes(StandardCharsets.UTF_8)); String content = String.format("%s.%s", header, payload); byte[] signatureBytes = this.algorithm.sign(content.getBytes(StandardCharsets.UTF_8)); String signature = Base64.encodeBase64URLSafeString(signatureBytes); return String.format("%s.%s", content, signature); }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算