• k8s 环境下,使用 jwk-set-uri 解决外部资源服务器公钥证书验证问题

    • 2023-04-24 15:01
    • 字数 372
    • 阅读 446

    在使用 Spring Authorization Server 搭建认证服务器时,一般会配置 issuer。如果认证服务使用 k8s 部署,第三方资源服务器(如开发测试环境)在 k8s 外部,则可以通过配置 jwk-set-uri 来解决外部资源服务器公钥证书验证问题。

    首先,认证服务器配置 AuthorizationServerSettings,指定 issuer ,代码如下:

        @Bean
        public AuthorizationServerSettings authorizationServerSettings() {
            return AuthorizationServerSettings.builder().issuer(issuer).build();
        }

    查看 AuthorizationServerSettings 默认配置信息为:

        public static Builder builder() {
            return (new Builder()).authorizationEndpoint("/oauth2/authorize").tokenEndpoint("/oauth2/token").jwkSetEndpoint("/oauth2/jwks").tokenRevocationEndpoint("/oauth2/revoke").tokenIntrospectionEndpoint("/oauth2/introspect").oidcClientRegistrationEndpoint("/connect/register").oidcUserInfoEndpoint("/userinfo");
        }

    在资源服务器,我们使用 spring.security.oauth2.resourceserver.jwt.issuer-uri 配置与认证服务器 issuer 一样即可,如:

    spring:
      security:
        oauth2:
          resourceserver:
            jwt:
              issuer-uri: http://localhost:9000

    使用 k8s 进行部署时,内部服务调用也可以直接使用服务名加端口方式,如:

    spring:
      security:
        oauth2:
          resourceserver:
            jwt:
              issuer-uri: http://auth-server:8080

    部署在 k8s 外部的资源服务启动时,调用部署在 k8s 内的认证服务进行 jwks 验证,如果 issuer 配置认证服务名,则导致外部资源服务器不能访问;如果 issuer 配置外部 ip 地址,则内部访问报如下错误:

    Unable to resolve the Configuration with the provided Issuer of xxx

    通过查阅相关文档,发现资源服务器增加 jwk-set-uri 配置即可,配置如下:

    spring:
        security:
          oauth2:
            resourceserver:
              jwt:
                issuer-uri: http://192.168.1.60
                jwk-set-uri: http://192.168.1.60/oauth2/jwks

    其中, 192.168.1.60 为认证服务器的真实 ip 地址。

back_to_top