这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战。
在上一篇文章中我们已经搭建了授权中心微服务,填充了数据库数据表及dao接口等,这篇文章将介绍一下生成RSA256公钥和私钥对及之后鉴权授权所需的vo对象。之所以要生成公钥和私钥对是因为在使用JWT做信息传输的时候,需要对JWT中的Payload做信息加密,信息加密使用的是RSA256这样一个非对称加密算法,通常会使用私钥加密,公钥解密这样一个过程,所以我们需要使用到公钥和私钥。
RSA256公钥和私钥对及之后鉴权授权所需的vo对象
1、生成RSA256公钥和私钥对
我们只需要一次性生成,然后保存下来之后加密解密中使用即可,所以我们直接写一个测试类来生成我们的公钥和私钥对,代码如下:
2、配置私钥及一些常量
在授权中心微服务下创建一个constant包,在包里创建一个AuthorityConstant类,用来存储私钥和一些其他的常量信息。定义一个常量用来存储私钥,一个常量用来定义默认的Token(JWT)超时时间。私钥除了授权中心不要暴露给其他任何客户端。
3、配置公钥及一些常量
之前文章有介绍过鉴权授权中心的功能设计,有提到为什么不将鉴权也一并放到授权中心微服务里去,而是单独提取成一个类似工具类的来实现,所以我们的公钥就需要保存到一个公用的地方。
公钥存储到通用模块下,所有的模块都可以访问到,使他们都能实现对数据的解密。同样在通用模块下创建一个constant包,创建CommonConstant类,定义一个常量用来存储公钥。
之前有介绍过,JWT中的Payload存储的用户信息其实都是key-value字符串,所以我们定义一个常量用来标识JWT中存储用户信息的key。
定义一个常量用来存储授权中心的serviceId,用来之后我们通过NacosService来查找对应授权中心的Ip和端口号,以便之后调用授权中心的一些功能。serviceId可以从授权中心模块的bootstrap.yml文件中,spring.application.name就是对应的serviceId。
4、定义一些授权鉴权相关的值对象
将来用于授权和用户登录注册信息传递,我们同样定义在common模块中,因为它们在各个微服务的应用都是通用的。
在vo包下定义如下几个类:
1)用户名和密码(UsernameAndPassword)
包含用户名和密码两个属性。
2)JWT的字符串信息(JwtToken)
只存储授权中心鉴权后给客户端的Token,之所以要将这一个字符串也定义成一个类是为了方便将来的扩展。假如只有一个字符串,将来如果需要加上额外的信息比如生成JWT的用户是谁,创建的时间是什么时候,那我们就没办法去保存了,但是如果有这样一个类就可以加上一些额外的属性去表示。
3)已登录用户信息(LoginUserInfo)
包含用户id和用户名两个属性,通过解析JWTToken中的Payload,拿到用户id和用户名存储起来,方便微服务去访问使用。虽然用户名和用户id都是唯一标识,但是我们不仅仅存储用户名或用户id中的一个,之所以做这样的冗余设计是为了方便之后的使用,比如日志之类的功能可能我们只需要获取用户名,却还需要通过id去数据库里查找,使用起来很不方便,这也是一种设计模式。