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