通过keytool生成jks文件:
运行下面的命令生成私钥,姓名国家啥的可以不填
keytool -genkey -alias ffzs-jwt -keyalg RSA -keysize 1024 -keystore ffzs-jwt.jks -validity 365 -keypass ffzs00 -storepass ffzs00
在上面的命令中,-alias选项为别名,-keypass和-storepass为密码选项,-validity为配置jks文件的过期时间(单位:天)。
获取的jks文件作为私钥,是如何解密JWT的呢?这时就需要使用jks文件的公钥。获取jks文件的公钥命令如下:
keytool -list -rfc --keystore ffzs-jwt.jks | openssl x509 -inform pem -pubkey
输入密码之后生成公钥可私钥
auth端修改:
这个不重要,我们将生成的ffzs-jwt.jks文件放到resources目录
修改jwtTokenEnhancer方法如下,通过jks文件获取公钥来生成token
@Bean
protected JwtAccessTokenConverter jwtTokenEnhancer() {
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("ffzs-jwt.jks"), "ffzs00".toCharArray());
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setKeyPair(keyStoreKeyFactory.getKeyPair("ffzs-jwt"));
return converter;
}
其中KeyStoreKeyFactory中的分别是jks文件,和密码
service端修改:
配置文件中添加获取token_key路径即可:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: http://localhost:8731/oauth/token_keys
并注释掉之前的tokenStore:
原理也很简单,之前是通过给定的singkey作为生成token和解码token的key,现在通过公钥来完成这个任务,所以还有另一中更改方法,就是把公钥放到一个文件中,或是直接放到service端的配置文件中获取,而不是通过远程获取:
测试
auth端
获取token正常:
获取token_key:
service端:
也可以正常获取
通过Gateway获取token:
auth,gateway,service都注册到consul上:
当Gateway中的locator开启以后,可以通过使用consul上注册服务名称为前缀进行路由:
http://localhost:8730/consul-auth/oauth/token_key 就是访问的 consul-auth 服务上的 /oauth/token_key:
测试一下获取token:
check_token, 获取到token解析后的详细内容:
refresh_token,token过期以后可以通过refresh_token获取新的token:
需要注意的是refresh_token,check_token需要携带登入信息才能访问,就是Authorization中设置的clientid和secret:
通过Gateway访问 service上的login,正常访问:
使用zipkin看一下链路情况,可见链路情况gateway->service->auth,当然一般不这么使用,直接使用gateway获取token缓存起来即可,这里只是想展示一下链路效果:
由于链路通过rabbitMQ连接,可见都已经连接上
来源:oschina
链接:https://my.oschina.net/u/4390465/blog/4306990