带有入口 kubernetes 的 Spring Cloud oauth 2

Posted

技术标签:

【中文标题】带有入口 kubernetes 的 Spring Cloud oauth 2【英文标题】:Spring cloud oauth 2 with ingress kubernetes 【发布时间】:2020-01-21 05:05:15 【问题描述】:

是否可以使用带有 kubernetes api 网关入口的 spring cloud oauth 2 服务器。

我已经在 zuul 中使用它来在拨打电话之前对用户进行身份验证。我可以对入口做类似的事情吗?

编辑 1:

为了更清楚地解释它,我想要实现的目标

我正在使用 spring cloud 提供的基于令牌的 oAuth2 实现。

    oauth 作为 zuul 背后的服务之一运行。 zuul 为 oauth 服务器和资源服务器映射了路由 客户端通过zuul调用auth server并获取token。 客户端通过 zuul 调用资源服务器并传递令牌 zuul 配置为在调用资源服务器之前验证令牌。

通过这种方式,我们可以阻止任何下游流量在没有有效令牌的情况下通过。

我们可以在集群中运行身份验证服务器的入口中进行令牌验证吗?

【问题讨论】:

你找到解决办法了吗 【参考方案1】:

我没有使用 Spring Cloud OAuth 2,但由于 OAuth 是一个标准,我相信如果您使用 nginx Ingress 作为入口控制器,您可以设置它,您可以指定外部 Oauth Provider(因为 OAuth 通常具有相同的流程) 在你的入口处像这样:

...
metadata:
  name: application
  annotations:
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
...

您可以通过使用 GitHub 作为 OAuth 提供者的示例找到更多信息 here

【讨论】:

请参阅编辑 1 。我们能做到这一点吗? spring cloud auth 还提供 2 个 url:oauth/token 和 oauth/authorize oauth2 是一个开放标准,所以从技术上讲,我会说是的,你可以让它工作,所有注释的完整描述here 我可以在集群内有一个专门用于该服务的服务,作为 oauth 的节点端口公开,然后是一个入口或大使过滤器访问它吗?【参考方案2】:

目前有三种不同的 nginx-ingress-controllers (see here),它们的功能不同。我相信这些入口控制器本身都不能执行 oauth 令牌自省。但是,可以使用 auth_request 模块将请求路由到授权服务器的自省接口。

具体针对您的情况,您可以使用入口控制器中的 auth-url 注释 (see) 将请求定向到 spring cloud oauth2 服务器的自省接口 (see)。当使用 @EnableAuthorizationServer 时,默认情况下,自省接口在 /oaut/check_token 下可用。如果自省接口返回 2XX,则 ingress 将转发请求。此功能基于 auth_request 模块,如果允许访问,则需要来自外部服务的 2xx 响应代码,如果拒绝,则需要 401 或 403。

如果您使用 JWT 并希望仅通过检查签名来验证请求,则在某些情况下这实际上可以由入口本身完成。据我所知,只有 nginx 加入口控制器(付费)才能验证 JWT。但也有基于 nginx 的 kong-ingress 控制器,您可以配备 pulgins (see here)。有例如通过 oauth2 集成和 JWT 验证进行推广。

你发现的比我多吗?

【讨论】:

以上是关于带有入口 kubernetes 的 Spring Cloud oauth 2的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes nginx入口控制器不转发带有下划线的标头

带有 ALB 入口控制器的 Terraform AWS Kubernetes EKS 资源不会创建负载均衡器

如何在 GKE 中通过入口启用 Cors

部署 Rest + gRPC 服务器部署到带有入口的 k8s

Kubernetes 上的Spring

Spring Cloud Kubernetes 的负载均衡问题