1.jwt简介
jwt是一种跨域认证技术,主要用于分布式,微服务架构下,单点认证后全服务都能识别用户信息。还可以通过JWT进行信息交换,但是尽量不要放敏感信息以及尽量通过https传输保证通道安全。
例如我们用jwt做登入认证,可以在用户进行验证登入成功后生成一个jwt返回在前端保存(服务器端可保存也可不保存),然后前端带着它可以进行跨域跨系统传输,就可以避免重复登入校验。
2.组成部分
jwt加密串由三部分组成分别为头部(header),载体(playload),签名(sign)。中间用.隔开。如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMCIsImV4cCI6MTYzNTgyNzExNywidXNlcm5hbWUiOiJsaWxpIn0.O0DolSYkEX0Q0L7UQOR2-jp7I1-p8r1a1Vath17A-Dw
3.使用示例
import java.util.Date;
import org.userMgs5002.Dao.SysUser;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
public class TokenUtil {
private static final long EXPIRE_TIME=60*1000; //设置jwt过期时间
private static final String TOKEN_SECRET="token123"; //加密密匙
//测试main方法
public static void main(String[] args) {
SysUser s = new SysUser();
s.setUserName("lili");
String token = sign(s);
System.out.println(token);
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(verify(token));
}
/**
* jwt签名生成
* @param
* @return
*/
public static String sign(SysUser user){
String token = null;
try {
Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME); //设置过去时间
token = JWT.create()
.withIssuer("auth0") //jwt签发者签名
.withClaim("username", user.getUserName()) //传输参数 这里指用户名
.withClaim("password", "123456") //传输参数 这里指密码
.withExpiresAt(expiresAt)
// 使用了HMAC256加密算法。
.sign(Algorithm.HMAC256(TOKEN_SECRET)); //密匙加盐
} catch (Exception e){
e.printStackTrace();
}
return token;
}
/**
* 签名验证以及解析
* @param token
* @return
*/
public static boolean verify(String token){
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
DecodedJWT jwt = verifier.verify(token);
System.out.println("认证通过:");
System.out.println("issuer: " + jwt.getIssuer());
System.out.println("username: " + jwt.getClaim("username").asString());
System.out.println("过期时间: " + jwt.getExpiresAt());
return true;
}catch (TokenExpiredException e){
return false;
}
catch (IllegalArgumentException e) {
return false;
} catch (JWTVerificationException e) {
return false;
}
}
}