基于Java验证jwt牌代码实例

  

这篇文章主要介绍了基于Java验证jwt牌代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  

如何从pem文件加载公共证书。& # 63;地址

  

<强> 1. hs256对称加密

        包jwt;      进口java.io.FileInputStream;   进口java.io.IOException;   进口java.security.KeyFactory;   进口java.security.PrivateKey;   进口java.security.PublicKey;   进口java.security.interfaces.RSAPrivateKey;   进口java.security.interfaces.RSAPublicKey;   进口java.security.spec.PKCS8EncodedKeySpec;   进口java.security.spec.X509EncodedKeySpec;   进口java.util.Base64;   进口java.util.Date;   进口java.util.Vector;   进口java.util.Map;      进口sun.misc.BASE64Decoder;      进口com.auth0.jwt.JWT;   进口com.auth0.jwt.algorithms.Algorithm;   进口com.auth0.jwt.exceptions.JWTVerificationException;   进口com.auth0.jwt.interfaces.Claim;   进口com.auth0.jwt.interfaces.DecodedJWT;         公开课JWTValidator {   私有静态字符串JWT_Type=" JWT”;      保护逻辑验证;   保护对象[]索赔;      公共JWTValidator () {   setValidated(假);   setClaims(空);   }   发行人公共字符串生成(String秘密,字符串,字符串,字符串对象){   尝试{   算法算法=Algorithm.HMAC256(秘密);//HS256   字符串标记=JWT.create ()   .withIssuer(发行人)   .withAudience(观众)   .withSubject(主题)   .sign(算法);   System.out.println(令牌);   返回标记;   }捕捉(异常例外){//不支持utf - 8编码   返回";   }   }         公共空间验证(发行人字符串标记,字符串的秘密,字符串,字符串的观众,字符串对象){   DecodedJWT jwt=零;   setValidated(假);      如果(令牌==null | |秘密==null | |发行人==null | |观众==null | |主题==null)   返回;      尝试{   jwt=JWT.require (Algorithm.HMAC256 (secret.getBytes ())) .build () .verify(令牌);   }捕捉(JWTVerificationException e) {   返回;   }      如果(jwt==null | | jwt.getType ()==null | | ! jwt.getType () .contentEquals (JWT_Type))   返回;      如果(! jwt.getIssuer () .contentEquals(发行人)| |   ! jwt.getAudience () .contains(观众)| |   ! jwt.getSubject () .contentEquals(主题)   返回;      日期现在=新的日期();      如果(jwt.getNotBefore() !=零,,现在jwt.getNotBefore()后())| |   (jwt.getExpiresAt() !=零,,.before jwt.getExpiresAt () ()))   返回;      setValidated(真正的);      Claim> Map<字符串;claimsMap=jwt.getClaims ();   VectorclaimsVector=new Vector ();      如果(claimsMap !=null) {   (Map.Entry<字符串,Claim>条目:claimsMap.entrySet ()) {   字符串键=entry.getKey ();   如果(钥匙!=零,,! key.matches (“aud |子| iss | exp | iat”)) {//claimsVector。添加(新索赔(关键,entry.getValue () .asString ()));   }   }   }      setClaims (claimsVector.isEmpty () & # 63;空:claimsVector.toArray ());   }      公共布尔isValidated(){返回验证;}   公共空间setValidated(布尔val){验证=val;}      公共对象[]getClaims(){返回索赔;}   公共空间setClaims (Object [] val){声称=(val==null & # 63;新对象[0]:val);}   }      

<强> 2。RS256不对称加密,需要用公共证书来验证

        包jwt;      进口junit.framework.TestCase;   进口org.apache.commons.codec.binary.Base64;   进口org.apache.commons.io.IOUtils;   进口org.jose4j.jws.AlgorithmIdentifiers;   进口org.jose4j.jws.JsonWebSignature;   进口org.jose4j.jwt.JwtClaims;   进口org.jose4j.jwt.consumer.JwtConsumer;   进口org.jose4j.jwt.consumer.JwtConsumerBuilder;   进口org.jose4j.lang.JoseException;   进口sun.security.util.DerInputStream;   进口sun.security.util.DerValue;      进口java.io.ByteArrayInputStream;   进口java.io.FileInputStream;   进口java.io.FileNotFoundException;   进口java.io.IOException;   进口java.math.BigInteger;   进口java.security。*;   进口java.security.cert.CertificateException;   进口java.security.cert.CertificateFactory;   进口java.security.cert.X509Certificate;   进口java.security.spec.InvalidKeySpecException;   进口java.security.spec.RSAPrivateCrtKeySpec;   进口java.security.spec.X509EncodedKeySpec;   进口java.text.SimpleDateFormat;   进口java.util.UUID;      公开课JWTValidatorForRSA扩展TestCase {      公共空间testCreateToken()抛出IOException {   System.out.println (createToken ());   }      公共空间testVerifyToken()抛出异常{   字符串标记=createToken ();   System.out.println(令牌);      字符串pkeyPath=" D: \ \ temp \ \ idsrv4.crt”;   JwtClaims JwtClaims=verifyToken(令牌,pkeyPath);   System.out.println (jwtClaims.getClaimValue("名称"));   system . out。println(新SimpleDateFormat (yyyy-MM-dd HH: mm: ss) .format (jwtClaims.getIssuedAt () .getValueInMillis ()));   system . out。println(新SimpleDateFormat (yyyy-MM-dd HH: mm: ss) .format (jwtClaims.getExpirationTime () .getValueInMillis ()));   }/* *   *生成jwt, SHA256加密   * @return   * @throws IOException   */公共字符串createToken()抛出IOException {   字符串privateKeyPath=" D: \ \ temp \ \ idsrv4.key”;   PrivateKey PrivateKey=getPrivateKey (getStringFromFile (privateKeyPath));   最后JwtClaims声称=new JwtClaims ();   索赔。setClaim(“名字”,“杰克”);   claims.setSubject (“a@a.com”);   claims.setAudience("测试");//用于验证签名是否合法,验证方必须包含这些内容才验证通过   claims.setExpirationTimeMinutesInTheFuture (1);//60 * 24 * 30);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

基于Java验证jwt牌代码实例