聊聊微服务认证之Oauth2的jwt

举报
周杰伦本人 发表于 2022/09/29 15:02:31 2022/09/29
【摘要】 聊聊微服务认证之Oauth2的jwt 资源服务器的jwt改造 认证服务器的jwt改造 jWT的字段扩展 资源服务器 认证服务器 总结 聊聊微服务认证之Oauth2的jwt上篇文章我们讲了有状态的认证方式,我们每个资源服务器都需要到认证服务器进行认证,如果资源服务器很多的话,就会对认证服务器造成一定的压力,而jwt就能解决这个问题,我们使用有状态的认证方式生成的token是随机字符串,而使用...

聊聊微服务认证之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的安全性也是另一方面的考量因素

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。