官方网址 https://jwt.io/ (查看RFC 7519建议直接谷歌浏览器翻译中文阅读)
个人觉得比较好的参考 https://www.jianshu.com/p/e9639f386568
本章只简述JWT基本操作 , 后续总结其余所涉技术 [网关Zuul 、Spring Security 、Oauth2 、redis、cookie…]
可以关注完结篇
JSON Web令牌是一种开放的行业标准 RFC 7519方法,用于在双方之间安全地表示声明(JWT将一组声明表示为JSON对象),并且声明被加密 .
JWT令牌由三部分组成[头.负载.签名] , 使用 (.) 分割 , 官网首页提供demo
{
"alg": "HS256", // 哈希算法
"typ": "JWT" // 类型
}
// 头 使用Base64Url编码
{
"sub": "1234567890", // (Subject) Claim
"name": "John Doe", // 自定义信息
"iat": 1516239022 // (JWT ID) Claim
}
// 负载,提供自定义字段,可解码还原 使用Base64Url编码
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
// 签名,防止JWT篡改
// secret-签名所使用的密钥
1、生成密钥证书
// cmd输入下面命令生成密钥证书(公钥+私钥)
keytool -genkeypair -alias xzkey -keyalg RSA -keypass xuezhu -keystore xz.keystore -storepass xuezhukeystore
/**
Keytool 是一个java提供的证书管理工具
-alias:密钥的别名
-keyalg:使用的hash算法
-keypass:密钥的访问密码
-keystore:密钥库文件名,xz.keystore保存了生成的证书
-storepass:密钥库的访问密码,可以和-keypass设置一样
*/
/**
查看证书:keytool -list -keystore xz.keystore
删除别名:keytool -delete -alias xzkey -keystore xz.keystore
*/
2、导出公钥
使用openssl(加解密工具包)来导出公钥信息
安装地址http://slproweb.com/products/Win32OpenSSL.html
将openssl配置到环境变量path中 , 在xz.keystore所在目录cmd执行下面命令:
keytool -list -rfc --keystore xz.keystore | openssl x509 -inform pem -pubkey
然后输入密钥库口令即可拿到
-----BEGIN PUBLIC KEY-----
.....
-----END PUBLIC KEY-----
//这一段就是公钥内容,copy到文本文件中,合并一行保存
使用org.springframework.security.jwt.*提供的api
>
>org.springframework.cloud >
>spring-cloud-starter-security >
>
>
>org.springframework.cloud >
>spring-cloud-starter-oauth2 >
>
package com.xuezhu.auth;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.RsaSigner;
import org.springframework.security.jwt.crypto.sign.RsaVerifier;
import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;
import org.springframework.test.context.junit4.SpringRunner;
import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestJwt {
//测试创建jwt令牌
@Test
public void testCreateJwt(){
//密钥库文件
String keystore = "xz.keystore";
//密钥库的密码
String keystore_password = "xuezhukeystore";
//密钥库文件路径
ClassPathResource classPathResource = new ClassPathResource(keystore);
//密钥别名
String alias = "xzkey";
//密钥的访问密码
String key_password = "xuezhu";
//密钥工厂
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(classPathResource,keystore_password.toCharArray());
//密钥对(公钥和私钥)
KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, key_password.toCharArray());
//获取私钥
RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();
//jwt令牌的内容
Map<String,String> body = new HashMap<>();
body.put("name","weizhuang");
String bodyStr = JSON.toJSONString(body);
//生成jwt令牌
Jwt jwt = JwtHelper.encode(bodyStr, new RsaSigner(aPrivate));
//生成jwt令牌编码
String encoded = jwt.getEncoded();
System.out.println(encoded);
}
//校验jwt令牌
@Test
public void testVerify(){
//公钥
String publickey = "-----BEGIN PUBLIC KEY-----aaaaa-----END PUBLIC KEY-----";
//jwt令牌
String jwtString = "encoded";
//校验jwt令牌
Jwt jwt = JwtHelper.decodeAndVerify(jwtString, new RsaVerifier(publickey));
//拿到jwt令牌中自定义的内容
String claims = jwt.getClaims();
System.out.println(claims);
}
}