springboot2.0 快速集成JWT

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljk126wy/article/details/82751787

在这里我们来探讨一下如何学习一门新的技术,我个人总结为 RSA。1 R:read 去读官方文档 ,2 S:search 谷歌或百度先关技术文章或github 去搜索先关信息。3 A:ask:可以向技术大牛请教或和自己的同事同学进行探讨。

首先让我们JWT 官网一探究竟。https://jwt.io

自己英文不好 使用百度翻译内容如下:

JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间作为JSON对象安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名。

虽然JWTS可以加密,但也提供保密各方之间,我们将重点放在签名令牌。签名的令牌可以验证包含在其中的声明的完整性,而加密的令牌隐藏这些声明以防其他各方。当令牌使用公钥/私钥对签名时,签名也证明只有持有私钥的方才是签名的方。

接下来我们开始学习如果使用JWT

然后我们在看下吗介绍给的简单的例子

第一个步引入JWT 需要的依赖 到pom 中

好了这里关于官方文档查阅咱就讲到这里 具体细节请详细阅读官方的github 介绍和源码。

下面我测试代码

package com.ljk.springBootLearn.jwt;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JWTDemo {
	public String createToken() {
		
		try {
			String secret = "secret";//token 密钥
		    Algorithm algorithm = Algorithm.HMAC256("secret");
		    //头部信息
		    Map<String, Object> map = new HashMap<String, Object>();
		    map.put("alg", "HS256");
	        map.put("typ", "JWT");
	        
		    Date nowDate = new Date();
		    Date expireDate = getAfterDate(nowDate,0,0,0,2,0,0);//2小过期
	    
		    String token = JWT.create()
		    	/*设置头部信息 Header*/
		    	.withHeader(map)
		    	/*设置 载荷 Payload*/
		        .withIssuer("SERVICE")//签名是有谁生成 例如 服务器
		        .withSubject("this is test token")//签名的主题
		        //.withNotBefore(new Date())//定义在什么时间之前,该jwt都是不可用的.
		        .withAudience("APP")//签名的观众 也可以理解谁接受签名的
		        .withIssuedAt(nowDate) //生成签名的时间
		        .withExpiresAt(expireDate)//签名过期的时间
		        /*签名 Signature */
		        .sign(algorithm);
		    return token;
		} catch (JWTCreationException exception){
			exception.printStackTrace();
		}
		return null;
	}
	public String createTokenWithClaim() {
		
		try {
		    Algorithm algorithm = Algorithm.HMAC256("secret");
		    Map<String, Object> map = new HashMap<String, Object>();
		    Date nowDate = new Date();
		    Date expireDate = getAfterDate(nowDate,0,0,0,2,0,0);//2小过期
	        map.put("alg", "HS256");
	        map.put("typ", "JWT");
		    String token = JWT.create()
		    	/*设置头部信息 Header*/
		    	.withHeader(map)
		    	/*设置 载荷 Payload*/
		    	.withClaim("loginName", "lijunkui")
		        .withIssuer("SERVICE")//签名是有谁生成 例如 服务器
		        .withSubject("this is test token")//签名的主题
		        //.withNotBefore(new Date())//定义在什么时间之前,该jwt都是不可用的.
		        .withAudience("APP")//签名的观众 也可以理解谁接受签名的
		        .withIssuedAt(nowDate) //生成签名的时间
		        .withExpiresAt(expireDate)//签名过期的时间
		        /*签名 Signature */
		        .sign(algorithm);
		    return token;
		} catch (JWTCreationException exception){
			exception.printStackTrace();
		}
		return null;
	}
	  /**
		 * 返回一定时间后的日期
		 * @param date 开始计时的时间
		 * @param year 增加的年
		 * @param month 增加的月
		 * @param day 增加的日
		 * @param hour 增加的小时
		 * @param minute 增加的分钟
		 * @param second 增加的秒
		 * @return
		 */
		public  Date getAfterDate(Date date, int year, int month, int day, int hour, int minute, int second){
			if(date == null){
				date = new Date();
			}
			
			Calendar cal = new GregorianCalendar ();
			
			cal.setTime(date);
			if(year != 0){
				cal.add(Calendar.YEAR, year);
			}
			if(month != 0){
				cal.add(Calendar.MONTH, month);
			}
			if(day != 0){
				cal.add(Calendar.DATE, day);
			}
			if(hour != 0){
				cal.add(Calendar.HOUR_OF_DAY, hour);
			}
			if(minute != 0){
				cal.add(Calendar.MINUTE, minute);
			}
			if(second != 0){
				cal.add(Calendar.SECOND, second);
			}
			return cal.getTime();
		}
	public void verifyToken(String token) {
		try {
		    Algorithm algorithm = Algorithm.HMAC256("secret");
		    JWTVerifier verifier = JWT.require(algorithm)
		        .withIssuer("SERVICE")
		        .build(); //Reusable verifier instance
		    DecodedJWT jwt = verifier.verify(token);
		    String subject = jwt.getSubject();
		    Map<String, Claim> claims = jwt.getClaims();
		    Claim claim = claims.get("loginName");
		    System.out.println(claim.asString());
		    List<String> audience = jwt.getAudience();
		    System.out.println(subject);
		    System.out.println(audience.get(0));
		} catch (JWTVerificationException exception){
			exception.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		JWTDemo demo = new JWTDemo();
		//String createToken = demo.createToken();
		String createTokenWithClaim = demo.createTokenWithClaim();
		demo.verifyToken(createTokenWithClaim);
	}
}

参考文献:https://blog.csdn.net/achenyuan/article/details/80829401

猜你喜欢

转载自blog.csdn.net/ljk126wy/article/details/82751787