下面不使用jwt的类库,而用一个程序来实现jwt,来加深对jwt的格式和生成的理解。
package jwt;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* 不使用jwt库的java实现jwt数据生成
*/
public class JwtJava {
private static final String MAC_INSTANCE_NAME = "HMacSHA256";
/**
* 生成jwt的签名部分
* @param secret
* @param message
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public static String Hmacsha256(String secret, String message) throws NoSuchAlgorithmException, InvalidKeyException {
Mac hmac_sha256 = Mac.getInstance(MAC_INSTANCE_NAME);
SecretKeySpec key = new SecretKeySpec(secret.getBytes(), MAC_INSTANCE_NAME);
hmac_sha256.init(key);
byte[] buff = hmac_sha256.doFinal(message.getBytes());
return Base64.encodeBase64URLSafeString(buff);
}
/**
* 模拟一个jwt的完成数据
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
*/
public static void testJWT() throws InvalidKeyException, NoSuchAlgorithmException {
//签名的key
String secret = "secret";
//header数据
String headerJson = "{\"type\":\"JWT\",\"alg\":\"HS256\"}";
//Payload(载荷)
String payloadJson = "{\"sub\":\"1234567890\", \"name\":\"John Doe\",\"admin\":true}";
String base64Header = Base64.encodeBase64URLSafeString(headerJson.getBytes());
String base64Claim = Base64.encodeBase64URLSafeString(payloadJson.getBytes());
String signature = Hmacsha256(secret, base64Header + "." + base64Claim);
String jwt = base64Header + "." + base64Claim + "." + signature;
System.out.println(jwt);
}
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
JwtJava.testJWT();
}
}