聊聊微服务认证之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中来进行认证处理

认证服务器

MyAccessTokenConverter继承DefaultAccessTokenConverter类重写convertUserAuthentication()方法

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

nickname为扩展字段,然后把这个类添设置到jwtAccessTokenConverter中:

jwtAccessTokenConverter.setAccessTokenConverter(MyAccessTokenConverter);

总结

这篇文章我们讲了基于oauth2的jwt的配置和扩展配置的功能,jwt减轻了认证服务器的负担,让资源服务器本身存储token信息,而字符服务器就可以进行校验token信息是否被篡改,无需远程请求认证服务器,对于jwt的使用,我感觉用的公司还是比较少,因为一般的公司还涉及不到认证服务器压力很大的情况,另外jwt的安全性也是另一方面的考量因素

java 服务器 yacc

版权声明:本文为博主 [周杰伦本人] 原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.51cto.com/u_15460453/5669490

评论已关闭