Istio学习笔记:IngressGateway实现基于OAuth2.0+JWT的API鉴权


前言

本文主要记录由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().getRequestParameters
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值