通过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