봄 부팅 통합 알고리즘 JWT
JWT 알고리즘은 일반적으로 로그인 권한 부여 및 정보 교환에 사용됩니다. 여기에 프로젝트 상황과 함께 간단한 데모, 특정 사용을 할 수 있습니다.
A, .JWT 구조
바이 인기 검색어 JWT를 header.payload.signature
세 부분의 캐릭터 라인은, 그래서 여기가 짧은에 충분하다, 너무 많은 게시물이 하나의 온라인 프리젠 테이션이 있습니다.
1.1 헤더
header
사용함으로써 서명 알고리즘 과 토큰 조성물의 유형.
1.2 페이로드
payload
그는 당신의 requestBody에서 유사한 데이터에 퉁명스럽게 말했다.
1.3 서명
생성하려는 경우 signature
, 당신은 HMAC 필요한 키 암호화 알고리즘 비밀 JWT 사용자 지정 구성 항목을 사용해야합니다.
둘째, 사용
2.1 가이드 패키지
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
2.2 토큰 도구
토큰 구문 분석. 프로젝트에 직접라는 도구로 포장 된, 검증 토큰, 토큰을 만드는 작업이 포함됩니다.
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 测试JWT加密算法,并且解密
*/
public class JWTUtil {
private static final Logger logger = LoggerFactory.getLogger(JWTUtil.class);
/**
* 密钥
*/
private static final String SECRET = "my_secret_sdgdsgfdgkfgjrigfhpbg156456";
/**
* 过期时间
**/
private static final long EXPIRATION = 1800L;//单位为秒
/**
* 生成用户token,设置token超时时间
*/
public static String createToken(String userId, String userName) {
//过期时间
Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION * 1000);
Map<String, Object> map = new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");
String token = JWT.create()
.withHeader(map)// 添加头部
//可以将基本信息放到claims中,更具需要,可设置多个
.withClaim("id", userId)//userId
.withClaim("userName", userName)//userName
.withExpiresAt(expireDate) //超时设置,设置过期的日期
.withIssuedAt(new Date()) //签发时间
.sign(Algorithm.HMAC256(SECRET)); //SECRET加密
return token;
}
/**
* 校验token并解析token
*/
public static Map<String, Claim> verifyToken(String token) {
DecodedJWT jwt = null;
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
jwt = verifier.verify(token);//到这里能够解析出来,说明token是正确的。
}catch (JWTDecodeException e) {
// token错误
logger.error(e.getMessage());
}catch (TokenExpiredException e) {
// token过期
logger.error(e.getMessage());
}catch (Exception e) {
logger.error(e.getMessage());
logger.error("解码失败");
//解码异常则抛出异常
return null;
}
return jwt.getClaims();
}
//测试,并解密token中的内容
public static void main(String[] args) {
String token = createToken("11", "我的姓名");
Map<String, Claim> map = verifyToken(token);
Set<Map.Entry<String, Claim>> entrySet = map.entrySet();
for (Map.Entry<String, Claim> entry : entrySet) {
System.out.println(entry.getKey() + "=="+entry.getValue().asString());
}
}
}