天天看點

聊聊微服務認證之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);
           

總結