1.1为什么学习JWT(引入)
微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性
- 需要解决问题:服务与服务之间可以确定用户的登录状态,甚至可以确定登录用户信息。
- 解决方案:使用令牌
1.2 什么是JWT
JWT,全称是JSON Web Token,是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;官网:https://jwt.io
- Token需要加密,进行保护,采用RSA加密
1.3 使用RSA工具
- 生成公钥和私钥
1.3.1搭建环境
1)父项目(pom文件)
<jwt.jjwt.version>0.9.0</jwt.jjwt.version>
<jwt.joda.version>2.9.7</jwt.joda.version>
<beanutils.version>1.9.3</beanutils.version>
<!--jwt-->
<!--JavaBean工具类,用于JavaBean数据封装-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${beanutils.version}</version>
</dependency>
<!--jwt工具-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.jjwt.version}</version>
</dependency>
<!--joda 时间工具类 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jwt.joda.version}</version>
</dependency>
2)网关(pom文件)
<!--jwt-->
<!--JavaBean工具类,用于JavaBean数据封装-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<!--jwt工具-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<!--joda 时间工具类 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
1.3.2拷贝工具
1.3.3 测试
public class TestRSA {
private static final String pubKeyPath = "D:\\rsa\\rsa.pub";
private static final String priKeyPath = "D:\\rsa\\rsa.pri";
@Test
public void testGenerate() throws Exception {
RsaUtils.generateKey(pubKeyPath, priKeyPath, "1234");
}
@Test
public void testGet() throws Exception {
PublicKey publicKey = RsaUtils.getPublicKey(pubKeyPath);
System.out.println(publicKey);
PrivateKey privateKey = RsaUtils.getPrivateKey(priKeyPath);
System.out.println(privateKey);
}
}
1.4 使用JWT工具
- 生成Token
- 解析Token
public class TestJwt {
private static final String pubKeyPath = "D:\\rsa\\rsa.pub";
private static final String priKeyPath = "D:\\rsa\\rsa.pri";
@Test
public void testCreateToken() throws Exception {
//需要生成令牌的数据
User loginUser = new User();
loginUser.setUserName("jack");
loginUser.setPassword("6666");
loginUser.setGender(false);
//生成token:数据,过期时间,私钥
String token = JwtUtils.generateToken(loginUser, 1, RsaUtils.getPrivateKey(priKeyPath));
System.out.println(token);
}
@Test
public void testParseToken() throws Exception {
String token = "eyJhbGciOiJSUzI1NiJ9.eyJjbGFzcyI6ImNvbS5jenh5LmRvbWFpbi5Vc2VyIiwiZ2VuZGVyIjpmYWxzZSwicGFzc3dvcmQiOiI2NjY2IiwidXNlck5hbWUiOiJqYWNrIiwiZXhwIjoxNzAyNTQxNjcxfQ.YSZq8gE3Urx3CPXqT07FyzPgy8IEQWWVYWoNDRR42ed27IBaDWrIYZ4paJRefHL1eEy_7CPvlRhEJBzfBrihZ9hme2rEhZp8PSro8UuYTb6_73y3JWDlLvWE0wyosrh-69Y37jADB8xXN4s9i8BU7EQVDjNHhfKUu5b6vXfZQSg";
User loginUser = JwtUtils.getObjectFromToken(token, RsaUtils.getPublicKey(pubKeyPath), User.class);
System.out.println(loginUser);
}
}
1.5 配置yml
#自定义内容
sc:
jwt:
secret: sc@Login(Auth}*^31)&czxy% # 登录校验的密钥(自定义内容)
pubKeyPath: D:/rsa/rsa.pub # 公钥地址
priKeyPath: D:/rsa/rsa.pri # 私钥地址
expire: 360 # 过期时间,单位分钟