天天看点

聊聊微服务认证之Oauth2的jwt

聊聊微服务认证之Oauth2的jwt

上篇文章我们讲了有状态的认证方式,我们每个资源服务器都需要到认证服务器进行认证,如果资源服务器很多的话,就会对认证服务器造成一定的压力,而jwt就能解决这个问题,我们使用有状态的认证方式生成的token是随机字符串,而使用jwt可以生成的token携带用户信息,这样资源服务器不用通过认证服务器,自己就可以解析认证,从而减小认证服务器的压力。

jwt三部分组成:头信息,负载和签名,头信息中保存着使用的算法,负载中存的是用户信息,签名是为了防止信息不篡改的。

资源服务器的jwt改造

把之前重写configure(ResourceServerSecurityConfigurer resources)请求认证服务器的逻辑改造为

resources.resourceId("xiepanpan").tokenStore(tokenStore()).stateless(true);
           

tokenStore()可以看下面的配置,和认证服务器的配置一样,stateless表示无状态,之前的逻辑变成了这么简单的一行

认证服务器的jwt改造

把之前重写的configure(AuthorizationServerEndpointsConfigurer endpoints)方法的tokenStore改为JwtTokenStore的实现

public TokenStore tokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }
           

同时我们设定jwt令牌转换器来生成jwt令牌

public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        jwtAccessTokenConverter.setSigningKey(sign_key);
        jwtAccessTokenConverter.setVerifier(new MacSigner(sign_key));
        return jwtAccessTokenConverter;
    }
           

分别是设置签名的key 验证的加密key

从上面的配置我们可以看出来,在认证服务器和资源服务器中都存了一份token信息,并且资源服务器不需要在取调用认证服务器进行认证了,而是自身验证

jWT的字段扩展

资源服务器

这里进行扩展认证,MyAccessTokenConverter继承DefaultAccessTokenConverter类重写extractAuthentication()方法进行扩展认证

@Override
    public OAuth2Authentication extractAuthentication(Map<String, ?> map) {
        OAuth2Authentication oAuth2Authentication = super.extractAuthentication(map);

        oAuth2Authentication.setDetails(map);

        return oAuth2Authentication;
     }
           

这里把map信息放入OAuth2Authentication中来进行认证处理

认证服务器

public Map<String, ?> convertUserAuthentication(Authentication authentication) {
        Map<String, Object> response = new LinkedHashMap();
        response.put("nickname", authentication);
        return response;
    }
           
jwtAccessTokenConverter.setAccessTokenConverter(MyAccessTokenConverter);
           

总结