文章目录
前言
本文主要记录由SpringCloud Zuul1.0对接Oauth 2.0服务做API鉴权,转型为由Istio IngressGateway实现。主要利用Istio的RequestAuthentication, AuthorizationPolicy以及EnvoyFilter等功能实现。由于官方示例未能生效,亦尚未深入探究,故以文字记录主要实现步骤,以备参考(所有域名设置为demo.com)。
一、前置条件
本文基于Istio 1.6.8,kubernetes 1.5.6, 有关Istio的安装配置,请参考 文章Istio学习笔记:Istio及Kiali的安装与配置 或Istio 官方文档。OAuth2.0授权服务器需要实现非对称加密。授权实现主要参考文档Istio Doc v1.6中的Task->Security->Authorizatoin.
二、实现步骤
1. 基于JWT访问授权
a. Jwks配置
主要配置如下(其他略去),注意配置iss和sub。
@GetMapping("/.well-known/jwks.json")
public Map<String, Object> keys() {
return this.jwkSet.toJSONObject();
}
@Bean
public JWKSet jwkSet() {
if (keyType.equals("RSA")) {
KeyStoreKeyFactoryUtil keyStoreKeyFactory =
new KeyStoreKeyFactoryUtil(privateKey, keyPwd.toCharArray());
RSAKey.Builder builder = new RSAKey.Builder((RSAPublicKey)keyStoreKeyFactory.getKeyPair(keyPair).getPublic())
.keyUse(KeyUse.SIGNATURE)
.algorithm(JWSAlgorithm.RS256)
.keyID("bael-key-id");
return new JWKSet(builder.build());
}else{
return null;
}
}
@Bean
public TokenEnhancer tokenEnhancer(final DataSource dataSource) {
return (accessToken, authentication) -> {
JdbcClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);
clientDetailsService.setSelectClientDetailsSql(SecurityConstants.DEFAULT_SELECT_STATEMENT);
clientDetailsService.setFindClientDetailsSql(SecurityConstants.DEFAULT_FIND_STATEMENT);
Map<String, Object> retMap = new HashMap<String, Object>();
String clientId = authentication.getOAuth2Request().getClientId();
String changeToken = authentication.getOAuth2Request()<