基于Java驗證jwt token代碼實例
這篇文章主要介紹了基于Java驗證jwt token代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
How to load public certificate from pem file..?地址
1.HS256對稱加密
package jwt;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.Vector;
import java.util.Map;
import sun.misc.BASE64Decoder;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
public class JWTValidator {
private static String JWT_Type = "JWT";
protected boolean validated;
protected Object[] claims;
public JWTValidator() {
setValidated(false);
setClaims(null);
}
public String Generate(String secret, String issuer, String audience, String subject){
try {
Algorithm algorithm = Algorithm.HMAC256(secret); // HS256
String token = JWT.create()
.withIssuer(issuer)
.withAudience(audience)
.withSubject(subject)
.sign(algorithm);
System.out.println(token);
return token;
} catch (Exception exception){
//UTF-8 encoding not supported
return "";
}
}
public void Validate(String token, String secret, String issuer, String audience, String subject) {
DecodedJWT jwt = null;
setValidated(false);
if (token == null || secret == null || issuer == null || audience == null || subject == null)
return;
try {
jwt = JWT.require(Algorithm.HMAC256(secret.getBytes())).build().verify(token);
} catch (JWTVerificationException e) {
return;
}
if (jwt == null || jwt.getType() == null || !jwt.getType().contentEquals(JWT_Type))
return;
if (!jwt.getIssuer().contentEquals(issuer) ||
!jwt.getAudience().contains(audience) ||
!jwt.getSubject().contentEquals(subject))
return;
Date now = new Date();
if ((jwt.getNotBefore() != null && jwt.getNotBefore().after(now)) ||
(jwt.getExpiresAt() != null && jwt.getExpiresAt().before(now)))
return;
setValidated(true);
Map<String, Claim> claimsMap = jwt.getClaims();
Vector<Claim> claimsVector = new Vector<Claim>();
if (claimsMap != null) {
for (Map.Entry<String, Claim> entry : claimsMap.entrySet()) {
String key = entry.getKey();
if (key != null && !key.matches("aud|sub|iss|exp|iat")) {
//claimsVector.add(new Claim(key, entry.getValue().asString()));
}
}
}
setClaims(claimsVector.isEmpty() ? null : claimsVector.toArray());
}
public boolean isValidated() { return validated; }
public void setValidated(boolean val) { validated = val; }
public Object[] getClaims() { return claims; }
public void setClaims(Object[] val) { claims = (val == null ? new Object[0] : val); }
}
2.RS256不對稱加密,需要用public cert來驗證
package jwt;
import junit.framework.TestCase;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.lang.JoseException;
import sun.security.util.DerInputStream;
import sun.security.util.DerValue;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.util.UUID;
public class JWTValidatorForRSA extends TestCase{
public void testCreateToken() throws IOException {
System.out.println(createToken());
}
public void testVerifyToken() throws Exception {
String token = createToken();
System.out.println(token);
String pkeyPath = "D:\\temp\\idsrv4.crt";
JwtClaims jwtClaims = verifyToken(token,pkeyPath);
System.out.println(jwtClaims.getClaimValue("name"));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(jwtClaims.getIssuedAt().getValueInMillis()));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(jwtClaims.getExpirationTime().getValueInMillis()));
}
/**
* 生成jwt,SHA256加密
* @return
* @throws IOException
*/
public String createToken() throws IOException {
String privateKeyPath = "D:\\temp\\idsrv4.key";
PrivateKey privateKey = getPrivateKey(getStringFromFile(privateKeyPath));
final JwtClaims claims = new JwtClaims();
claims.setClaim("name", "jack");
claims.setSubject("a@a.com");
claims.setAudience("test");//用于驗證簽名是否合法,驗證方必須包含這些內(nèi)容才驗證通過
claims.setExpirationTimeMinutesInTheFuture(-1); // 60*24*30);
claims.setIssuedAtToNow();
// Generate the payload
final JsonWebSignature jws = new JsonWebSignature();
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
jws.setPayload(claims.toJson());
jws.setKeyIdHeaderValue(UUID.randomUUID().toString());
// Sign using the private key
jws.setKey(privateKey);
try {
return jws.getCompactSerialization();
} catch (JoseException e) {
return null;
}
}
/**
* 驗證jwt
* @param token
* @return
* @throws Exception
*/
public JwtClaims verifyToken(String token,String publicKeyPath) throws Exception {
try {
PublicKey publicKey = getPublicKey(publicKeyPath);
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setRequireExpirationTime()
.setVerificationKey(publicKey)
.setExpectedAudience("test")//用于驗證簽名是否合法,可以設置多個,且可設置必須存在項,如果jwt中不包含這些內(nèi)容則不通過
.build();
return jwtConsumer.processToClaims(token);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String getStringFromFile(String filePath) throws IOException {
// 生成方法:安裝openssl,執(zhí)行 openssl genrsa -out private.pem 2048
return IOUtils.toString(new FileInputStream(filePath));
}
/**
* 獲取PublicKey對象
* @param publicKeyBase64
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws CertificateException
* @throws FileNotFoundException
*/
private PublicKey getPublicKey(String publicKeyPath) throws NoSuchAlgorithmException, InvalidKeySpecException, CertificateException, FileNotFoundException {
/* Not work : data isn't an object ID (tag = 2)
String pem = publicKeyBase64
.replaceAll("\\-*BEGIN.*CERTIFICATE\\-*", "")
.replaceAll("\\-*END.*CERTIFICATE\\-*", "");
java.security.Security.addProvider(
new org.bouncycastle.jce.provider.BouncyCastleProvider()
);
System.out.println(pem);
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(pem));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
*/
CertificateFactory fact = CertificateFactory.getInstance("X.509");
FileInputStream is = new FileInputStream (publicKeyPath);
X509Certificate cer = (X509Certificate) fact.generateCertificate(is);
PublicKey publicKey = cer.getPublicKey();
System.out.println(publicKey);
return publicKey;
}
/**
* 獲取PrivateKey對象
* @param privateKeyBase64
* @return
*/
private PrivateKey getPrivateKey(String privateKeyBase64) {
String privKeyPEM = privateKeyBase64
.replaceAll("\\-*BEGIN.*KEY\\-*", "")
.replaceAll("\\-*END.*KEY\\-*", "");
// Base64 decode the data
byte[] encoded = Base64.decodeBase64(privKeyPEM);
try {
DerInputStream derReader = new DerInputStream(encoded);
DerValue[] seq = derReader.getSequence(0);
if (seq.length < 9) {
throw new GeneralSecurityException("Could not read private key");
}
// skip version seq[0];
BigInteger modulus = seq[1].getBigInteger();
BigInteger publicExp = seq[2].getBigInteger();
BigInteger privateExp = seq[3].getBigInteger();
BigInteger primeP = seq[4].getBigInteger();
BigInteger primeQ = seq[5].getBigInteger();
BigInteger expP = seq[6].getBigInteger();
BigInteger expQ = seq[7].getBigInteger();
BigInteger crtCoeff = seq[8].getBigInteger();
RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp,
primeP, primeQ, expP, expQ, crtCoeff);
KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePrivate(keySpec);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
上一篇:java實現(xiàn)液晶數(shù)字字體顯示當前時間
欄 目:Java
下一篇:Java實現(xiàn)動態(tài)數(shù)字時鐘
本文地址:http://www.jygsgssxh.com/a1/Java/8935.html
您可能感興趣的文章
- 01-10Java實現(xiàn)動態(tài)模擬時鐘
- 01-10利用Java實現(xiàn)復制Excel工作表功能
- 01-10JavaWeb實現(xiàn)郵件發(fā)送功能
- 01-10java基于poi導出excel透視表代碼實例
- 01-10Java實現(xiàn)動態(tài)數(shù)字時鐘
- 01-10java實現(xiàn)液晶數(shù)字字體顯示當前時間
- 01-10淺談Java中真的只有值傳遞么
- 01-10Java動態(tài)顯示當前日期和時間
- 01-10如何解決線程太多導致java socket連接池出現(xiàn)的問題
- 01-10java實現(xiàn)的順時針/逆時針打印矩陣操作示例


閱讀排行
本欄相關
- 01-10Java實現(xiàn)動態(tài)模擬時鐘
- 01-10Springboot中@Value的使用詳解
- 01-10JavaWeb實現(xiàn)郵件發(fā)送功能
- 01-10利用Java實現(xiàn)復制Excel工作表功能
- 01-10Java實現(xiàn)動態(tài)數(shù)字時鐘
- 01-10java基于poi導出excel透視表代碼實例
- 01-10java實現(xiàn)液晶數(shù)字字體顯示當前時間
- 01-10基于Java驗證jwt token代碼實例
- 01-10Java動態(tài)顯示當前日期和時間
- 01-10淺談Java中真的只有值傳遞么
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文


